From ebcd7391377d0e5748e887bf19aa5734b5ea3dc2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Mar 2024 16:18:29 +0000 Subject: [PATCH] Rebuild pages at c0026696d6ef3959f84e099f9ca90a1091cff3eb --- .../authorship.json | 2 +- AY2324S2-CS2103-F09-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103-F09-2_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T09-4_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T13-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T15-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-T16-3_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W10-4_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W12-1_tp_master/commits.json | 2 +- .../authorship.json | 2 +- AY2324S2-CS2103T-W13-3_tp_master/commits.json | 2 +- archive.zip | Bin 1205163 -> 1222098 bytes reposense-logs/reposense.log.0 | 2634 ++++++++--------- summary.json | 2 +- 21 files changed, 1336 insertions(+), 1336 deletions(-) diff --git a/AY2324S2-CS2103-F09-1_tp_master/authorship.json b/AY2324S2-CS2103-F09-1_tp_master/authorship.json index 25740802..cfa62f3a 100644 --- a/AY2324S2-CS2103-F09-1_tp_master/authorship.json +++ b/AY2324S2-CS2103-F09-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"felixchanyy"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp/graph/badge.svg?token\u003dNB86I9H23Z)](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp)","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"## About the app","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"felixchanyy"},"content":"EstateEase simplifies residential property management for real estate listing agents in Singapore.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"felixchanyy"},"content":"### Key Features:","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"felixchanyy"},"content":" * With intuitive tools for listing and client communication, the app is tailored for efficiency. ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"felixchanyy"},"content":" * Agents can quickly access contacts and prioritize them, ensuring swift connections with clients. ","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"felixchanyy"},"content":"### Example Usages:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to add and delete client information.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to prioritize client contacts for efficient communication","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to load and save the list using JSON file","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"This project is based on the AddressBook-Level3 project created by the ","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":17,"-":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":"felixchanyy"},"content":"You can reach us at the email `felixchanyy.22@u.nus.edu`","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"### Felix Chan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/felixchanyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"[[homepage](https://nus-cs2103-ay2324s2.github.io/website)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"[[github](https://github.com/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"felixchanyy"},"content":"* Role: Team Lead, Scheduling and Tracking, Git Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for overall project coordination, in charge of defining, assigning, and tracking ","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"felixchanyy"},"content":"project tasks, helps other team members with matters related to Git","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"felixchanyy"},"content":"### Yek Khoon Sun","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/khoonsun47.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/khoonsun47)]","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://sg.linkedin.com/in/yek-khoon-sun-2b2270177)]","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"felixchanyy"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"felixchanyy"},"content":"### Carl Lim","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/lokidoki102.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/lokidoki102)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/carl-lim-483980152/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"felixchanyy"},"content":"* Role: Code Quality, IntelliJ expert","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Looks after code quality and code review, ensures adherence to coding standards, ","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"felixchanyy"},"content":"helps other team members with matters related to IntelliJ","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"felixchanyy"},"content":"### Zeng Zihui","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/zengzihui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/zengzihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/zeng-zihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"felixchanyy"},"content":"* Role: Documentation, In charge of UI","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for the quality of various project documents,","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"felixchanyy"},"content":"review changes done to UI, act as the gate keeper of its quality, help others when they face","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"felixchanyy"},"content":"difficulties while modifying UI","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"felixchanyy"},"content":"### Liu Zhengyang","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/redcolorbicycle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/redcolorbicycle)]","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/liu-zhengyang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"felixchanyy"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":36,"-":31}},{"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":"zengzihui"},"content":"# EstateEase Developer Guide","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"* Residential Property Real Estate Listing Agent in Singapore","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"zengzihui"},"content":"**Value proposition**: EstateEase simplifies residential property management for real estate listing agents in Singapore. With intuitive tools for listing and client communication, the app is tailored for efficiency. Agents can quickly access contacts and prioritize them, ensuring swift connections with clients.","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"zengzihui"},"content":"|----------|-------------------|--------------------------------------------------------------|------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | add home-owners | keep track of their contact details and the properties that they are selling |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | view a list of all contacts stored, along with their details | quickly find the contact I need |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | delete contacts | remove outdated or irrelevant contacts |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | be able to import my existing contact and address data | seamlessly transition to using EstateEase |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | save any changes or updates made to the contact details | ensure that my data is always up-to-date |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"zengzihui"},"content":"(For all use cases below, the **System** is the `EstateEase` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC01 - Add home-owners to user’s contact list**","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"KhoonSun47"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the home-owner and displays the newly added home-owner. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the block number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3k and 3l:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the unit number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects duplicate name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding duplicate name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects missing phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding missing phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects incorrect format for phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding incorrect format for phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects missing email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding missing email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects incorrect format for email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding incorrect format for email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects incorrect housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects missing block number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"KhoonSun47"},"content":" * \t3i1. EstateEase shows an error message regarding missing block number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing street name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing street name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects missing unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding missing unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"KhoonSun47"},"content":"* 3l. EstateEase detects incorrect format for unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"KhoonSun47"},"content":" * 3l1. EstateEase shows an error message regarding incorrect format for unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"KhoonSun47"},"content":"* 3m. EstateEase detects missing postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"KhoonSun47"},"content":" * 3m1. EstateEase shows an error message regarding missing postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"KhoonSun47"},"content":"* 3n. EstateEase detects incorrect format for postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"KhoonSun47"},"content":" * 3n1. EstateEase shows an error message regarding incorrect format for postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"KhoonSun47"},"content":"* 3o. EstateEase detects missing role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"KhoonSun47"},"content":" * 3o1. EstateEase shows an error message regarding missing role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"KhoonSun47"},"content":"* 3p. EstateEase detects incorrect role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"KhoonSun47"},"content":" * 3p1. EstateEase shows an error message regarding the entry of incorrect role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"KhoonSun47"},"content":"* 3q. EstateEase detects incorrect priority level in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"KhoonSun47"},"content":" * 3q1. EstateEase shows an error message regarding the entry of incorrect priority level. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC03 - Delete a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"zengzihui"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-04"},{"lineNumber":394,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"zengzihui"},"content":"4. EstateEase deletes the person","lastModifiedDate":"2024-03-04"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"zengzihui"},"content":" * 3a1. EstateEase shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC05 - Save to storage**","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":413,"author":{"gitId":"lokidoki102"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-04"},{"lineNumber":414,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":415,"author":{"gitId":"lokidoki102"},"content":"**Preconditions: The user initiates an add or delete command**","lastModifiedDate":"2024-03-04"},{"lineNumber":416,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":417,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":418,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":419,"author":{"gitId":"lokidoki102"},"content":"1. EstateEase processes the add (UC01) or delete (UC03) command and updates the address book accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":420,"author":{"gitId":"lokidoki102"},"content":"2. EstateEase attempts to update the JSON file accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":421,"author":{"gitId":"lokidoki102"},"content":"3. EstateEase successfully updates the JSON file.","lastModifiedDate":"2024-03-04"},{"lineNumber":422,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":423,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":425,"author":{"gitId":"lokidoki102"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":426,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":427,"author":{"gitId":"lokidoki102"},"content":"* 2a. EstateEase is unable to write to the JSON file due to file permission issue.","lastModifiedDate":"2024-03-04"},{"lineNumber":428,"author":{"gitId":"lokidoki102"},"content":" * 2a1. EstateEase shows error message regarding the insufficient file permission to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":429,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":430,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"lokidoki102"},"content":"* 2b. EstateEase is unable to write to the JSON file due to some IOException.","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"lokidoki102"},"content":" * 2b1. EstateEase shows error message regarding the IOException to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"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":442,"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":443,"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":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":450,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":460,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":461,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"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":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"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":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"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":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"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":495,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"zengzihui":13,"KhoonSun47":84,"-":380,"lokidoki102":28}},{"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":"felixchanyy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEstateEase\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"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":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"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":{"felixchanyy":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"felixchanyy"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) [![codecov](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp/graph/badge.svg?token\u003dNB86I9H23Z)](https://codecov.io/gh/AY2324S2-CS2103-F09-1/tp)","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"## About the app","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"felixchanyy"},"content":"EstateEase simplifies residential property management for real estate listing agents in Singapore.","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"felixchanyy"},"content":"### Key Features:","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"felixchanyy"},"content":" * With intuitive tools for listing and client communication, the app is tailored for efficiency. ","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"felixchanyy"},"content":" * Agents can quickly access contacts and prioritize them, ensuring swift connections with clients. ","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"felixchanyy"},"content":"### Example Usages:","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to add and delete client information.","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to prioritize client contacts for efficient communication","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":" * Allows real estate agents to load and save the list using JSON file","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"felixchanyy"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"This project is based on the AddressBook-Level3 project created by the ","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":17,"-":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":"felixchanyy"},"content":"You can reach us at the email `felixchanyy.22@u.nus.edu`","lastModifiedDate":"2024-03-04"},{"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":"felixchanyy"},"content":"### Felix Chan","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/felixchanyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"felixchanyy"},"content":"[[homepage](https://nus-cs2103-ay2324s2.github.io/website)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"felixchanyy"},"content":"[[github](https://github.com/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/felixchanyy)]","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"felixchanyy"},"content":"* Role: Team Lead, Scheduling and Tracking, Git Expert","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for overall project coordination, in charge of defining, assigning, and tracking ","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"felixchanyy"},"content":"project tasks, helps other team members with matters related to Git","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"felixchanyy"},"content":"### Yek Khoon Sun","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/khoonsun47.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/khoonsun47)]","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://sg.linkedin.com/in/yek-khoon-sun-2b2270177)]","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"felixchanyy"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"felixchanyy"},"content":"### Carl Lim","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/lokidoki102.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/lokidoki102)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/carl-lim-483980152/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"felixchanyy"},"content":"* Role: Code Quality, IntelliJ expert","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Looks after code quality and code review, ensures adherence to coding standards, ","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"felixchanyy"},"content":"helps other team members with matters related to IntelliJ","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"felixchanyy"},"content":"### Zeng Zihui","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/zengzihui.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/zengzihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/zeng-zihui)]","lastModifiedDate":"2024-03-04"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"felixchanyy"},"content":"* Role: Documentation, In charge of UI","lastModifiedDate":"2024-03-04"},{"lineNumber":55,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Responsible for the quality of various project documents,","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"felixchanyy"},"content":"review changes done to UI, act as the gate keeper of its quality, help others when they face","lastModifiedDate":"2024-03-04"},{"lineNumber":57,"author":{"gitId":"felixchanyy"},"content":"difficulties while modifying UI","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"felixchanyy"},"content":"### Liu Zhengyang","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"felixchanyy"},"content":"\u003cimg src\u003d\"images/redcolorbicycle.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"felixchanyy"},"content":"[[github](http://github.com/redcolorbicycle)]","lastModifiedDate":"2024-03-04"},{"lineNumber":64,"author":{"gitId":"felixchanyy"},"content":"[[portfolio](https://www.linkedin.com/in/liu-zhengyang)]","lastModifiedDate":"2024-03-04"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"felixchanyy"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":67,"author":{"gitId":"felixchanyy"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"felixchanyy":36,"-":31}},{"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":"zengzihui"},"content":"# EstateEase Developer Guide","lastModifiedDate":"2024-03-04"},{"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":"zengzihui"},"content":"* Residential Property Real Estate Listing Agent in Singapore","lastModifiedDate":"2024-03-04"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"zengzihui"},"content":"**Value proposition**: EstateEase simplifies residential property management for real estate listing agents in Singapore. With intuitive tools for listing and client communication, the app is tailored for efficiency. Agents can quickly access contacts and prioritize them, ensuring swift connections with clients.","lastModifiedDate":"2024-03-04"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"zengzihui"},"content":"|----------|-------------------|--------------------------------------------------------------|------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-04"},{"lineNumber":290,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | add home-owners | keep track of their contact details and the properties that they are selling |","lastModifiedDate":"2024-03-04"},{"lineNumber":291,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | view a list of all contacts stored, along with their details | quickly find the contact I need |","lastModifiedDate":"2024-03-04"},{"lineNumber":292,"author":{"gitId":"zengzihui"},"content":"| `* * *` | real estate agent | delete contacts | remove outdated or irrelevant contacts |","lastModifiedDate":"2024-03-04"},{"lineNumber":293,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | be able to import my existing contact and address data | seamlessly transition to using EstateEase |","lastModifiedDate":"2024-03-04"},{"lineNumber":294,"author":{"gitId":"zengzihui"},"content":"| `* *` | real estate agent | save any changes or updates made to the contact details | ensure that my data is always up-to-date |","lastModifiedDate":"2024-03-04"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"zengzihui"},"content":"(For all use cases below, the **System** is the `EstateEase` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-04"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"KhoonSun47"},"content":"**Use case: UC01 - Add home-owners to user’s contact list**","lastModifiedDate":"2024-03-04"},{"lineNumber":303,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":304,"author":{"gitId":"KhoonSun47"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":305,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":306,"author":{"gitId":"KhoonSun47"},"content":"1. User chooses to add home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":307,"author":{"gitId":"KhoonSun47"},"content":"2. EstateEase requests for the details of the home-owner.","lastModifiedDate":"2024-03-04"},{"lineNumber":308,"author":{"gitId":"KhoonSun47"},"content":"3. User enters the requested details.","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"KhoonSun47"},"content":"4. EstateEase adds the home-owner and displays the newly added home-owner. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3i:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the block number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"KhoonSun47"},"content":"**Precondition for Extension 3k and 3l:** EstateEase has received the details of the home-owner from the user. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"KhoonSun47"},"content":"**Trigger:** EstateEase validates the entered details and detects that the unit number is missing when the housing type is HDB/Condo.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"KhoonSun47"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"KhoonSun47"},"content":"* 3a. EstateEase detects missing name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"KhoonSun47"},"content":" * 3a1. EstateEase shows an error message regarding missing name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"KhoonSun47"},"content":"* 3b. EstateEase detects duplicate name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"KhoonSun47"},"content":" * 3b1. EstateEase shows an error message regarding duplicate name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"KhoonSun47"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"KhoonSun47"},"content":"* 3c. EstateEase detects missing phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"KhoonSun47"},"content":" * 3c1. EstateEase shows an error message regarding missing phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"KhoonSun47"},"content":"* 3d. EstateEase detects incorrect format for phone number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"KhoonSun47"},"content":" * 3d1. EstateEase shows an error message regarding incorrect format for phone number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":335,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"KhoonSun47"},"content":"* 3e. EstateEase detects missing email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"KhoonSun47"},"content":" * 3e1. EstateEase shows an error message regarding missing email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"KhoonSun47"},"content":"* 3f. EstateEase detects incorrect format for email in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"KhoonSun47"},"content":" * 3f1. EstateEase shows an error message regarding incorrect format for email. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"KhoonSun47"},"content":"* 3g. EstateEase detects missing housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"KhoonSun47"},"content":" * 3g1. EstateEase shows an error message regarding missing housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"KhoonSun47"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"KhoonSun47"},"content":"* 3h. EstateEase detects incorrect housing type in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":349,"author":{"gitId":"KhoonSun47"},"content":" * 3h1. EstateEase shows an error message regarding the entry of incorrect of housing type. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":350,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"KhoonSun47"},"content":"* 3i. EstateEase detects missing block number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"KhoonSun47"},"content":" * \t3i1. EstateEase shows an error message regarding missing block number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"KhoonSun47"},"content":"* 3j. EstateEase detects missing street name in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"KhoonSun47"},"content":" * 3j1. EstateEase shows an error message regarding missing street name. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"KhoonSun47"},"content":"* 3k. EstateEase detects missing unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"KhoonSun47"},"content":" * 3k1. EstateEase shows an error message regarding missing unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"KhoonSun47"},"content":"* 3l. EstateEase detects incorrect format for unit number in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"KhoonSun47"},"content":" * 3l1. EstateEase shows an error message regarding incorrect format for unit number. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"KhoonSun47"},"content":"* 3m. EstateEase detects missing postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"KhoonSun47"},"content":" * 3m1. EstateEase shows an error message regarding missing postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":372,"author":{"gitId":"KhoonSun47"},"content":"* 3n. EstateEase detects incorrect format for postal code in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"KhoonSun47"},"content":" * 3n1. EstateEase shows an error message regarding incorrect format for postal code. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"KhoonSun47"},"content":"* 3o. EstateEase detects missing role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"KhoonSun47"},"content":" * 3o1. EstateEase shows an error message regarding missing role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"KhoonSun47"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"KhoonSun47"},"content":"* 3p. EstateEase detects incorrect role in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"KhoonSun47"},"content":" * 3p1. EstateEase shows an error message regarding the entry of incorrect role. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"KhoonSun47"},"content":"* 3q. EstateEase detects incorrect priority level in the entered data. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"KhoonSun47"},"content":" * 3q1. EstateEase shows an error message regarding the entry of incorrect priority level. \u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"KhoonSun47"},"content":" Use case resumes from step 2.","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"redcolorbicycle"},"content":"**Use case: UC02 - View all**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"redcolorbicycle"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"redcolorbicycle"},"content":"1. User requests to list persons ","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"redcolorbicycle"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"redcolorbicycle"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"redcolorbicycle"},"content":"*2a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"redcolorbicycle"},"content":" * 2a1. EstateEast displays a message stating that the list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"redcolorbicycle"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"redcolorbicycle"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC03 - Delete a person**","lastModifiedDate":"2024-03-04"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"zengzihui"},"content":"2. EstateEase shows a list of persons","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"zengzihui"},"content":"4. EstateEase deletes the person","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"zengzihui"},"content":" * 3a1. EstateEase shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"lokidoki102"},"content":"**Use case: UC05 - Save to storage**","lastModifiedDate":"2024-03-04"},{"lineNumber":428,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":429,"author":{"gitId":"lokidoki102"},"content":"**Actor: EstateEase**","lastModifiedDate":"2024-03-04"},{"lineNumber":430,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":431,"author":{"gitId":"lokidoki102"},"content":"**Preconditions: The user initiates an add or delete command**","lastModifiedDate":"2024-03-04"},{"lineNumber":432,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":433,"author":{"gitId":"lokidoki102"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":434,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":435,"author":{"gitId":"lokidoki102"},"content":"1. EstateEase processes the add (UC01) or delete (UC03) command and updates the address book accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":436,"author":{"gitId":"lokidoki102"},"content":"2. EstateEase attempts to update the JSON file accordingly.","lastModifiedDate":"2024-03-04"},{"lineNumber":437,"author":{"gitId":"lokidoki102"},"content":"3. EstateEase successfully updates the JSON file.","lastModifiedDate":"2024-03-04"},{"lineNumber":438,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":439,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":440,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":441,"author":{"gitId":"lokidoki102"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":442,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":443,"author":{"gitId":"lokidoki102"},"content":"* 2a. EstateEase is unable to write to the JSON file due to file permission issue.","lastModifiedDate":"2024-03-04"},{"lineNumber":444,"author":{"gitId":"lokidoki102"},"content":" * 2a1. EstateEase shows error message regarding the insufficient file permission to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":445,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":446,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":447,"author":{"gitId":"lokidoki102"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":448,"author":{"gitId":"lokidoki102"},"content":"* 2b. EstateEase is unable to write to the JSON file due to some IOException.","lastModifiedDate":"2024-03-04"},{"lineNumber":449,"author":{"gitId":"lokidoki102"},"content":" * 2b1. EstateEase shows error message regarding the IOException to the user.","lastModifiedDate":"2024-03-04"},{"lineNumber":450,"author":{"gitId":"lokidoki102"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":451,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":452,"author":{"gitId":"lokidoki102"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":453,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"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":458,"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":459,"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":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":466,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":476,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":477,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"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":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"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":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"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":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"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":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"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":511,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"redcolorbicycle":16,"zengzihui":13,"KhoonSun47":84,"-":380,"lokidoki102":28}},{"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":"felixchanyy"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eEstateEase\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"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":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"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":{"felixchanyy":1,"-":66}}] diff --git a/AY2324S2-CS2103-F09-1_tp_master/commits.json b/AY2324S2-CS2103-F09-1_tp_master/commits.json index cc9c09d6..cb2b87db 100644 --- a/AY2324S2-CS2103-F09-1_tp_master/commits.json +++ b/AY2324S2-CS2103-F09-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"redcolorbicycle":[{"date":"2024-03-05","commitResults":[{"hash":"c27b71e1a13fe523788ea79dcb0fb357c40f89d3","isMergeCommit":true,"messageTitle":"Merge pull request #21 from KhoonSun47/branch-update-developer-guide","messageBody":"Branch update developer guide","fileTypesAndContributionMap":{}}]}],"zengzihui":[{"date":"2024-03-04","commitResults":[{"hash":"3bf8fb3483bf513a06bf8c87688887d2dff23b38","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Update target user profile, value proposition, and user stories for v1.2.\nUpdate use case for delete contact.\n","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"3bbbb04b718ea7c7757dca95142ad3e92e3bb5e0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from zengzihui/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide for target user profile, value proposition, and user stories for v1.2","fileTypesAndContributionMap":{}}]}],"KhoonSun47":[{"date":"2024-03-04","commitResults":[{"hash":"01368656f2edde1c9467693dfcc5131537fb69fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"26ae6d0094063f4a27b0ef46714554a9e01bb351","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update EstateEase Developer Guide\n Update EstateEase Developer Guide\n Update README page\n Update AboutUs page\n Rename zhengyang.png. to zhengyang.png\n Rename zhengyang.png.jpg to zhengyang.png\n Added profile pic\n","fileTypesAndContributionMap":{}},{"hash":"6fad1deb95133281b72c04e334974643a7c904e8","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"DeveloperGuide.md: Add use case UC01 - Add home-owners to user\u0027s contact list\n","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":0}}}]}],"felixchanyy":[{"date":"2024-02-25","commitResults":[{"hash":"49ea064856c7f445023492f187e586955a8ff914","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1c557117b928997147adacbfbaa2a51e621be928","isMergeCommit":true,"messageTitle":"Merge pull request #1 from felixchanyy/switch-docs-to-markbind","messageBody":"Add branch Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"437dc448a25a27a4e80aadfba9c9ff559fff86df","isMergeCommit":false,"messageTitle":"Set up MarkBind website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3ec6fbcede9e2331e865e8c9013ed12ba595a14a","isMergeCommit":true,"messageTitle":"Merge pull request #2 from felixchanyy/master","messageBody":"Set up MarkBind website","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"a47aa2b24342c77b8db32c2a23911555036fb767","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add roles and individual profile pic\n","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":30}}},{"hash":"2d9d3d2668b299b07b49e579c65b1bf0555729f1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from felixchanyy/branch-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14246bf45fe143d902d1bf5bbebbd07da5eca49a","isMergeCommit":false,"messageTitle":"Update README page","messageBody":"Make changes to Ui mock up, update link of Github Actions badge\nand the content of the page.\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"d73491577039858c93774a124ef2be0533b6dbad","isMergeCommit":true,"messageTitle":"Merge pull request #16 from felixchanyy/branch-readme","messageBody":"Update README page","fileTypesAndContributionMap":{}}]}],"lokidoki102":[{"date":"2024-03-04","commitResults":[{"hash":"e619f001b6abc4609e4ad77c553f802c6e7d06aa","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Add use case (textual) for save to storage.\nUpdate delete contact use case to include use case number.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":2}}},{"hash":"3d096c0e453bb7ffdd1a615edff7e8a7e1cab953","isMergeCommit":true,"messageTitle":"Merge pull request #19 from lokidoki102/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"redcolorbicycle":{"docs":0,"functional-code":0,"test-code":0},"zengzihui":{"docs":13,"functional-code":0,"test-code":0},"KhoonSun47":{"docs":84,"functional-code":0,"test-code":0},"felixchanyy":{"docs":54,"functional-code":0,"test-code":0},"lokidoki102":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"redcolorbicycle":0.0,"zengzihui":73.40972,"KhoonSun47":564.9723,"felixchanyy":670.9722,"lokidoki102":68.75},"authorDisplayNameMap":{"redcolorbicycle":"CS2103-F09-1 LIU ..YANG","zengzihui":"CS2103-F09-1 ZENG..IHUI","KhoonSun47":"CS2103-F09-1 YEK .. SUN","felixchanyy":"CS2103-F09-1 FELI..YUAN","lokidoki102":"CS2103-F09-1 LIM ..RATO"}} +{"authorDailyContributionsMap":{"redcolorbicycle":[{"date":"2024-03-05","commitResults":[{"hash":"c27b71e1a13fe523788ea79dcb0fb357c40f89d3","isMergeCommit":true,"messageTitle":"Merge pull request #21 from KhoonSun47/branch-update-developer-guide","messageBody":"Branch update developer guide","fileTypesAndContributionMap":{}},{"hash":"cb692f1617a049621f50325f69bde3ff61660a98","isMergeCommit":false,"messageTitle":"Update use case UC02: View All","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":0}}}]}],"zengzihui":[{"date":"2024-03-04","commitResults":[{"hash":"3bf8fb3483bf513a06bf8c87688887d2dff23b38","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Update target user profile, value proposition, and user stories for v1.2.\nUpdate use case for delete contact.\n","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":17}}},{"hash":"3bbbb04b718ea7c7757dca95142ad3e92e3bb5e0","isMergeCommit":true,"messageTitle":"Merge pull request #17 from zengzihui/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide for target user profile, value proposition, and user stories for v1.2","fileTypesAndContributionMap":{}}]}],"KhoonSun47":[{"date":"2024-03-04","commitResults":[{"hash":"01368656f2edde1c9467693dfcc5131537fb69fd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103-F09-1:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"26ae6d0094063f4a27b0ef46714554a9e01bb351","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/KhoonSun47/tp","messageBody":"* \u0027master\u0027 of https://github.com/KhoonSun47/tp:\n Update EstateEase Developer Guide\n Update EstateEase Developer Guide\n Update README page\n Update AboutUs page\n Rename zhengyang.png. to zhengyang.png\n Rename zhengyang.png.jpg to zhengyang.png\n Added profile pic\n","fileTypesAndContributionMap":{}},{"hash":"6fad1deb95133281b72c04e334974643a7c904e8","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"DeveloperGuide.md: Add use case UC01 - Add home-owners to user\u0027s contact list\n","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":0}}}]}],"felixchanyy":[{"date":"2024-02-25","commitResults":[{"hash":"49ea064856c7f445023492f187e586955a8ff914","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"1c557117b928997147adacbfbaa2a51e621be928","isMergeCommit":true,"messageTitle":"Merge pull request #1 from felixchanyy/switch-docs-to-markbind","messageBody":"Add branch Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"437dc448a25a27a4e80aadfba9c9ff559fff86df","isMergeCommit":false,"messageTitle":"Set up MarkBind website","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3ec6fbcede9e2331e865e8c9013ed12ba595a14a","isMergeCommit":true,"messageTitle":"Merge pull request #2 from felixchanyy/master","messageBody":"Set up MarkBind website","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"a47aa2b24342c77b8db32c2a23911555036fb767","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add roles and individual profile pic\n","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":30}}},{"hash":"2d9d3d2668b299b07b49e579c65b1bf0555729f1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from felixchanyy/branch-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14246bf45fe143d902d1bf5bbebbd07da5eca49a","isMergeCommit":false,"messageTitle":"Update README page","messageBody":"Make changes to Ui mock up, update link of Github Actions badge\nand the content of the page.\n","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":11}}},{"hash":"d73491577039858c93774a124ef2be0533b6dbad","isMergeCommit":true,"messageTitle":"Merge pull request #16 from felixchanyy/branch-readme","messageBody":"Update README page","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"1ad435b1386fa665892fa770ed9207d884c6f925","isMergeCommit":true,"messageTitle":"Merge pull request #23 from redcolorbicycle/master","messageBody":"Update use case UC02: View All","fileTypesAndContributionMap":{}}]}],"lokidoki102":[{"date":"2024-03-04","commitResults":[{"hash":"e619f001b6abc4609e4ad77c553f802c6e7d06aa","isMergeCommit":false,"messageTitle":"Update EstateEase Developer Guide","messageBody":"Add use case (textual) for save to storage.\nUpdate delete contact use case to include use case number.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":2}}},{"hash":"3d096c0e453bb7ffdd1a615edff7e8a7e1cab953","isMergeCommit":true,"messageTitle":"Merge pull request #19 from lokidoki102/branch-update-developer-guide","messageBody":"Update EstateEase Developer Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"redcolorbicycle":{"docs":16,"functional-code":0,"test-code":0},"zengzihui":{"docs":13,"functional-code":0,"test-code":0},"KhoonSun47":{"docs":84,"functional-code":0,"test-code":0},"felixchanyy":{"docs":54,"functional-code":0,"test-code":0},"lokidoki102":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"redcolorbicycle":19.555555,"zengzihui":73.40972,"KhoonSun47":564.9723,"felixchanyy":670.9722,"lokidoki102":68.75},"authorDisplayNameMap":{"redcolorbicycle":"CS2103-F09-1 LIU ..YANG","zengzihui":"CS2103-F09-1 ZENG..IHUI","KhoonSun47":"CS2103-F09-1 YEK .. SUN","felixchanyy":"CS2103-F09-1 FELI..YUAN","lokidoki102":"CS2103-F09-1 LIM ..RATO"}} diff --git a/AY2324S2-CS2103-F09-2_tp_master/authorship.json b/AY2324S2-CS2103-F09-2_tp_master/authorship.json index 35e1d0c2..34b9a39e 100644 --- a/AY2324S2-CS2103-F09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103-F09-2_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"NeoHW"},"content":"### Neo Haowei","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"\u003cimg src\u003d\"images/neohw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"[[github](http://github.com/NeoHW)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"* Responsibilities: Overall project coordination, code review","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"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)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"guohuang88"},"content":"### Li Guohuang","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"guohuang88"},"content":"\u003cimg src\u003d\"images/guohuang88.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"guohuang88"},"content":"[[github](http://github.com/guohuang88)]","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"guohuang88"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"guohuang88"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"guohuang88"},"content":"* Responsibilities: Ensure project is tested properly and on time.","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ZhiWei1010"},"content":"### Tan Zhi Wei","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ZhiWei1010"},"content":"\u003cimg src\u003d\"images/zhiwei1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"ZhiWei1010"},"content":"[[github](http://github.com/ZhiWei1010)]","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"ZhiWei1010"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"ZhiWei1010"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"ZhiWei1010"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"guohuang88":6,"ZhiWei1010":6,"NeoHW":5,"-":34}}] +[{"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":"NeoHW"},"content":"### Neo Haowei","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"\u003cimg src\u003d\"images/neohw.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"NeoHW"},"content":"[[github](http://github.com/NeoHW)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"NeoHW"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"NeoHW"},"content":"* Responsibilities: Overall project coordination, code review","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"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)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"guohuang88"},"content":"### Li Guohuang","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"guohuang88"},"content":"\u003cimg src\u003d\"images/guohuang88.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"guohuang88"},"content":"[[github](http://github.com/guohuang88)]","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"guohuang88"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"guohuang88"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"guohuang88"},"content":"* Responsibilities: Ensure project is tested properly and on time.","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ZhiWei1010"},"content":"### Tan Zhi Wei","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ZhiWei1010"},"content":"\u003cimg src\u003d\"images/zhiwei1010.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"ZhiWei1010"},"content":"[[github](http://github.com/ZhiWei1010)]","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"ZhiWei1010"},"content":"[[portfolio](https://ay2324s2-cs2103-f09-2.github.io/tp/)]","lastModifiedDate":"2024-03-04"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"ZhiWei1010"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"ZhiWei1010"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format.","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"guohuang88":6,"ZhiWei1010":6,"NeoHW":5,"-":34}},{"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\"\u003ePatientSync\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"NeoHW"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103-F09-2/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"NeoHW":1,"-":66}},{"path":"docs/index.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: \"\"","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":"NeoHW"},"content":"# PatientSync","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"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":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"NeoHW"},"content":"**PatientSync is a desktop application meticulously crafted for nurses who prioritize the well-being of their patients above all else.** ","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"NeoHW"},"content":"It allows you to input intimate details about your patients, such as food preferences and family conditions. While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"NeoHW"},"content":"* If you are interested in using PatientSync, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"NeoHW"},"content":"* If you are interested about developing PatientSync, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"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":{"NeoHW":5,"-":17}}] diff --git a/AY2324S2-CS2103-F09-2_tp_master/commits.json b/AY2324S2-CS2103-F09-2_tp_master/commits.json index 04ee0124..28014da4 100644 --- a/AY2324S2-CS2103-F09-2_tp_master/commits.json +++ b/AY2324S2-CS2103-F09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"guohuang88":[{"date":"2024-03-05","commitResults":[{"hash":"67cb69188c5c4655d8709f6ce3bc0bc089286207","isMergeCommit":false,"messageTitle":"Update AboutUs.md to add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"SherisseTJW":[{"date":"2024-03-04","commitResults":[{"hash":"6aaaf3fa750fe83176ac00adc3f7c0e0c15d20df","isMergeCommit":true,"messageTitle":"Merge pull request #22 from NeoHW/V1.1-AddProfilePic","messageBody":"V1.1 add profile pic","fileTypesAndContributionMap":{}},{"hash":"8f2224d5f8fdee7802fa4b96d441a0695cec983a","isMergeCommit":true,"messageTitle":"Merge pull request #23 from ZhiWei1010/v1.1-add-profile-picture","messageBody":"Update AboutUs.md for milestone v1.1","fileTypesAndContributionMap":{}}]}],"ZhiWei1010":[{"date":"2024-03-04","commitResults":[{"hash":"a82460a19c98af3bf8d133548113d352c4fa7484","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add profile picture.\n\nUpdate github link to redirect to personal github page.\n\nUpdate portfolio link to redirect to team portfolio page.\n\nUpdate role and responsibility for Tan Zhi Wei .\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"choowengyan":[],"NeoHW":[{"date":"2024-03-04","commitResults":[{"hash":"f5d917cdba85f6ffece8081e08c2f775decdf8e7","isMergeCommit":false,"messageTitle":"Update AboutUs.md for milestone 1.1","messageBody":"- Updated profile photo, role, and responsibilities for Neo Haowei\n\nThis commit updates the AboutUs.md page for milestone 1.1.\nNeo Haowei\u0027s profile photo, GitHub link, and portfolio link\nhave been added.\n\nFixes #16\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":15}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a65df35e86510160985bb9c3de8dce3110b2c1fd","isMergeCommit":true,"messageTitle":"Merge pull request #24 from guohuang88/branch-AboutUs","messageBody":"Update AboutUs.md to add profile picture","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"guohuang88":{"docs":6,"functional-code":0,"test-code":0},"SherisseTJW":{"docs":0,"functional-code":0,"test-code":0},"ZhiWei1010":{"docs":6,"functional-code":0,"test-code":0},"choowengyan":{"docs":0,"functional-code":0,"test-code":0},"NeoHW":{"docs":5,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guohuang88":11.0,"SherisseTJW":0.0,"ZhiWei1010":11.0,"choowengyan":0.0,"NeoHW":30.555557},"authorDisplayNameMap":{"guohuang88":"CS2103-F09-2 LI G..UANG","SherisseTJW":"CS2103-F09-2 SHER.. WEN","ZhiWei1010":"CS2103-F09-2 TAN .. WEI","choowengyan":"CS2103-F09-2 CHOO.. YAN","NeoHW":"CS2103-F09-2 NEO ..OWEI"}} +{"authorDailyContributionsMap":{"guohuang88":[{"date":"2024-03-05","commitResults":[{"hash":"67cb69188c5c4655d8709f6ce3bc0bc089286207","isMergeCommit":false,"messageTitle":"Update AboutUs.md to add profile picture","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"SherisseTJW":[{"date":"2024-03-04","commitResults":[{"hash":"6aaaf3fa750fe83176ac00adc3f7c0e0c15d20df","isMergeCommit":true,"messageTitle":"Merge pull request #22 from NeoHW/V1.1-AddProfilePic","messageBody":"V1.1 add profile pic","fileTypesAndContributionMap":{}},{"hash":"8f2224d5f8fdee7802fa4b96d441a0695cec983a","isMergeCommit":true,"messageTitle":"Merge pull request #23 from ZhiWei1010/v1.1-add-profile-picture","messageBody":"Update AboutUs.md for milestone v1.1","fileTypesAndContributionMap":{}}]}],"ZhiWei1010":[{"date":"2024-03-04","commitResults":[{"hash":"a82460a19c98af3bf8d133548113d352c4fa7484","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"Add profile picture.\n\nUpdate github link to redirect to personal github page.\n\nUpdate portfolio link to redirect to team portfolio page.\n\nUpdate role and responsibility for Tan Zhi Wei .\n","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}}]}],"choowengyan":[],"NeoHW":[{"date":"2024-03-04","commitResults":[{"hash":"f5d917cdba85f6ffece8081e08c2f775decdf8e7","isMergeCommit":false,"messageTitle":"Update AboutUs.md for milestone 1.1","messageBody":"- Updated profile photo, role, and responsibilities for Neo Haowei\n\nThis commit updates the AboutUs.md page for milestone 1.1.\nNeo Haowei\u0027s profile photo, GitHub link, and portfolio link\nhave been added.\n\nFixes #16\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":15}}}]},{"date":"2024-03-05","commitResults":[{"hash":"a65df35e86510160985bb9c3de8dce3110b2c1fd","isMergeCommit":true,"messageTitle":"Merge pull request #24 from guohuang88/branch-AboutUs","messageBody":"Update AboutUs.md to add profile picture","fileTypesAndContributionMap":{}},{"hash":"5ddc688b9f6f5ea9a1ec4282d54c0fcae2d3cfc1","isMergeCommit":false,"messageTitle":"feat: Adapt MarkBind site for project","messageBody":"- Added GitHub Actions write permissions for repo\n- Updated site configs to match project fork:\n\t- Updated baseUrl in .github/workflows/docs.yml\n\t- Updated product name in docs/_markbind/layouts/default.md\n\t- Updated titlePrefix in docs/site.json\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"2e708a81e0b936532dc595f3dbe1aa318ab98d30","isMergeCommit":false,"messageTitle":"Update index.md for PatientSync","messageBody":"The index.md file was previously tailored for the addressbook3 project.\nThis commit updates the content to reflect new PatientSync project,\nincluding the project name, description, and relevant links.\n\nThe changes include:\n* Updating the project name to PatientSync\n* Updating the project description\n\nThis update is necessary to provide accurate and relevant information\nabout the PatientSync project on the main page of the documentation.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"0cf51d0f1f89bddbe1499a73f833a20d467e6ddb","isMergeCommit":true,"messageTitle":"Merge pull request #27 from NeoHW/V1.1-UpdateProjectWebsite","messageBody":"V1.1 update project website","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"guohuang88":{"docs":6,"functional-code":0,"test-code":0},"SherisseTJW":{"docs":0,"functional-code":0,"test-code":0},"ZhiWei1010":{"docs":6,"functional-code":0,"test-code":0},"choowengyan":{"docs":0,"functional-code":0,"test-code":0},"NeoHW":{"docs":11,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guohuang88":10.224853,"SherisseTJW":0.0,"ZhiWei1010":10.224852,"choowengyan":0.0,"NeoHW":31.6213},"authorDisplayNameMap":{"guohuang88":"CS2103-F09-2 LI G..UANG","SherisseTJW":"CS2103-F09-2 SHER.. WEN","ZhiWei1010":"CS2103-F09-2 TAN .. WEI","choowengyan":"CS2103-F09-2 CHOO.. YAN","NeoHW":"CS2103-F09-2 NEO ..OWEI"}} diff --git a/AY2324S2-CS2103T-T09-4_tp_master/authorship.json b/AY2324S2-CS2103T-T09-4_tp_master/authorship.json index b0a5048c..f198157b 100644 --- a/AY2324S2-CS2103T-T09-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T09-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":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp/graph/badge.svg?token\u003dWAIOG42WJK)](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Jajared"},"content":"# TA Helper","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Jajared"},"content":"\u003e TA Helper is more than just a tool; it\u0027s your ultimate companion in navigating the complexities of teaching assistance in computer science modules. Embrace the simplicity and efficiency of managing your classes with TA Helper today!","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Jajared"},"content":"TA Helper is a comprehensive tool designed to significantly ease the administrative and organizational challenges faced by Teaching Assistants (TAs) handling computer science modules. With its core focus on facilitating the management of student groups and enhancing the efficiency of classroom administration, TA Helper stands as an essential platform for TAs who are tasked with overseeing numerous classes and students.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Jajared"},"content":"## User Profile","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Jajared"},"content":"- **Target Users:** Teaching Assistants for Computer Science Modules","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"- **Key Challenges:**","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Jajared"},"content":" - Managing multiple classes and a diverse student body.","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":" - Forming student teams for projects or assignments while ensuring fairness.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":" - Keeping track of student details, progress, grades, and attendance across different modules.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Jajared"},"content":"## Problem Statement","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"Teaching Assistants often grapple with the complexities of generating and assigning students to teams within their classes. The situation is compounded when TAs manage multiple classes, necessitating a streamlined method to oversee various nominal rolls. A unified platform that provides a holistic view of all student information, across every class, is crucial for effective student management. Additionally, the random yet fair formation of student teams for assessments poses a significant challenge.","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"## Value Proposition","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"**TA Helper** offers a centralized and user-friendly solution for TAs to manage student information akin to a nominal roll. Its features are tailored to address the specific needs of TAs teaching computer science modules, including but not limited to:","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Jajared"},"content":"- **Centralized Student Information:** Store and access contact details and other vital information of students enrolled in the modules you teach, all in one place.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Jajared"},"content":"- **Progress Tracking:** Monitor and record the progress of each student, including grades and attendance, ensuring a comprehensive overview of each individual\u0027s academic journey.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Jajared"},"content":"- **Multiple Tabs for Different Modules:** Seamlessly manage different groups of students across various modules you\u0027re teaching, with dedicated tabs for each class.","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- **Random Team Generator:** Enhance fairness in assessments by utilizing the optional random team generator, which includes features for adding preferences to accommodate specific grouping needs.","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Jajared"},"content":"## Scope","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Jajared"},"content":"The primary scope of **TA Helper** includes:","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Jajared"},"content":"- Managing contact details of students for each module taught by a TA.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":"- Additional functionalities to track student progress, input grades, and monitor attendance.","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Jajared"},"content":"- Optional feature to generate random teams for projects or assignments, considering fairness and preferences.","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"## Getting Started","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"To get started with TA Helper, follow these simple steps: To be updated","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Jajared"},"content":"## References","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Jajared"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":5,"Jajared":40}},{"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":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"### Jared Wong","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/jajared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":"[[homepage](https://jajared.vercel.app/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":"[[github](https://github.com/Jajared)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Overall project coordination and ensure the team is doing well.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"### Zack Tay","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/zack-tay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zack-Tay"},"content":"[[github](http://github.com/Zack-Tay)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"### Tan Qin Xu","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/qinxutan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"qinxutan"},"content":"[[github](http://github.com/qinxutan)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"- Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Responsible for the quality of various project documents, including README, User Guide and Developer Guide.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"### Whelan Low","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"whelan-low"},"content":"\u003cimg src\u003d\"images/whelan-low.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"whelan-low"},"content":"[[github](http://github.com/whelan-low)]","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Jajared"},"content":"- Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of submitting the deliverables","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Jajared"},"content":"### Mahadhir","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"mahadhir247"},"content":"\u003cimg src\u003d\"images/mahadhir247.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"mahadhir247"},"content":"[[github](http://github.com/mahadhir247)]","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":1,"Zack-Tay":1,"-":34,"Jajared":20,"mahadhir247":2,"whelan-low":2}},{"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":"qinxutan"},"content":"* has a need to manage a significant number of students\u0027 contacts","lastModifiedDate":"2024-02-25"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"qinxutan"},"content":"**Value proposition**: manage students\u0027contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-02-25"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"qinxutan"},"content":"|----------|---------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-25"},{"lineNumber":292,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add new students to a class | maintain an up-to-date list of enrolled students. |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add partial info of students | still add students even if I don’t have all their information. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | delete a student from my class if they drop the module/class | keep my class list accurate and up-to-date. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"qinxutan"},"content":"| `* * ` | TA | search for my students based on their NUS ID, emails, names or tutorial groups | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-02-25"},{"lineNumber":296,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all students and their particulars | have a comprehensive overview of the enrolled students in my class. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"qinxutan"},"content":"| `* *` | TA | add/remove different modules I am teaching | manage my teaching assignments efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all the tutorial classes and their information | visibility into the schedule and details of all tutorial classes. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"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":"qinxutan"},"content":"(For all use cases below, the **System** is the `TA Helper` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-02-25"},{"lineNumber":306,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":307,"author":{"gitId":"qinxutan"},"content":"**Use case 1: Add new students**","lastModifiedDate":"2024-02-25"},{"lineNumber":308,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":309,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Zack-Tay"},"content":"1. TA specifies the student to be added.","lastModifiedDate":"2024-03-04"},{"lineNumber":311,"author":{"gitId":"Zack-Tay"},"content":"2. TAHelper adds the student to the TA\u0027s list of students.","lastModifiedDate":"2024-03-04"},{"lineNumber":312,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":313,"author":{"gitId":"Zack-Tay"},"content":"**Extensions:**","lastModifiedDate":"2024-03-04"},{"lineNumber":314,"author":{"gitId":"Zack-Tay"},"content":"- 1a: Student\u0027s name, email, id is not specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Zack-Tay"},"content":" - 1a1. Returns an error that tells the TA to specify the missing field.","lastModifiedDate":"2024-03-04"},{"lineNumber":316,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":318,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":319,"author":{"gitId":"Zack-Tay"},"content":"- 1b: The current email or id already exists in the list.","lastModifiedDate":"2024-03-04"},{"lineNumber":320,"author":{"gitId":"Zack-Tay"},"content":" - 1b1. Returns an error indicating that there is an existing entry with the same value.","lastModifiedDate":"2024-03-04"},{"lineNumber":321,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":324,"author":{"gitId":"Zack-Tay"},"content":"- 2a: Student\u0027s tutorial class is not specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":325,"author":{"gitId":"Zack-Tay"},"content":" - 2a1. TAHelper adds this student into a list of all students the TA has.","lastModifiedDate":"2024-03-04"},{"lineNumber":326,"author":{"gitId":"Zack-Tay"},"content":" - 2a2. Student will not be placed under any tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":327,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":328,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Zack-Tay"},"content":"- 2b: The input command /add_student is wrongly specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Zack-Tay"},"content":" - 2b1. Return an error indicating command not recognised.","lastModifiedDate":"2024-03-04"},{"lineNumber":332,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":334,"author":{"gitId":"qinxutan"},"content":"**Use case 2: Delete students**","lastModifiedDate":"2024-02-25"},{"lineNumber":335,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":336,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Zack-Tay"},"content":"1. TA specifies the student to be deleted, either by student_id or student_email.","lastModifiedDate":"2024-03-04"},{"lineNumber":338,"author":{"gitId":"Zack-Tay"},"content":"2. TAHelper deletes the student from the TA\u0027s list of students and tutorial group (if it is specified).","lastModifiedDate":"2024-03-04"},{"lineNumber":339,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":340,"author":{"gitId":"Zack-Tay"},"content":"**Extensions:**","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Zack-Tay"},"content":"- 2a: The attribute value specified does not exist in the system.","lastModifiedDate":"2024-03-04"},{"lineNumber":342,"author":{"gitId":"Zack-Tay"},"content":" - 2a1: Returns an error indicating that the value does not exist.","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":344,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":345,"author":{"gitId":"Zack-Tay"},"content":"- 2b: The input command /delete_student is wrongly specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":346,"author":{"gitId":"Zack-Tay"},"content":" - 2b1: Returns an error indicating command not recognised.","lastModifiedDate":"2024-03-04"},{"lineNumber":347,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":348,"author":{"gitId":"qinxutan"},"content":"**Use case 3: Search for students**","lastModifiedDate":"2024-02-25"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":351,"author":{"gitId":"Zack-Tay"},"content":"1. TA specifies the student\u0027s attribute to search by.","lastModifiedDate":"2024-03-04"},{"lineNumber":352,"author":{"gitId":"Zack-Tay"},"content":"2. TA specifies the attribute value to search by.","lastModifiedDate":"2024-03-04"},{"lineNumber":353,"author":{"gitId":"Zack-Tay"},"content":"3. TAHelpers generate a list of matching entries according to attribute and attribute value.","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":355,"author":{"gitId":"Zack-Tay"},"content":"**Extensions:**","lastModifiedDate":"2024-03-04"},{"lineNumber":356,"author":{"gitId":"Zack-Tay"},"content":"- 1a/2a: The attribute or attribute value is not specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"Zack-Tay"},"content":" - 1a1/2a1. Returns an error that tells the TA to specify the missing field.","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":359,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":361,"author":{"gitId":"Zack-Tay"},"content":"- 3a: Partial match","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Zack-Tay"},"content":" - 3a1. will be processed accordingly","lastModifiedDate":"2024-03-04"},{"lineNumber":363,"author":{"gitId":"Zack-Tay"},"content":" - 3a2. TAHelper will display all matching results for that attribute value.","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":365,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":366,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Zack-Tay"},"content":"- 3b: The input command /search_student is wrongly specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":368,"author":{"gitId":"Zack-Tay"},"content":" - 3b1. Return an error indicating command not recognised.","lastModifiedDate":"2024-03-04"},{"lineNumber":369,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":371,"author":{"gitId":"qinxutan"},"content":"**Use case 4: View all students**","lastModifiedDate":"2024-02-25"},{"lineNumber":372,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":373,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":374,"author":{"gitId":"Zack-Tay"},"content":"1. TA specifies the command /list_students and enters.","lastModifiedDate":"2024-03-04"},{"lineNumber":375,"author":{"gitId":"Zack-Tay"},"content":"2. TAHelper displays student\u0027s name, email, student id and tutorial class for each student.","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"Zack-Tay"},"content":"**Extensions:**","lastModifiedDate":"2024-03-04"},{"lineNumber":378,"author":{"gitId":"Zack-Tay"},"content":"- 1a: The input command /list_student is wrongly specified.","lastModifiedDate":"2024-03-04"},{"lineNumber":379,"author":{"gitId":"Zack-Tay"},"content":" - 1a1. Returns an error indicating command not recognised.","lastModifiedDate":"2024-03-04"},{"lineNumber":380,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":382,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Zack-Tay"},"content":"- 2a: Additional arguments is specified after the command.","lastModifiedDate":"2024-03-04"},{"lineNumber":384,"author":{"gitId":"Zack-Tay"},"content":" - 2a1: TAHelper will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-04"},{"lineNumber":385,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":387,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":388,"author":{"gitId":"qinxutan"},"content":"**Use case 5: Add new tutorial class**","lastModifiedDate":"2024-02-25"},{"lineNumber":389,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":390,"author":{"gitId":"whelan-low"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"Zack-Tay"},"content":"1. TA specifies the tutorial class to be added","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"whelan-low"},"content":"2. TAHelper adds the tutorial class","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":394,"author":{"gitId":"whelan-low"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"whelan-low"},"content":"- 2a: The tutorial class is not specified.","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"Zack-Tay"},"content":" - 2a1: Returns an error indicating that user has to specify tutorial class.","lastModifiedDate":"2024-03-04"},{"lineNumber":397,"author":{"gitId":"whelan-low"},"content":" - Use case ends","lastModifiedDate":"2024-02-29"},{"lineNumber":398,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":399,"author":{"gitId":"qinxutan"},"content":"**Use case 6: Delete tutorial class**","lastModifiedDate":"2024-02-25"},{"lineNumber":400,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":401,"author":{"gitId":"whelan-low"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":402,"author":{"gitId":"whelan-low"},"content":"1. User specifies the tutorial class to be deleted","lastModifiedDate":"2024-02-29"},{"lineNumber":403,"author":{"gitId":"whelan-low"},"content":"2. TAHelper deletes the tutorial class","lastModifiedDate":"2024-02-29"},{"lineNumber":404,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":405,"author":{"gitId":"whelan-low"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":406,"author":{"gitId":"whelan-low"},"content":"- 2a: The tutorial class is not specified.","lastModifiedDate":"2024-02-29"},{"lineNumber":407,"author":{"gitId":"whelan-low"},"content":" - Returns an error. Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":408,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"whelan-low"},"content":"- 3a: The tutorial class does not exist.","lastModifiedDate":"2024-02-29"},{"lineNumber":411,"author":{"gitId":"whelan-low"},"content":" - Returns an error, and shows the list of tutorial classes available for that module. Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":412,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":413,"author":{"gitId":"qinxutan"},"content":"**Use case 7: View all classes**","lastModifiedDate":"2024-02-25"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"qinxutan"},"content":"1. TA requests to list classes","lastModifiedDate":"2024-02-25"},{"lineNumber":418,"author":{"gitId":"qinxutan"},"content":"2. AddressBook shows a list of all available classes","lastModifiedDate":"2024-02-25"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"qinxutan"},"content":"* *a. The input format is invalid.","lastModifiedDate":"2024-02-25"},{"lineNumber":430,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":431,"author":{"gitId":"qinxutan"},"content":" * *a1. AddressBook shows an error message.","lastModifiedDate":"2024-02-25"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"qinxutan"},"content":" Use case resumes at next step.","lastModifiedDate":"2024-02-25"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"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":440,"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":441,"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":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":448,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":458,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":459,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"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":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"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":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"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":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"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":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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"},{"lineNumber":496,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"qinxutan":31,"Zack-Tay":76,"-":379,"whelan-low":17}},{"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":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"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":"Jajared"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"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 Address Book.","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"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":"2024-03-05"},{"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":"qinxutan"},"content":"### Adding new students : `add`","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"Jajared"},"content":"### Deleting students : `delete_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"Jajared"},"content":"Delete a student contact based on the parameter specified by the user.","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"Jajared"},"content":"Format: `/delete_student id/STUDENT_ID email/EMAIL`","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"Jajared"},"content":"- The following parameters to delete a student contact are supported:","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"Jajared"},"content":" 1. Student ID","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"Jajared"},"content":" 2. Email","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"Jajared"},"content":"- Leading/trailing spaces are removed","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"Jajared"},"content":"- The parameter is case insensitive","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- If none of the paremeters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"Jajared"},"content":"Upon successful deletion, the command will return a confirmation messaging stating that the specified student contact has been removed.","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"Jajared"},"content":"Examples:","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"Jajared"},"content":"- Delete by student ID: `/delete_student id/A01234567X`","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"Jajared"},"content":"- Delete by email: `/delete_student email/e0123456@u.nus.edu`","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"qinxutan"},"content":"### Searching for students : `search`","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Jajared"},"content":"### Listing all students : `list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"Jajared"},"content":"View the list of all students available","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"Jajared"},"content":"Format: `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":99,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"Jajared"},"content":"The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently.","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"whelan-low"},"content":"### Adding new tutorial class : `add_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"whelan-low"},"content":"Adds a tutorial class with the specified module code and name.","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"whelan-low"},"content":"Format: `/add_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"whelan-low"},"content":"- If none of the parameters is specified, or if only one is specified, returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"whelan-low"},"content":"### Deleting tutorial class : `delete_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"whelan-low"},"content":"Deletes a specified tutorial class from the list of classes.","lastModifiedDate":"2024-02-29"},{"lineNumber":119,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":120,"author":{"gitId":"whelan-low"},"content":"Format: `/delete_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":121,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"whelan-low"},"content":"- If the module code does not exist, it returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"whelan-low"},"content":"- If the tutorial class within that module code does not exist, it returns an error and the list of tutorial classes in that module code.","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"whelan-low"},"content":"- If no parameters are specified, returns an error","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"qinxutan"},"content":"### Listing all classes: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"qinxutan"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"qinxutan"},"content":"Format: `list_class`","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"qinxutan"},"content":"**BELOW ARE JUST FORMATS FROM ORIGINAL AD3.","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"qinxutan"},"content":"DELETE AFT LAST PERSON IS DONE WITH FEATURES.**","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"Jajared"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"Jajared"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":172,"author":{"gitId":"Jajared"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-05"},{"lineNumber":173,"author":{"gitId":"Jajared"},"content":"- When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-05"},{"lineNumber":174,"author":{"gitId":"Jajared"},"content":"- You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2024-03-05"},{"lineNumber":175,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":179,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":180,"author":{"gitId":"Jajared"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-05"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"Jajared"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"Jajared"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"Jajared"},"content":"- Only the name is searched.","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"Jajared"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"Jajared"},"content":"- Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"Jajared"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"Jajared"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"Jajared"},"content":"- Deletes the person at the specified `INDEX`.","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"Jajared"},"content":"- The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"Jajared"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":213,"author":{"gitId":"Jajared"},"content":"- `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":214,"author":{"gitId":"Jajared"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"qinxutan"},"content":"### Viewing all classes","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"qinxutan"},"content":"Shows all tutorial classes available.","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"qinxutan"},"content":"Format: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"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 AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"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":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"Jajared"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"Jajared"},"content":"| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"Jajared"},"content":"| **Add New Students** | `add_student /name \u003cstudent_name\u003e /email \u003cstudent_email\u003e /id \u003cstudent_id\u003e /tc \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_student /name Dohn Joe /email johndoe@gmail.com /id A0123456A /tc CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"Jajared"},"content":"| **Delete students** | `delete_student \u003c/id, /email\u003e \u003cid or email\u003e`\u003cbr\u003e e.g., `delete_student /id A0259209B` or `/delete_student email johndoe@gmail.com` |","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"Jajared"},"content":"| **Search for students** | `search_student \u003c/id, /email, /tc, /name\u003e \u003csearch_query\u003e`\u003cbr\u003e e.g.,`search_student /id A0123456A` |","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"Jajared"},"content":"| **View all students** | `list_student` |","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"Jajared"},"content":"| **Add new tutorial class** | `add_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"Jajared"},"content":"| **Delete tutorial class** | `delete_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `delete_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"Jajared"},"content":"| **View all classes** | `list_class` |","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":19,"-":137,"Jajared":80,"whelan-low":23}}] +[{"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":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp/graph/badge.svg?token\u003dWAIOG42WJK)](https://codecov.io/gh/AY2324S2-CS2103T-T09-4/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"Jajared"},"content":"# TA Helper","lastModifiedDate":"2024-02-25"},{"lineNumber":5,"author":{"gitId":"Jajared"},"content":"\u003e TA Helper is more than just a tool; it\u0027s your ultimate companion in navigating the complexities of teaching assistance in computer science modules. Embrace the simplicity and efficiency of managing your classes with TA Helper today!","lastModifiedDate":"2024-02-25"},{"lineNumber":6,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":7,"author":{"gitId":"Jajared"},"content":"TA Helper is a comprehensive tool designed to significantly ease the administrative and organizational challenges faced by Teaching Assistants (TAs) handling computer science modules. With its core focus on facilitating the management of student groups and enhancing the efficiency of classroom administration, TA Helper stands as an essential platform for TAs who are tasked with overseeing numerous classes and students.","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"Jajared"},"content":"## User Profile","lastModifiedDate":"2024-02-25"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"Jajared"},"content":"- **Target Users:** Teaching Assistants for Computer Science Modules","lastModifiedDate":"2024-02-25"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"- **Key Challenges:**","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"Jajared"},"content":" - Managing multiple classes and a diverse student body.","lastModifiedDate":"2024-02-25"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":" - Forming student teams for projects or assignments while ensuring fairness.","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":" - Keeping track of student details, progress, grades, and attendance across different modules.","lastModifiedDate":"2024-02-25"},{"lineNumber":18,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":19,"author":{"gitId":"Jajared"},"content":"## Problem Statement","lastModifiedDate":"2024-02-25"},{"lineNumber":20,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"Teaching Assistants often grapple with the complexities of generating and assigning students to teams within their classes. The situation is compounded when TAs manage multiple classes, necessitating a streamlined method to oversee various nominal rolls. A unified platform that provides a holistic view of all student information, across every class, is crucial for effective student management. Additionally, the random yet fair formation of student teams for assessments poses a significant challenge.","lastModifiedDate":"2024-02-25"},{"lineNumber":22,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"## Value Proposition","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"**TA Helper** offers a centralized and user-friendly solution for TAs to manage student information akin to a nominal roll. Its features are tailored to address the specific needs of TAs teaching computer science modules, including but not limited to:","lastModifiedDate":"2024-02-25"},{"lineNumber":26,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":27,"author":{"gitId":"Jajared"},"content":"- **Centralized Student Information:** Store and access contact details and other vital information of students enrolled in the modules you teach, all in one place.","lastModifiedDate":"2024-02-25"},{"lineNumber":28,"author":{"gitId":"Jajared"},"content":"- **Progress Tracking:** Monitor and record the progress of each student, including grades and attendance, ensuring a comprehensive overview of each individual\u0027s academic journey.","lastModifiedDate":"2024-02-25"},{"lineNumber":29,"author":{"gitId":"Jajared"},"content":"- **Multiple Tabs for Different Modules:** Seamlessly manage different groups of students across various modules you\u0027re teaching, with dedicated tabs for each class.","lastModifiedDate":"2024-02-25"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- **Random Team Generator:** Enhance fairness in assessments by utilizing the optional random team generator, which includes features for adding preferences to accommodate specific grouping needs.","lastModifiedDate":"2024-02-25"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":32,"author":{"gitId":"Jajared"},"content":"## Scope","lastModifiedDate":"2024-02-25"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"Jajared"},"content":"The primary scope of **TA Helper** includes:","lastModifiedDate":"2024-02-25"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":36,"author":{"gitId":"Jajared"},"content":"- Managing contact details of students for each module taught by a TA.","lastModifiedDate":"2024-02-25"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":"- Additional functionalities to track student progress, input grades, and monitor attendance.","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"Jajared"},"content":"- Optional feature to generate random teams for projects or assignments, considering fairness and preferences.","lastModifiedDate":"2024-02-25"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"## Getting Started","lastModifiedDate":"2024-02-25"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"To get started with TA Helper, follow these simple steps: To be updated","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":44,"author":{"gitId":"Jajared"},"content":"## References","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"Jajared"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-25"}],"authorContributionMap":{"-":5,"Jajared":40}},{"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":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"Jajared"},"content":"### Jared Wong","lastModifiedDate":"2024-02-25"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/jajared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"Jajared"},"content":"[[homepage](https://jajared.vercel.app/)]","lastModifiedDate":"2024-02-25"},{"lineNumber":17,"author":{"gitId":"Jajared"},"content":"[[github](https://github.com/Jajared)]","lastModifiedDate":"2024-02-25"},{"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":"Jajared"},"content":"- Role: Team Lead","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Overall project coordination and ensure the team is doing well.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"Jajared"},"content":"### Zack Tay","lastModifiedDate":"2024-02-25"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/zack-tay.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"Zack-Tay"},"content":"[[github](http://github.com/Zack-Tay)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"content":"### Tan Qin Xu","lastModifiedDate":"2024-02-25"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":"\u003cimg src\u003d\"images/qinxutan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"qinxutan"},"content":"[[github](http://github.com/qinxutan)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-25"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":"- Role: Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Responsible for the quality of various project documents, including README, User Guide and Developer Guide.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"Jajared"},"content":"### Whelan Low","lastModifiedDate":"2024-02-25"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"whelan-low"},"content":"\u003cimg src\u003d\"images/whelan-low.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"whelan-low"},"content":"[[github](http://github.com/whelan-low)]","lastModifiedDate":"2024-02-25"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Jajared"},"content":"- Role: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":50,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of submitting the deliverables","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"Jajared"},"content":"### Mahadhir","lastModifiedDate":"2024-02-25"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"mahadhir247"},"content":"\u003cimg src\u003d\"images/mahadhir247.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"mahadhir247"},"content":"[[github](http://github.com/mahadhir247)]","lastModifiedDate":"2024-02-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"Jajared"},"content":"- Role: Code quality","lastModifiedDate":"2024-03-05"},{"lineNumber":60,"author":{"gitId":"Jajared"},"content":"- Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. Also in charge of reviewing PRs and testing of project code before upload","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":1,"Zack-Tay":1,"-":34,"Jajared":20,"mahadhir247":2,"whelan-low":2}},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"Jajared"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"Jajared"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"Jajared"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"Jajared"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"Jajared"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"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":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"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":"Jajared"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"Jajared"},"content":"- implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-05"},{"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":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"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":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"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":"Jajared"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-05"},{"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":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"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":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"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":101,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"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":106,"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":107,"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":108,"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":109,"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":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":111,"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":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":118,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"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":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"Jajared"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":135,"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":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"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":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"Jajared"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":151,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"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":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"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":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"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":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"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":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"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":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"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":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"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":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":220,"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":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"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":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"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":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"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":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"Jajared"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"Jajared"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":265,"author":{"gitId":"Jajared"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":266,"author":{"gitId":"Jajared"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":267,"author":{"gitId":"Jajared"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":268,"author":{"gitId":"Jajared"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"Jajared"},"content":"- has a need to manage a significant number of students\u0027 contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"Jajared"},"content":"- prefer desktop apps over other types","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"Jajared"},"content":"- can type fast","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"Jajared"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"Jajared"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"qinxutan"},"content":"**Value proposition**: manage students\u0027contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-02-25"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"qinxutan"},"content":"|----------|---------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-02-25"},{"lineNumber":292,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add new students to a class | maintain an up-to-date list of enrolled students. |","lastModifiedDate":"2024-03-05"},{"lineNumber":293,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | add partial info of students | still add students even if I don’t have all their information. |","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | delete a student from my class if they drop the module/class | keep my class list accurate and up-to-date. |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"qinxutan"},"content":"| `* * ` | TA | search for my students based on their NUS ID, emails, names or tutorial groups | locate details of students without having to go through the entire list |","lastModifiedDate":"2024-02-25"},{"lineNumber":296,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all students and their particulars | have a comprehensive overview of the enrolled students in my class. |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"qinxutan"},"content":"| `* *` | TA | add/remove different modules I am teaching | manage my teaching assignments efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"qinxutan"},"content":"| `* * *` | TA | view all the tutorial classes and their information | visibility into the schedule and details of all tutorial classes. |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":300,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"qinxutan"},"content":"(For all use cases below, the **System** is the `TA Helper` and the **Actor** is the `TA`, unless specified otherwise)","lastModifiedDate":"2024-02-25"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":306,"author":{"gitId":"Jajared"},"content":"#### Use case 1: Add new students","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":308,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":310,"author":{"gitId":"Jajared"},"content":"1. User specifies the student to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"Jajared"},"content":"2. System adds the student to the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"Jajared"},"content":"3. System indicates successful addition of new student.","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":315,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":317,"author":{"gitId":"Jajared"},"content":"- 1a. Student\u0027s name, email, id is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"Jajared"},"content":" - 1a1. Returns an error that informs the user to specify the missing field(s).","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"Jajared"},"content":"- 1b. The specified email and/or id is tagged to an existing student in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"Zack-Tay"},"content":" - 1b1. Returns an error indicating that there is an existing entry with the same value.","lastModifiedDate":"2024-03-04"},{"lineNumber":322,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":323,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"Jajared"},"content":" - 1c1. Return an error indicating that command is not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"Jajared"},"content":"- 2a. Student\u0027s tutorial class is not specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"Jajared"},"content":" - 2a1. System adds student into the list of students.","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"Zack-Tay"},"content":" - 2a2. Student will not be placed under any tutorial group.","lastModifiedDate":"2024-03-04"},{"lineNumber":329,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":330,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":331,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":333,"author":{"gitId":"Jajared"},"content":"#### Use case 2: Delete students","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":335,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":336,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":337,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_student` and specifies the student to be deleted by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jajared"},"content":"2. System deletes the student from the list of students and tutorial group (if any).","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":341,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":343,"author":{"gitId":"Jajared"},"content":"- 1a. User specifies to delete student by student ID.","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jajared"},"content":" - 1a1. Student ID does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jajared"},"content":" - 1a1.1: Returns an error indicating that the student with the provided ID does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jajared"},"content":"- 1b. User specifies to delete student by email.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jajared"},"content":" - 1b1. Email does not exist in the system.","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jajared"},"content":" - 1b1.1. Returns an error indicating that the student with the provided email does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jajared"},"content":"- 1c. Invalid input command. - 1c1: Returns an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":354,"author":{"gitId":"Jajared"},"content":"#### Use case 3: Search for students","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":358,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/search_student` and specifies the student to be searched by the specified parameter.","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Jajared"},"content":"2. System generates a list of matching entries according to specified parameters.","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":362,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":364,"author":{"gitId":"Jajared"},"content":"- 1a. Parameter not specified","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"Jajared"},"content":" - 1a1/2a1. Returns an error indicating that the user needs to specify valid fields.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":367,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"Jajared"},"content":" - 1b1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":370,"author":{"gitId":"Jajared"},"content":"- 2a. Partial match for specified parameter. - 2a1. System will display all matching results for the specified value.","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":373,"author":{"gitId":"Jajared"},"content":"#### Use case 4: View all students","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":375,"author":{"gitId":"Zack-Tay"},"content":"**MSS:**","lastModifiedDate":"2024-03-04"},{"lineNumber":376,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":377,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"Jajared"},"content":"2. System displays all students information (name, email, student id and tutorial class).","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":381,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":383,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"Zack-Tay"},"content":" - Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":386,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"Jajared"},"content":"- 2a. No existing students in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no students in the list. ","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":392,"author":{"gitId":"Jajared"},"content":"#### Use case 5: Add new tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":394,"author":{"gitId":"whelan-low"},"content":"**MSS:**","lastModifiedDate":"2024-02-29"},{"lineNumber":395,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":396,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/add_class` and specifies the tutorial class details to be added.","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Jajared"},"content":"2. System adds the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Jajared"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":400,"author":{"gitId":"whelan-low"},"content":"**Extensions:**","lastModifiedDate":"2024-02-29"},{"lineNumber":401,"author":{"gitId":"Zack-Tay"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":402,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Jajared"},"content":"- 1b. Invalid tutorial class attributes are specified.","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Jajared"},"content":" - 2a1. Returns an error indicating that user has to specify tutorial class in the correct format.","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Jajared"},"content":"- 1c. The specified tutorial class already exists. - 1c1: Returns an error indicating that the tutorial class already exists. - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Jajared"},"content":" \u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"Jajared"},"content":"#### Use case 6: Delete tutorial class","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"Jajared"},"content":"**MSS:**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/delete_class` and specifies the tutorial class to be deleted.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Jajared"},"content":"2. System deletes the tutorial class.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"Jajared"},"content":"**Extensions:**","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Jajared"},"content":"- 1b. The tutorial class specified does not exist.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Jajared"},"content":" - 1b1. Returns an error indicating invalid tutorial class and shows the list of tutorial classes available.","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Jajared"},"content":"\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"Jajared"},"content":"#### Use case 7: View all classes","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"Jajared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Jajared"},"content":"1. User enters the command `/list_class`.","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Jajared"},"content":"2. System shows a list of all available classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"-"},"content":"Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"Jajared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Jajared"},"content":"- 1a. Invalid input command.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Jajared"},"content":" - 1a1. Return an error indicating command not recognised and provides the correct command format.","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Jajared"},"content":" - Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Jajared"},"content":"- 1b. Additional arguments are specified after the command.","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"Jajared"},"content":" - 1b1. System will ignore those arguments and execute /list_students as usual.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"Jajared"},"content":"- 2a. There are no existing classes.","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"Jajared"},"content":" - 2a1. System will return a message indicating that there are no existing classes in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"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":452,"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":453,"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":454,"author":{"gitId":"Zack-Tay"},"content":"4. Should respond to user inputs within approximately 2-3 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"Zack-Tay"},"content":"5. Should not depend on internet access to accomplish its core purpose.","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"Zack-Tay"},"content":"6. Should provide a simple and user-friendly GUI, focusing on readability and ease of use.","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"Zack-Tay"},"content":"7. Should be usable by a person who is TA-ing for the first time.","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"Zack-Tay"},"content":"8. Should provide comprehensive error messages and guidelines to recover from errors due to user input.","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"Zack-Tay"},"content":"9. Should provide a comprehensive and well-designed user documentation to guide users on how to use TAHelper.","lastModifiedDate":"2024-03-05"},{"lineNumber":460,"author":{"gitId":"Zack-Tay"},"content":"10. Should provide a comprehensive and well-designed developer documentation to guide developer on how to improve and develop TAHelper further.","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"Jajared"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":467,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"Zack-Tay"},"content":"* **TA (Teaching Assistant)**: An individual who is responsible for teaching a tutorial class of University students.","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"Zack-Tay"},"content":"* **TAHelper**: A contact management application to help TAs keep track of students in classes they teach","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"Zack-Tay"},"content":"* **GUI**: Graphical User Interface","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"Zack-Tay"},"content":"* **MSS**: Main Success Scenario","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":481,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":482,"author":{"gitId":"Jajared"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"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":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"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":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"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":511,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"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":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"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":516,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","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"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"qinxutan":14,"Zack-Tay":32,"-":333,"Jajared":143,"whelan-low":4}},{"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":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2023-09-12"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"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":"Jajared"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"Jajared"},"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 Address Book.","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Jajared"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"Jajared"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"Jajared"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"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":"Jajared"},"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":"2024-03-05"},{"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":"qinxutan"},"content":"### Adding new students : `add`","lastModifiedDate":"2024-02-25"},{"lineNumber":70,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":71,"author":{"gitId":"Jajared"},"content":"### Deleting students : `delete_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":72,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":73,"author":{"gitId":"Jajared"},"content":"Delete a student contact based on the parameter specified by the user.","lastModifiedDate":"2024-03-05"},{"lineNumber":74,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":75,"author":{"gitId":"Jajared"},"content":"Format: `/delete_student id/STUDENT_ID email/EMAIL`","lastModifiedDate":"2024-03-05"},{"lineNumber":76,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":77,"author":{"gitId":"Jajared"},"content":"- The following parameters to delete a student contact are supported:","lastModifiedDate":"2024-03-05"},{"lineNumber":78,"author":{"gitId":"Jajared"},"content":" 1. Student ID","lastModifiedDate":"2024-03-05"},{"lineNumber":79,"author":{"gitId":"Jajared"},"content":" 2. Email","lastModifiedDate":"2024-03-05"},{"lineNumber":80,"author":{"gitId":"Jajared"},"content":"- Leading/trailing spaces are removed","lastModifiedDate":"2024-03-05"},{"lineNumber":81,"author":{"gitId":"Jajared"},"content":"- The parameter is case insensitive","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"Jajared"},"content":"- If none of the paremeters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":85,"author":{"gitId":"Jajared"},"content":"Upon successful deletion, the command will return a confirmation messaging stating that the specified student contact has been removed.","lastModifiedDate":"2024-03-05"},{"lineNumber":86,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":87,"author":{"gitId":"Jajared"},"content":"Examples:","lastModifiedDate":"2024-03-05"},{"lineNumber":88,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":89,"author":{"gitId":"Jajared"},"content":"- Delete by student ID: `/delete_student id/A01234567X`","lastModifiedDate":"2024-03-05"},{"lineNumber":90,"author":{"gitId":"Jajared"},"content":"- Delete by email: `/delete_student email/e0123456@u.nus.edu`","lastModifiedDate":"2024-03-05"},{"lineNumber":91,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":92,"author":{"gitId":"qinxutan"},"content":"### Searching for students : `search`","lastModifiedDate":"2024-02-25"},{"lineNumber":93,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":94,"author":{"gitId":"Jajared"},"content":"### Listing all students : `list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":95,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":96,"author":{"gitId":"Jajared"},"content":"View the list of all students available","lastModifiedDate":"2024-03-05"},{"lineNumber":97,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":98,"author":{"gitId":"Jajared"},"content":"Format: `/list_student`","lastModifiedDate":"2024-03-05"},{"lineNumber":99,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":100,"author":{"gitId":"Jajared"},"content":"Expected output:","lastModifiedDate":"2024-03-05"},{"lineNumber":101,"author":{"gitId":"Jajared"},"content":"The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently.","lastModifiedDate":"2024-03-05"},{"lineNumber":102,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":103,"author":{"gitId":"whelan-low"},"content":"### Adding new tutorial class : `add_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":105,"author":{"gitId":"whelan-low"},"content":"Adds a tutorial class with the specified module code and name.","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":107,"author":{"gitId":"whelan-low"},"content":"Format: `/add_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"whelan-low"},"content":"- If none of the parameters is specified, or if only one is specified, returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":113,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"whelan-low"},"content":"- `/add_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"whelan-low"},"content":"### Deleting tutorial class : `delete_class`","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"whelan-low"},"content":"Deletes a specified tutorial class from the list of classes.","lastModifiedDate":"2024-02-29"},{"lineNumber":119,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":120,"author":{"gitId":"whelan-low"},"content":"Format: `/delete_class MODULE_CODE TUTORIAL_CLASS`","lastModifiedDate":"2024-02-29"},{"lineNumber":121,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"whelan-low"},"content":"- If the module code does not exist, it returns an error.","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"whelan-low"},"content":"- If the tutorial class within that module code does not exist, it returns an error and the list of tutorial classes in that module code.","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"whelan-low"},"content":"- If no parameters are specified, returns an error","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"whelan-low"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"whelan-low"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":128,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2103T T10`","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"whelan-low"},"content":"- `/delete_class CS2109S T01`","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"qinxutan"},"content":"### Listing all classes: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":132,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":133,"author":{"gitId":"qinxutan"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2024-02-25"},{"lineNumber":134,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":135,"author":{"gitId":"qinxutan"},"content":"Format: `list_class`","lastModifiedDate":"2024-02-25"},{"lineNumber":136,"author":{"gitId":"qinxutan"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":137,"author":{"gitId":"qinxutan"},"content":"**BELOW ARE JUST FORMATS FROM ORIGINAL AD3.","lastModifiedDate":"2024-02-25"},{"lineNumber":138,"author":{"gitId":"qinxutan"},"content":"DELETE AFT LAST PERSON IS DONE WITH FEATURES.**","lastModifiedDate":"2024-02-25"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-25"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":156,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":157,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":161,"author":{"gitId":"Jajared"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2024-03-05"},{"lineNumber":162,"author":{"gitId":"Jajared"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2024-03-05"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"Jajared"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-05"},{"lineNumber":172,"author":{"gitId":"Jajared"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-05"},{"lineNumber":173,"author":{"gitId":"Jajared"},"content":"- When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-05"},{"lineNumber":174,"author":{"gitId":"Jajared"},"content":"- You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2024-03-05"},{"lineNumber":175,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":179,"author":{"gitId":"Jajared"},"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":"2024-03-05"},{"lineNumber":180,"author":{"gitId":"Jajared"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-05"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"Jajared"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":189,"author":{"gitId":"Jajared"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":190,"author":{"gitId":"Jajared"},"content":"- Only the name is searched.","lastModifiedDate":"2024-03-05"},{"lineNumber":191,"author":{"gitId":"Jajared"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-03-05"},{"lineNumber":192,"author":{"gitId":"Jajared"},"content":"- Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-05"},{"lineNumber":193,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":197,"author":{"gitId":"Jajared"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-05"},{"lineNumber":198,"author":{"gitId":"Jajared"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":199,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"Jajared"},"content":"- Deletes the person at the specified `INDEX`.","lastModifiedDate":"2024-03-05"},{"lineNumber":208,"author":{"gitId":"Jajared"},"content":"- The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2024-03-05"},{"lineNumber":209,"author":{"gitId":"Jajared"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-05"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"Jajared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":213,"author":{"gitId":"Jajared"},"content":"- `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":214,"author":{"gitId":"Jajared"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2024-03-05"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"qinxutan"},"content":"### Viewing all classes","lastModifiedDate":"2024-02-25"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"qinxutan"},"content":"Shows all tutorial classes available.","lastModifiedDate":"2024-02-25"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"qinxutan"},"content":"Format: `list`","lastModifiedDate":"2024-02-25"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"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 AddressBook home folder.","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":245,"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":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":247,"author":{"gitId":"Jajared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"Jajared"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"Jajared"},"content":"| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"Jajared"},"content":"| **Add New Students** | `add_student /name \u003cstudent_name\u003e /email \u003cstudent_email\u003e /id \u003cstudent_id\u003e /tc \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_student /name Dohn Joe /email johndoe@gmail.com /id A0123456A /tc CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":254,"author":{"gitId":"Jajared"},"content":"| **Delete students** | `delete_student \u003c/id, /email\u003e \u003cid or email\u003e`\u003cbr\u003e e.g., `delete_student /id A0259209B` or `/delete_student email johndoe@gmail.com` |","lastModifiedDate":"2024-03-05"},{"lineNumber":255,"author":{"gitId":"Jajared"},"content":"| **Search for students** | `search_student \u003c/id, /email, /tc, /name\u003e \u003csearch_query\u003e`\u003cbr\u003e e.g.,`search_student /id A0123456A` |","lastModifiedDate":"2024-03-05"},{"lineNumber":256,"author":{"gitId":"Jajared"},"content":"| **View all students** | `list_student` |","lastModifiedDate":"2024-03-05"},{"lineNumber":257,"author":{"gitId":"Jajared"},"content":"| **Add new tutorial class** | `add_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `add_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":258,"author":{"gitId":"Jajared"},"content":"| **Delete tutorial class** | `delete_class \u003cmodule_code\u003e \u003ctutorial_class\u003e` \u003cbr\u003e e.g., `delete_class CS2103T T09` |","lastModifiedDate":"2024-03-05"},{"lineNumber":259,"author":{"gitId":"Jajared"},"content":"| **View all classes** | `list_class` |","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"qinxutan":19,"-":137,"Jajared":80,"whelan-low":23}}] diff --git a/AY2324S2-CS2103T-T09-4_tp_master/commits.json b/AY2324S2-CS2103T-T09-4_tp_master/commits.json index ddca7b0f..08c44e30 100644 --- a/AY2324S2-CS2103T-T09-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T09-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"qinxutan":[{"date":"2024-02-25","commitResults":[{"hash":"8cf8561c7e10bfff4fa6fc2f18d6c9dd01fb85a6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"7b8fb6cc9a5f60b76e537592ec7eb9dd9c641e06","isMergeCommit":true,"messageTitle":"Merge pull request #16 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"9ba53f8ad0bea91b3574e3021ddb93e2d9fb2831","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge updates","fileTypesAndContributionMap":{}},{"hash":"13310ca30632f59453ae7af56a79f1273d579e24","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"b5d4ef6f2d25acef07fb77067b9aa4f42ddf8e5b","isMergeCommit":true,"messageTitle":"Merge pull request #18 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"7c49fe99cc4929cae3ac8b8ad88a98ce12ea52fc","isMergeCommit":false,"messageTitle":"Edit UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":23}}},{"hash":"5953e52547f50c92a46d63d5033290df9a8a4d1e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from qinxutan/update-userguide","messageBody":"Edit UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"322ed9a1ee050961b6a2de83a47fd609d9a010b7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":32,"deletions":19}}},{"hash":"66b392245bd82e6b4623866838c4c4de7bda58c9","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":6}}},{"hash":"47c1a3a8b831393efbd00cda9c4dd2c3fd207b7a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from qinxutan/update-developerguide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8d33257b0c6979035a45cdc8d2e61c6744fd017e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from qinxutan/update-userguide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f0887f9aee1f9d42fb27c8655ba1e1e4593aa3e2","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T09-4/master","messageBody":"merge","fileTypesAndContributionMap":{}},{"hash":"f55ae2dd8279bb7ed9b18d5116bd694b87a2e2af","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Jajared/jared/update-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14b76a0aef7cded69a32b4c11a9039eba0cdb6d7","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge","fileTypesAndContributionMap":{}},{"hash":"d2dc77c45f9d0017b974509201e34a98761715e5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-ug-view-students","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a29fd7a4a309efd94b08a3c4381f87a8bef16348","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Jajared/jared/update-ug-view-students","messageBody":"Update user guide for view students and delete student","fileTypesAndContributionMap":{}},{"hash":"47c27cc8483bcd310fe4f924318d9feda18afd76","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"725f019bb0766e132855c54f7db5bc594f465392","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-userguide","messageBody":"","fileTypesAndContributionMap":{}}]}],"Zack-Tay":[{"date":"2024-02-28","commitResults":[{"hash":"124e22b073232d9f0175858f6f45acc08554b81a","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add profile image (#22)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"80ed63422879aa59e7c881c7571644b9d1bca339","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md define use cases (#29)","messageBody":"* Define use cases 1 to 4 of TAHelper.\r\n* Add extensions to handle exception cases.","fileTypesAndContributionMap":{"docs":{"insertions":79,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"130dc070adaff01de9751263860d1f5a8c3759a2","isMergeCommit":true,"messageTitle":"Merge pull request #36 from qinxutan/update-userguide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"Jajared":[{"date":"2024-02-25","commitResults":[{"hash":"7b58c9a89dddf1ab0b9c028c86724e4fde40f9c1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"9df8ccacfe7bef4b106a55d0386fcdfc4b74805e","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2c481ab2424fbce6d8aa94e6971600dced4758bc","isMergeCommit":false,"messageTitle":"refactor: Update user image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":13}}},{"hash":"0e57535769744904ec281aef2e61fca0ff87f9a8","isMergeCommit":false,"messageTitle":"docs: Update ug for view students and delete student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":54}}}]}],"mahadhir247":[{"date":"2024-02-28","commitResults":[{"hash":"724c28bc143ea9be0650fb3ca3c36a0aeb076a3c","isMergeCommit":false,"messageTitle":"Add profile picture and Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"e1e643722b1c58bbf1b2226aca7c2f09ae64b12f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from mahadhir247/master","messageBody":"Add profile picture and Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"whelan-low":[{"date":"2024-02-25","commitResults":[{"hash":"8ef80750b53c2f5bc5b75948023b8b9dea6d3bb2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"758d9336292f5f444d18c572fda28b62cc1396d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c59bb41cc1b3aa6fbb17955a02e8312b6c9ffb3a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c77d366cb59bb562cb3137a30dd231a1d92be3af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"c67b3a97551c9b4a118d76e38cd25a515ddb9a6a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"66220294ee0622a4d6b9257e20682ab23a58500d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]},{"date":"2024-02-29","commitResults":[{"hash":"3f01b06e9f785754de7d4ed7805e1159a883c4ef","isMergeCommit":false,"messageTitle":"Added user guide section for add and delete classes (#25)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":2}}},{"hash":"b783a968501fdb14e2b65105b639747afb0c2a54","isMergeCommit":false,"messageTitle":"Update Use cases for developer guide (#24)","messageBody":"Co-authored-by: Jajabonks \u003c84561814+Jajared@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":0}}}]}]},"authorFileTypeContributionMap":{"qinxutan":{"docs":51,"functional-code":0,"test-code":0},"Zack-Tay":{"docs":77,"functional-code":0,"test-code":0},"Jajared":{"docs":140,"functional-code":0,"test-code":0},"mahadhir247":{"docs":2,"functional-code":0,"test-code":0},"whelan-low":{"docs":42,"functional-code":0,"test-code":0}},"authorContributionVariance":{"qinxutan":1109.2427,"Zack-Tay":510.30563,"Jajared":2277.0762,"mahadhir247":1.2222221,"whelan-low":192.07635},"authorDisplayNameMap":{"qinxutan":"CS2103T-T09-4 TAN ..N XU","Zack-Tay":"CS2103T-T09-4 TAY .. KAI","Jajared":"CS2103T-T09-4 JARE.. JIE","mahadhir247":"CS2103T-T09-4 MAHA..MAIL","whelan-low":"CS2103T-T09-4 LOW ..ELAN"}} +{"authorDailyContributionsMap":{"qinxutan":[{"date":"2024-02-25","commitResults":[{"hash":"8cf8561c7e10bfff4fa6fc2f18d6c9dd01fb85a6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"7b8fb6cc9a5f60b76e537592ec7eb9dd9c641e06","isMergeCommit":true,"messageTitle":"Merge pull request #16 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"9ba53f8ad0bea91b3574e3021ddb93e2d9fb2831","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge updates","fileTypesAndContributionMap":{}},{"hash":"13310ca30632f59453ae7af56a79f1273d579e24","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"b5d4ef6f2d25acef07fb77067b9aa4f42ddf8e5b","isMergeCommit":true,"messageTitle":"Merge pull request #18 from qinxutan/update-aboutus","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"7c49fe99cc4929cae3ac8b8ad88a98ce12ea52fc","isMergeCommit":false,"messageTitle":"Edit UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":23}}},{"hash":"5953e52547f50c92a46d63d5033290df9a8a4d1e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from qinxutan/update-userguide","messageBody":"Edit UserGuide.md","fileTypesAndContributionMap":{}},{"hash":"322ed9a1ee050961b6a2de83a47fd609d9a010b7","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":32,"deletions":19}}},{"hash":"66b392245bd82e6b4623866838c4c4de7bda58c9","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":6}}},{"hash":"47c1a3a8b831393efbd00cda9c4dd2c3fd207b7a","isMergeCommit":true,"messageTitle":"Merge pull request #20 from qinxutan/update-developerguide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8d33257b0c6979035a45cdc8d2e61c6744fd017e","isMergeCommit":true,"messageTitle":"Merge pull request #21 from qinxutan/update-userguide","messageBody":"Update UserGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f0887f9aee1f9d42fb27c8655ba1e1e4593aa3e2","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-T09-4/master","messageBody":"merge","fileTypesAndContributionMap":{}},{"hash":"f55ae2dd8279bb7ed9b18d5116bd694b87a2e2af","isMergeCommit":true,"messageTitle":"Merge pull request #33 from Jajared/jared/update-about-us","messageBody":"Update about us","fileTypesAndContributionMap":{}},{"hash":"14b76a0aef7cded69a32b4c11a9039eba0cdb6d7","isMergeCommit":true,"messageTitle":"Merge pull request #3 from AY2324S2-CS2103T-T09-4/master","messageBody":"Merge","fileTypesAndContributionMap":{}},{"hash":"d2dc77c45f9d0017b974509201e34a98761715e5","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-ug-view-students","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a29fd7a4a309efd94b08a3c4381f87a8bef16348","isMergeCommit":true,"messageTitle":"Merge pull request #35 from Jajared/jared/update-ug-view-students","messageBody":"Update user guide for view students and delete student","fileTypesAndContributionMap":{}},{"hash":"47c27cc8483bcd310fe4f924318d9feda18afd76","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"725f019bb0766e132855c54f7db5bc594f465392","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-userguide","messageBody":"","fileTypesAndContributionMap":{}}]}],"Zack-Tay":[{"date":"2024-02-28","commitResults":[{"hash":"124e22b073232d9f0175858f6f45acc08554b81a","isMergeCommit":false,"messageTitle":"Update AboutUs.md and Add profile image (#22)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]},{"date":"2024-03-04","commitResults":[{"hash":"80ed63422879aa59e7c881c7571644b9d1bca339","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md define use cases (#29)","messageBody":"* Define use cases 1 to 4 of TAHelper.\r\n* Add extensions to handle exception cases.","fileTypesAndContributionMap":{"docs":{"insertions":79,"deletions":3}}}]},{"date":"2024-03-05","commitResults":[{"hash":"130dc070adaff01de9751263860d1f5a8c3759a2","isMergeCommit":true,"messageTitle":"Merge pull request #36 from qinxutan/update-userguide","messageBody":"Update User Stories in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"79f9ea1582e2978dcf7046b75c30232524c16f66","isMergeCommit":false,"messageTitle":"Update Glossary and NFR in DeveloperGuide.md (#38)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":19}}},{"hash":"0e6ea15cb7625ebd488f75efe48860533ca2a66b","isMergeCommit":true,"messageTitle":"Merge pull request #37 from Jajared/jared/update-dg-use-cases","messageBody":"Update use cases in developers guide","fileTypesAndContributionMap":{}}]}],"Jajared":[{"date":"2024-02-25","commitResults":[{"hash":"7b58c9a89dddf1ab0b9c028c86724e4fde40f9c1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"9df8ccacfe7bef4b106a55d0386fcdfc4b74805e","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":40,"deletions":10}}}]},{"date":"2024-03-05","commitResults":[{"hash":"2c481ab2424fbce6d8aa94e6971600dced4758bc","isMergeCommit":false,"messageTitle":"refactor: Update user image","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":13}}},{"hash":"0e57535769744904ec281aef2e61fca0ff87f9a8","isMergeCommit":false,"messageTitle":"docs: Update ug for view students and delete student","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":84,"deletions":54}}},{"hash":"f0ba81f55907ab163736d13709c05e038e8cbbdf","isMergeCommit":false,"messageTitle":"docs: Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":160,"deletions":148}}},{"hash":"4de84173a251707c6d7e179f8282d808db565cfb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0525f4d849bb83c1ae2232fd5d8bcaf479d48b9e","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into jared/update-dg-use-cases","messageBody":"","fileTypesAndContributionMap":{}}]}],"mahadhir247":[{"date":"2024-02-28","commitResults":[{"hash":"724c28bc143ea9be0650fb3ca3c36a0aeb076a3c","isMergeCommit":false,"messageTitle":"Add profile picture and Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"e1e643722b1c58bbf1b2226aca7c2f09ae64b12f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from mahadhir247/master","messageBody":"Add profile picture and Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"whelan-low":[{"date":"2024-02-25","commitResults":[{"hash":"8ef80750b53c2f5bc5b75948023b8b9dea6d3bb2","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"758d9336292f5f444d18c572fda28b62cc1396d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c59bb41cc1b3aa6fbb17955a02e8312b6c9ffb3a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c77d366cb59bb562cb3137a30dd231a1d92be3af","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"c67b3a97551c9b4a118d76e38cd25a515ddb9a6a","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"66220294ee0622a4d6b9257e20682ab23a58500d","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}}]},{"date":"2024-02-29","commitResults":[{"hash":"3f01b06e9f785754de7d4ed7805e1159a883c4ef","isMergeCommit":false,"messageTitle":"Added user guide section for add and delete classes (#25)","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":2}}},{"hash":"b783a968501fdb14e2b65105b639747afb0c2a54","isMergeCommit":false,"messageTitle":"Update Use cases for developer guide (#24)","messageBody":"Co-authored-by: Jajabonks \u003c84561814+Jajared@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":0}}}]}]},"authorFileTypeContributionMap":{"qinxutan":{"docs":34,"functional-code":0,"test-code":0},"Zack-Tay":{"docs":33,"functional-code":0,"test-code":0},"Jajared":{"docs":283,"functional-code":0,"test-code":0},"mahadhir247":{"docs":2,"functional-code":0,"test-code":0},"whelan-low":{"docs":29,"functional-code":0,"test-code":0}},"authorContributionVariance":{"qinxutan":1109.2427,"Zack-Tay":635.1875,"Jajared":16996.908,"mahadhir247":1.2222221,"whelan-low":192.07635},"authorDisplayNameMap":{"qinxutan":"CS2103T-T09-4 TAN ..N XU","Zack-Tay":"CS2103T-T09-4 TAY .. KAI","Jajared":"CS2103T-T09-4 JARE.. JIE","mahadhir247":"CS2103T-T09-4 MAHA..MAIL","whelan-low":"CS2103T-T09-4 LOW ..ELAN"}} diff --git a/AY2324S2-CS2103T-T13-3_tp_master/authorship.json b/AY2324S2-CS2103T-T13-3_tp_master/authorship.json index e10d7ecd..eef7f9e2 100644 --- a/AY2324S2-CS2103T-T13-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T13-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ibnu2651"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T13-3/tp/actions)","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"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":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":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"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":"-"},"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":15,"author":{"gitId":"ibnu2651"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"ibnu2651":2,"-":13}},{"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":"kaiyi27"},"content":"### Teoh Kai Yi","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaiyi27"},"content":"\u003cimg src\u003d\"images/kaiyi27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"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":"kaiyi27"},"content":"[[github](https://github.com/kaiyi27)]","lastModifiedDate":"2024-03-02"},{"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: Developer","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"kaiyi27"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"ibnu2651"},"content":"### Ibnu Taimiyyah Bin Adam","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ibnu2651"},"content":"\u003cimg src\u003d\"images/ibnu2651.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ibnu2651"},"content":"[[github](https://github.com/ibnu2651)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ibnu2651"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ibnu2651"},"content":"### Jane Doe","lastModifiedDate":"2024-03-03"},{"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)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"ibnu2651"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"kaiyi27":4,"ibnu2651":6,"-":32}},{"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":"ibnu2651"},"content":"# Insura-Connect Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a…​ | I want to…​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"kaiyi27"},"content":"|----------|-------------------------------------------|---------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":292,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | fast typing user | have a CLI | use the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":293,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | busy user | clear all my data quickly | quickly restart a new list of contacts |","lastModifiedDate":"2024-03-02"},{"lineNumber":294,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | see my relationship with my contacts | know who they are |","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | find a certain client based on a keyword | easier to find the client |","lastModifiedDate":"2024-03-02"},{"lineNumber":296,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | save and retrieve information | use the app in multiple sessions |","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | add data about clients to the application | record information about my client |","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | see what the app will look like with sample data | more easily understand the potential features |","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | have a tutorial of the basic features | get started with using the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access a help page with basic commands | familiarize myself with how to use the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":301,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | track my client information | manage my work using the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":302,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access past activity since app installation | see my current progress |","lastModifiedDate":"2024-03-02"},{"lineNumber":303,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | save similar client information data into a group | manage them easily |","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | reorganize my list of contacts | access them more clearly and efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | edit my contacts as a group | easier to implement changes if something in common in the group changes |","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"kaiyi27"},"content":"| `* *` | careless user | have an undo command | prevent doing some mistake |","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | filter client information | sort my client information according to some condition |","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | record if I am successful in securing an agreement | know I have succeeded at my job |","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"kaiyi27"},"content":"| `*` | busy user | autocomplete my commands | type commands faster |","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | tag my clients | classify common groups |","lastModifiedDate":"2024-03-02"},{"lineNumber":311,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | have common use shortcut keys command | access the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":312,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | track progress of engagements via tags | monitor the progress of different engagements with clients |","lastModifiedDate":"2024-03-02"},{"lineNumber":313,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | copy information/features to another client | reduce the time used |","lastModifiedDate":"2024-03-02"},{"lineNumber":314,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | quickly differentiate between clients and business partners | differentiate between them |","lastModifiedDate":"2024-03-02"},{"lineNumber":315,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | rate clients for effective feedback | provide feedback efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | customize the app’s theme | better suits my preferences |","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create shortcuts for tasks | save time on frequently performed tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"kaiyi27"},"content":"| `*` | long-time user | archive/hide unused data | not distracted by irrelevant data |","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | have templates for adding contacts | contacts are standardized and easier to read |","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | schedule weekly check-ins with clients | do not forget about them |","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | have reminders for meetings with clients | organize and plan my time well |","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create automated task workflows | save time on performing repeated tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | see a competency rating based on past successes | know if I need to improve |","lastModifiedDate":"2024-03-02"},{"lineNumber":324,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | find clients based on different filters | better focus on one particular group |","lastModifiedDate":"2024-03-02"},{"lineNumber":325,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | disable unnecessary features | the application is more customized and simpler to use |","lastModifiedDate":"2024-03-02"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"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":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"kaiyi27"},"content":"**Use case: List out the contact information**","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"kaiyi27"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"kaiyi27"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"kaiyi27"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"kaiyi27"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"ibnu2651"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"ibnu2651"},"content":"**Use case: Filter the list of clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"ibnu2651"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"ibnu2651"},"content":"1. User requests to filter list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"ibnu2651"},"content":"2. AddressBook shows a list of persons that satisfy the filter","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"ibnu2651"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"kaiyi27"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"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":388,"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":389,"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":390,"author":{"gitId":"ibnu2651"},"content":"4. The response to any use action should become visible within 5 seconds.","lastModifiedDate":"2024-03-03"},{"lineNumber":391,"author":{"gitId":"ibnu2651"},"content":"5. Should have a user-friendly interface that is easy to navigate and understand.","lastModifiedDate":"2024-03-03"},{"lineNumber":392,"author":{"gitId":"ibnu2651"},"content":"6. Should be stable and not crash or lose data under normal use.","lastModifiedDate":"2024-03-03"},{"lineNumber":393,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":400,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":410,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":411,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"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":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"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":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"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":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"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":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"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":445,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"kaiyi27":49,"ibnu2651":20,"-":386}},{"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\"\u003eInsura-Connect\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"ibnu2651"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-T13-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-03"},{"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":{"ibnu2651":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ibnu2651"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T13-3/tp/actions)","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"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":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":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"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":"-"},"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":15,"author":{"gitId":"ibnu2651"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-03"}],"authorContributionMap":{"ibnu2651":2,"-":13}},{"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":"kaiyi27"},"content":"### Teoh Kai Yi","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaiyi27"},"content":"\u003cimg src\u003d\"images/kaiyi27.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"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":"kaiyi27"},"content":"[[github](https://github.com/kaiyi27)]","lastModifiedDate":"2024-03-02"},{"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: Developer","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"kaiyi27"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"ibnu2651"},"content":"### Ibnu Taimiyyah Bin Adam","lastModifiedDate":"2024-03-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"ibnu2651"},"content":"\u003cimg src\u003d\"images/ibnu2651.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"ibnu2651"},"content":"[[github](https://github.com/ibnu2651)]","lastModifiedDate":"2024-03-03"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"ibnu2651"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-03"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Shauryan123"},"content":"### Shauryan Agrawal","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Shauryan123"},"content":"\u003cimg src\u003d\"images/Shauryan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"Shauryan123"},"content":"* Responsibilities:","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Shauryan123":3,"kaiyi27":4,"ibnu2651":4,"-":31}},{"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":"ibnu2651"},"content":"# Insura-Connect Developer Guide","lastModifiedDate":"2024-03-03"},{"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":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a…​ | I want to…​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"kaiyi27"},"content":"|----------|-------------------------------------------|---------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":292,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | fast typing user | have a CLI | use the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":293,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | busy user | clear all my data quickly | quickly restart a new list of contacts |","lastModifiedDate":"2024-03-02"},{"lineNumber":294,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | see my relationship with my contacts | know who they are |","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | find a certain client based on a keyword | easier to find the client |","lastModifiedDate":"2024-03-02"},{"lineNumber":296,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | save and retrieve information | use the app in multiple sessions |","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"kaiyi27"},"content":"| `* * *` | intermediate user | add data about clients to the application | record information about my client |","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | see what the app will look like with sample data | more easily understand the potential features |","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | have a tutorial of the basic features | get started with using the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access a help page with basic commands | familiarize myself with how to use the app |","lastModifiedDate":"2024-03-02"},{"lineNumber":301,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | track my client information | manage my work using the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":302,"author":{"gitId":"kaiyi27"},"content":"| `* *` | exploring the app | access past activity since app installation | see my current progress |","lastModifiedDate":"2024-03-02"},{"lineNumber":303,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | save similar client information data into a group | manage them easily |","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | reorganize my list of contacts | access them more clearly and efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | edit my contacts as a group | easier to implement changes if something in common in the group changes |","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"kaiyi27"},"content":"| `* *` | careless user | have an undo command | prevent doing some mistake |","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"kaiyi27"},"content":"| `* *` | intermediate user | filter client information | sort my client information according to some condition |","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | record if I am successful in securing an agreement | know I have succeeded at my job |","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"kaiyi27"},"content":"| `*` | busy user | autocomplete my commands | type commands faster |","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | tag my clients | classify common groups |","lastModifiedDate":"2024-03-02"},{"lineNumber":311,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | have common use shortcut keys command | access the app more efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":312,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | track progress of engagements via tags | monitor the progress of different engagements with clients |","lastModifiedDate":"2024-03-02"},{"lineNumber":313,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | copy information/features to another client | reduce the time used |","lastModifiedDate":"2024-03-02"},{"lineNumber":314,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | quickly differentiate between clients and business partners | differentiate between them |","lastModifiedDate":"2024-03-02"},{"lineNumber":315,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | rate clients for effective feedback | provide feedback efficiently |","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"kaiyi27"},"content":"| `*` | intermediate user | customize the app’s theme | better suits my preferences |","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create shortcuts for tasks | save time on frequently performed tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"kaiyi27"},"content":"| `*` | long-time user | archive/hide unused data | not distracted by irrelevant data |","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | have templates for adding contacts | contacts are standardized and easier to read |","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"kaiyi27"},"content":"| `*` | frequent user | schedule weekly check-ins with clients | do not forget about them |","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | have reminders for meetings with clients | organize and plan my time well |","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | create automated task workflows | save time on performing repeated tasks |","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | see a competency rating based on past successes | know if I need to improve |","lastModifiedDate":"2024-03-02"},{"lineNumber":324,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | find clients based on different filters | better focus on one particular group |","lastModifiedDate":"2024-03-02"},{"lineNumber":325,"author":{"gitId":"kaiyi27"},"content":"| `*` | expert user | disable unnecessary features | the application is more customized and simpler to use |","lastModifiedDate":"2024-03-02"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"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":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"kaiyi27"},"content":"**Use case: List out the contact information**","lastModifiedDate":"2024-03-03"},{"lineNumber":356,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":357,"author":{"gitId":"kaiyi27"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":358,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":359,"author":{"gitId":"kaiyi27"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-03"},{"lineNumber":360,"author":{"gitId":"kaiyi27"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":361,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":362,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":363,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":364,"author":{"gitId":"kaiyi27"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":365,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":366,"author":{"gitId":"ibnu2651"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":367,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":368,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":369,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":370,"author":{"gitId":"ibnu2651"},"content":"**Use case: Filter the list of clients**","lastModifiedDate":"2024-03-03"},{"lineNumber":371,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":372,"author":{"gitId":"ibnu2651"},"content":"**MSS**","lastModifiedDate":"2024-03-03"},{"lineNumber":373,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":374,"author":{"gitId":"ibnu2651"},"content":"1. User requests to filter list of persons","lastModifiedDate":"2024-03-03"},{"lineNumber":375,"author":{"gitId":"ibnu2651"},"content":"2. AddressBook shows a list of persons that satisfy the filter","lastModifiedDate":"2024-03-03"},{"lineNumber":376,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":377,"author":{"gitId":"ibnu2651"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":378,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":379,"author":{"gitId":"ibnu2651"},"content":"**Extensions**","lastModifiedDate":"2024-03-03"},{"lineNumber":380,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":381,"author":{"gitId":"kaiyi27"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-03"},{"lineNumber":382,"author":{"gitId":"kaiyi27"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":383,"author":{"gitId":"kaiyi27"},"content":" Use case ends.","lastModifiedDate":"2024-03-03"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"Shauryan123"},"content":"**Use case: Add a new person**","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"Shauryan123"},"content":"1. User requests to add a new person.","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook prompts the user to enter the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"Shauryan123"},"content":"3. User enters the details of the person.","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook adds the new person to the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"Shauryan123"},"content":"* 3a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"Shauryan123"},"content":" * 3a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 3.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"Shauryan123"},"content":"**Use case: Update a person\u0027s details**","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"Shauryan123"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"Shauryan123"},"content":"1. User requests to list persons..","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"Shauryan123"},"content":"2. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"Shauryan123"},"content":"3. User requests to update the details of a specific person in the list.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"Shauryan123"},"content":"4. AddressBook prompts the user to enter the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"Shauryan123"},"content":"5. User enters the new details.","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"Shauryan123"},"content":"6. AddressBook updates the person\u0027s details.","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"Shauryan123"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"Shauryan123"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"Shauryan123"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"Shauryan123"},"content":"* 3a. The given index is invalid..","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"Shauryan123"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"Shauryan123"},"content":"* 5a. The user enters invalid details.","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"Shauryan123"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"Shauryan123"},"content":" * 5a2. AddressBook prompts the user to enter the details again.","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"Shauryan123"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"Shauryan123"},"content":" ","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"Shauryan123"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"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":444,"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":445,"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":446,"author":{"gitId":"ibnu2651"},"content":"4. The response to any use action should become visible within 5 seconds.","lastModifiedDate":"2024-03-03"},{"lineNumber":447,"author":{"gitId":"ibnu2651"},"content":"5. Should have a user-friendly interface that is easy to navigate and understand.","lastModifiedDate":"2024-03-03"},{"lineNumber":448,"author":{"gitId":"ibnu2651"},"content":"6. Should be stable and not crash or lose data under normal use.","lastModifiedDate":"2024-03-03"},{"lineNumber":449,"author":{"gitId":"Shauryan123"},"content":"7. Should be able to handle increasing amounts of data and users without significant degradation in performance (Scalability).","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"Shauryan123"},"content":"8. Should protect sensitive data and prevent unauthorized access, ensuring data integrity and confidentiality (Security).","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"Shauryan123"},"content":"9. Should be easy to maintain, with clear documentation and a modular design that allows for easy updates and fixes .","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"Shauryan123"},"content":"10. Should be accessible to users with disabilities, following guidelines such as the Web Content Accessibility Guidelines (WCAG).","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ibnu2651"},"content":"","lastModifiedDate":"2024-03-03"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":460,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":470,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":471,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"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":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"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":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"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":500,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"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":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"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":505,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"Shauryan123":59,"kaiyi27":49,"ibnu2651":20,"-":387}},{"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\"\u003eInsura-Connect\u003c/a\u003e","lastModifiedDate":"2024-02-18"},{"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":"ibnu2651"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-T13-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-03"},{"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":{"ibnu2651":1,"-":66}}] diff --git a/AY2324S2-CS2103T-T13-3_tp_master/commits.json b/AY2324S2-CS2103T-T13-3_tp_master/commits.json index 55be90c3..3c4aeb4b 100644 --- a/AY2324S2-CS2103T-T13-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T13-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Shauryan123":[],"kaiyi27":[{"date":"2024-03-02","commitResults":[{"hash":"2b709c27cdc0e467935fab1c304ae051db9460b4","isMergeCommit":false,"messageTitle":"Update the information in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"684854fd649bd41c769dac772c157a435c64aa3c","isMergeCommit":false,"messageTitle":"Update the role in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"33ba8c517ca9bf95e514edd7bff76ee59ec3fdea","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":9}}}]},{"date":"2024-03-03","commitResults":[{"hash":"ba193c6471d9428566087a7aa3533551937a708c","isMergeCommit":false,"messageTitle":"Add list use case into DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":1}}},{"hash":"8cab7ca2a32c8f2a049f6d0546caf879c318fb4d","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}}]}],"ibnu2651":[{"date":"2024-03-03","commitResults":[{"hash":"332f64d287ee64b1cebb86e021ce954e3020482d","isMergeCommit":true,"messageTitle":"Merge pull request #8 from kaiyi27/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}},{"hash":"c084f1ee4ed2c7f1ceba0373852f3e3de87e8b1c","isMergeCommit":false,"messageTitle":"Add Ibnu\u0027s details to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":26}}},{"hash":"a7908bdb075a4686c142535b04ea8ae0121044f3","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"66a785617d6e30c9c5ca2be74f9f242324f5ba89","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5d069e37e88e4930db97f644654f6157ee0b6884","isMergeCommit":false,"messageTitle":"Update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"47a6255e56b86124d2b3ebd9d38b904fb6478ed9","isMergeCommit":false,"messageTitle":"Update NFR for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"743be88c300f7b9de1589b26cc814d63d42ae318","isMergeCommit":false,"messageTitle":"Add use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":1}}}]}],"justincred":[]},"authorFileTypeContributionMap":{"Shauryan123":{"docs":0,"functional-code":0,"test-code":0},"kaiyi27":{"docs":53,"functional-code":0,"test-code":0},"ibnu2651":{"docs":29,"functional-code":0,"test-code":0},"justincred":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Shauryan123":0.0,"kaiyi27":266.49,"ibnu2651":324.0,"justincred":0.0},"authorDisplayNameMap":{"Shauryan123":"CS2103T-T13-3 AGRA..RYAN","kaiyi27":"CS2103T-T13-3 TEOH..I YI","ibnu2651":"CS2103T-T13-3 IBNU..ADAM","justincred":"CS2103T-T13-3 JUST..HWEI"}} +{"authorDailyContributionsMap":{"Shauryan123":[{"date":"2024-03-05","commitResults":[{"hash":"e1a2a39cacb0e720e3ad334bbe26deeadb1a70f0","isMergeCommit":false,"messageTitle":"Update Shauryan\u0027s Details in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1d05c2fda6e1f6be4af0cc0a8f4952f56d6a778b","isMergeCommit":false,"messageTitle":"Update NFRs for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":0}}},{"hash":"ccaff0de905fee27e17894e4f65c41522ab4dbcc","isMergeCommit":false,"messageTitle":"Add use cases for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":0}}}]}],"kaiyi27":[{"date":"2024-03-02","commitResults":[{"hash":"2b709c27cdc0e467935fab1c304ae051db9460b4","isMergeCommit":false,"messageTitle":"Update the information in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"684854fd649bd41c769dac772c157a435c64aa3c","isMergeCommit":false,"messageTitle":"Update the role in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"33ba8c517ca9bf95e514edd7bff76ee59ec3fdea","isMergeCommit":false,"messageTitle":"Update User Stories in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":9}}}]},{"date":"2024-03-03","commitResults":[{"hash":"ba193c6471d9428566087a7aa3533551937a708c","isMergeCommit":false,"messageTitle":"Add list use case into DeveloperGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":1}}},{"hash":"8cab7ca2a32c8f2a049f6d0546caf879c318fb4d","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ibnu2651/branch-v1.1","messageBody":"Branch v1.1","fileTypesAndContributionMap":{}}]}],"ibnu2651":[{"date":"2024-03-03","commitResults":[{"hash":"332f64d287ee64b1cebb86e021ce954e3020482d","isMergeCommit":true,"messageTitle":"Merge pull request #8 from kaiyi27/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}},{"hash":"c084f1ee4ed2c7f1ceba0373852f3e3de87e8b1c","isMergeCommit":false,"messageTitle":"Add Ibnu\u0027s details to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":26}}},{"hash":"a7908bdb075a4686c142535b04ea8ae0121044f3","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"66a785617d6e30c9c5ca2be74f9f242324f5ba89","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5d069e37e88e4930db97f644654f6157ee0b6884","isMergeCommit":false,"messageTitle":"Update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"47a6255e56b86124d2b3ebd9d38b904fb6478ed9","isMergeCommit":false,"messageTitle":"Update NFR for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"743be88c300f7b9de1589b26cc814d63d42ae318","isMergeCommit":false,"messageTitle":"Add use case for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"02649cf841f03825e98dd4a6a87a0d38f74c9881","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Shauryan123/branch-v1.1","messageBody":"Merge Branch v1.1","fileTypesAndContributionMap":{}}]}],"justincred":[]},"authorFileTypeContributionMap":{"Shauryan123":{"docs":62,"functional-code":0,"test-code":0},"kaiyi27":{"docs":53,"functional-code":0,"test-code":0},"ibnu2651":{"docs":27,"functional-code":0,"test-code":0},"justincred":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Shauryan123":353.2222,"kaiyi27":228.6875,"ibnu2651":275.0,"justincred":0.0},"authorDisplayNameMap":{"Shauryan123":"CS2103T-T13-3 AGRA..RYAN","kaiyi27":"CS2103T-T13-3 TEOH..I YI","ibnu2651":"CS2103T-T13-3 IBNU..ADAM","justincred":"CS2103T-T13-3 JUST..HWEI"}} diff --git a/AY2324S2-CS2103T-T15-1_tp_master/authorship.json b/AY2324S2-CS2103T-T15-1_tp_master/authorship.json index e2ad7867..96db15f4 100644 --- a/AY2324S2-CS2103T-T15-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T15-1_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":"ararchch"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T15-1/tp/graph/badge.svg?token\u003dTJTWL1WNJF)](https://codecov.io/gh/AY2324S2-CS2103T-T15-1/tp)","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-02-26"},{"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":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"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":12,"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":13,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"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":16,"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"}],"authorContributionMap":{"-":14,"ararchch":2}},{"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":"alfaloo"},"content":"### Zhiyang Lu","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"alfaloo"},"content":"\u003cimg src\u003d\"images/alfaloo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"alfaloo"},"content":"[[homepage](www.linkedin.com/in/zhiyanglu)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"alfaloo"},"content":"[[github](https://github.com/alfaloo)]","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"alfaloo"},"content":"[[portfolio](https://github.com/alfaloo/CV/blob/main/Zhiyang_Lu_Resume.pdf)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"officialchengyud"},"content":"* Role: Deliverables and Deadline / Integration","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"officialchengyud"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of versioning of the code, maintaining the code repository, integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"officialchengyud"},"content":"### Cheng-Yu Dong","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"officialchengyud"},"content":"\u003cimg src\u003d\"images/officialchengyud.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"officialchengyud"},"content":"[[github](https://github.com/officialchengyud)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"officialchengyud"},"content":"[[portfolio](www.linkedin.com/in/dongchengyu)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"officialchengyud"},"content":"* Role: Code Quality / Integration","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"officialchengyud"},"content":"* Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. In charge of versioning of the code, maintaining the code repository, integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Kappaccinoh"},"content":"### Lim Jia Wei","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Kappaccinoh"},"content":"\u003cimg src\u003d\"images/kappaccinoh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"Kappaccinoh"},"content":"[[github](http://github.com/Kappaccinoh)] [[portfolio](https://www.linkedin.com/in/jia-wei-lim-747037181/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"Kappaccinoh"},"content":"* Role: Scheduling / Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"Kappaccinoh"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time. In charge of defining, assigning, and tracking project tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"alfaloo":5,"officialchengyud":8,"Kappaccinoh":5,"-":43}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ararchch"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T15-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T15-1/tp/actions)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"ararchch"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T15-1/tp/graph/badge.svg?token\u003dTJTWL1WNJF)](https://codecov.io/gh/AY2324S2-CS2103T-T15-1/tp)","lastModifiedDate":"2024-02-26"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-26"},{"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":"ararchch"},"content":"# MediCLI: Hospital Patient Management System","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"ararchch"},"content":"MediCLI is a patient management system designed for hospitals. MediCLI enables the management of patient, doctor, and appointment data.","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ararchch"},"content":"## Example usages:","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ararchch"},"content":"1. Used by hospital clerks to manage hospital records for relevant stake holders.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ararchch"},"content":"2. Core functions offered include add, delete, query for patients, doctors and appointments.","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"ararchch"},"content":"## Context of the project","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"ararchch"},"content":"* The project simulates an ongoing software project for a desktop application (called _MediCLI_) used for managing contact details.","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"ararchch"},"content":" * It is **written in OOP fashion**. It is meant as a project for a SE module to teach basic SE principles.","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"ararchch"},"content":"* For the detailed documentation of this project, see the **[MediCLI Product Website](https://ay2324s2-cs2103t-t15-1.github.io/tp/UserGuide.html)**.","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"ararchch"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"ararchch"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"-":5,"ararchch":17}},{"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":"alfaloo"},"content":"### Zhiyang Lu","lastModifiedDate":"2024-03-03"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"alfaloo"},"content":"\u003cimg src\u003d\"images/alfaloo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-03"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"alfaloo"},"content":"[[homepage](www.linkedin.com/in/zhiyanglu)]","lastModifiedDate":"2024-03-03"},{"lineNumber":17,"author":{"gitId":"alfaloo"},"content":"[[github](https://github.com/alfaloo)]","lastModifiedDate":"2024-03-03"},{"lineNumber":18,"author":{"gitId":"alfaloo"},"content":"[[portfolio](https://github.com/alfaloo/CV/blob/main/Zhiyang_Lu_Resume.pdf)]","lastModifiedDate":"2024-03-03"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"officialchengyud"},"content":"* Role: Deliverables and Deadline / Integration","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"officialchengyud"},"content":"* Responsibilities: Ensure project deliverables are done on time and in the right format. In charge of versioning of the code, maintaining the code repository, integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"officialchengyud"},"content":"### Cheng-Yu Dong","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"officialchengyud"},"content":"\u003cimg src\u003d\"images/officialchengyud.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"officialchengyud"},"content":"[[github](https://github.com/officialchengyud)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"officialchengyud"},"content":"[[portfolio](www.linkedin.com/in/dongchengyu)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"officialchengyud"},"content":"* Role: Code Quality / Integration","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"officialchengyud"},"content":"* Responsibilities: Looks after code quality, ensures adherence to coding standards, etc. In charge of versioning of the code, maintaining the code repository, integrating various parts of the software to create a whole.","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"Kappaccinoh"},"content":"### Lim Jia Wei","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"Kappaccinoh"},"content":"\u003cimg src\u003d\"images/kappaccinoh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"Kappaccinoh"},"content":"[[github](http://github.com/Kappaccinoh)] [[portfolio](https://www.linkedin.com/in/jia-wei-lim-747037181/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"Kappaccinoh"},"content":"* Role: Scheduling / Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"Kappaccinoh"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time. In charge of defining, assigning, and tracking project tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ararchch"},"content":"### Archit Goswami","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ararchch"},"content":"\u003cimg src\u003d\"images/ararchch.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"ararchch"},"content":"[[github](http://github.com/ararchch)]","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"ararchch"},"content":"[[portfolio](https://www.linkedin.com/in/architgos)]","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"ararchch"},"content":"* Role: Team Lead, Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"ararchch"},"content":"* Responsibilities: Coordinating with team members, ensuring code is well documented.","lastModifiedDate":"2024-03-05"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"Alteqa"},"content":"### Eugene Luke Sim Ek Jin","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Alteqa"},"content":"\u003cimg src\u003d\"images/alteqa.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"Alteqa"},"content":"[[github](http://github.com/alteqa)]","lastModifiedDate":"2024-03-05"},{"lineNumber":58,"author":{"gitId":"Alteqa"},"content":"[[portfolio](https://www.linkedin.com/in/eugene-sim-866677188/)]","lastModifiedDate":"2024-03-05"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"Alteqa"},"content":"* Role: Documentation, Testing, Intellij / Github Expert","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"Alteqa"},"content":"* Responsibilities: Ensures the testing of the project is done properly and on time. Responsible for the quality of various project documents. ","lastModifiedDate":"2024-03-05"},{"lineNumber":62,"author":{"gitId":"Alteqa"},"content":"* Helps other team member with matters related to Intellij, Github and Sourcetree tool.","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Alteqa":7,"alfaloo":5,"officialchengyud":8,"Kappaccinoh":5,"-":31,"ararchch":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":"-"},"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":"alfaloo"},"content":"|-----------|--------------------------------------------|--------------------------------------------|-------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | add patients | handle incoming patients when handling emergency call-ins |","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | delete patients | remove old patients to prevent clogging of system |","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | add doctors | register new doctors as they get hired |","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | delete doctors | remove previous doctors that have left the hospital |","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | create appointments | arrange a meeting time between a doctor and a patient |","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | delete appointments | remove a meeting time if either party becomes unavailable |","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | query patient by name | retrieve their relevant information |","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"alfaloo"},"content":"| `* * *` | hospital clerk | query doctor by name | retrieve their relevant information |","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"alfaloo"},"content":"| `* *` | hospital clerk | query appointment by patient | look up what appointments a patient has to attend |","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"alfaloo"},"content":"| `* *` | hospital clerk | query appointment by doctor | look up what appointments a doctor has to service |","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"alfaloo"},"content":"| `*` | hospital clerk | query patient by other fields | retrieve patient information through other fields if they call-in |","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"alfaloo"},"content":"| `*` | hospital clerk | find available timings to book appointment | schedule a time that suits both the patient and doctor |","lastModifiedDate":"2024-03-05"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","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":"officialchengyud"},"content":"(For all use cases below, the **System** is the `mediCLI` and the **Actor** is the `hospital clerk`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"officialchengyud"},"content":"**Use case: Add a patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk enters patient data","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"officialchengyud"},"content":"2. mediCLI adds the patient into database","lastModifiedDate":"2024-03-05"},{"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":"officialchengyud"},"content":"* 1a. The entered patient data is not in the correct format","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"officialchengyud"},"content":" * *1a1. mediCLI shows an error message","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"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":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"officialchengyud"},"content":"**Use case: Delete a patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"officialchengyud"},"content":"2. mediCLI shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"officialchengyud"},"content":"3. Hospital clerk requests to delete a specific patient in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"officialchengyud"},"content":"4. mediCLI deletes the patient","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"officialchengyud"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"officialchengyud"},"content":" * 3a1. mediCLI shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"officialchengyud"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"officialchengyud"},"content":"**Use case: Create an appointment**","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk needs to create appointment between doctor and patient","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"officialchengyud"},"content":"2. Hospital clerk enters doctor and patient details","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"officialchengyud"},"content":"3. mediCLI creates the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"officialchengyud"},"content":"**Use case: Delete an appointment**","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk needs to delete appointment between doctor and patient","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"officialchengyud"},"content":"2. Hospital clerk enters appointment id","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"officialchengyud"},"content":"3. mediCLI deletes the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"officialchengyud"},"content":"**Use case: Query patient by name**","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk needs to search for patient","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"officialchengyud"},"content":"2. Hospital clerk enters patient name","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"officialchengyud"},"content":"3. mediCLI lists patients with supplied name","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"officialchengyud"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"officialchengyud"},"content":"* 3a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"officialchengyud"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"officialchengyud"},"content":"**Use case: Query appointments by patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":381,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":383,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk needs to search for appointment by patient","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"officialchengyud"},"content":"2. Hospital clerk enters patient name","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"officialchengyud"},"content":"3. mediCLI lists relevant appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"officialchengyud"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"officialchengyud"},"content":"* 3a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"officialchengyud"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"officialchengyud"},"content":"**Use case: Query appointments by doctor**","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"officialchengyud"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"officialchengyud"},"content":"1. Hospital clerk needs to search for appointment by doctor","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"officialchengyud"},"content":"2. Hospital clerk enters doctor name","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"officialchengyud"},"content":"3. mediCLI lists relevant appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"officialchengyud"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"officialchengyud"},"content":"* 3a. The list is empty","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"officialchengyud"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"officialchengyud"},"content":"Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"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":414,"author":{"gitId":"officialchengyud"},"content":"2. Should be able to hold up to 1000 medical staff without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"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":416,"author":{"gitId":"officialchengyud"},"content":"4. mediCLI should be easy to integrate with existing medical database systems so that staff can immediately switch to the new app.","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"officialchengyud"},"content":"5. Comprehensive documentation should be provided, including user guides, command references, and troubleshooting resources.","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"officialchengyud"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"officialchengyud"},"content":"* **CLI**: Command Line Interface, a way of interacting with a computer program where the user enters commands into a terminal or command prompt.","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"officialchengyud"},"content":"* **GUI**: Graphical User Interface, a way of interacting with a computer program using graphical elements such as windows, buttons, and menus.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"officialchengyud"},"content":"* **JSON**: JSON: JavaScript Object Notation, a lightweight data interchange format used to store and exchange data.","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"officialchengyud"},"content":"* **API**: Application Programming Interface, a set of rules and protocols for building and interacting with software applications.","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"officialchengyud"},"content":"* **UI**: User Interface, the visual part of a computer program that allows users to interact with it.","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"officialchengyud"},"content":"* **XML**: Extensible Markup Language, a markup language that defines rules for encoding documents in a format that is both human-readable and machine-readable.","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"officialchengyud"},"content":"* **MSS**: Main Success Scenario, the primary flow of events in a use case that leads to the desired outcome.","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"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":437,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"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":448,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"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":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"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":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"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":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"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":471,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","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"}],"authorContributionMap":{"alfaloo":13,"officialchengyud":100,"-":368}}] diff --git a/AY2324S2-CS2103T-T15-1_tp_master/commits.json b/AY2324S2-CS2103T-T15-1_tp_master/commits.json index fc1e437a..0a8ad419 100644 --- a/AY2324S2-CS2103T-T15-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T15-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"Alteqa":[],"alfaloo":[{"date":"2024-03-03","commitResults":[{"hash":"67b95db78d73eb8635635ca4c5415b5438516e99","isMergeCommit":false,"messageTitle":"Update AboutUs documentation","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]}],"officialchengyud":[{"date":"2024-03-05","commitResults":[{"hash":"5e92fb214c54e73b8d07aadb638f01ebecb60ae4","isMergeCommit":true,"messageTitle":"Merge pull request #7 from alfaloo/documentation","messageBody":"Update AboutUs documentation","fileTypesAndContributionMap":{}},{"hash":"9cead3d4996ecdeeb1936418d00555e658f03d62","isMergeCommit":false,"messageTitle":"Add About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}}]}],"Kappaccinoh":[{"date":"2024-03-05","commitResults":[{"hash":"4f2a67784cede5e06c110b64a665cdf519448a92","isMergeCommit":false,"messageTitle":"update about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}],"ararchch":[{"date":"2024-02-26","commitResults":[{"hash":"4815323a42e4bcdb030bfb7a0081fa34b1c4bcae","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Include codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-05","commitResults":[{"hash":"e2e7a4e1b616a7178867dcf6e961be95e8e0a374","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Kappaccinoh/branch-update-documentation","messageBody":"update about us","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"Alteqa":{"docs":0,"functional-code":0,"test-code":0},"alfaloo":{"docs":5,"functional-code":0,"test-code":0},"officialchengyud":{"docs":8,"functional-code":0,"test-code":0},"Kappaccinoh":{"docs":5,"functional-code":0,"test-code":0},"ararchch":{"docs":2,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Alteqa":0.0,"alfaloo":12.909724,"officialchengyud":22.076387,"Kappaccinoh":7.6388893,"ararchch":0.3055555},"authorDisplayNameMap":{"Alteqa":"CS2103T-T15-1 EUGE.. JIN","alfaloo":"CS2103T-T15-1 LU Z..YANG","officialchengyud":"CS2103T-T15-1 DONG..G-YU","Kappaccinoh":"CS2103T-T15-1 LIM .. WEI","ararchch":"CS2103T-T15-1 ARCH..WAMI"}} +{"authorDailyContributionsMap":{"Alteqa":[{"date":"2024-03-05","commitResults":[{"hash":"f3a22a71b09ec1851a4a6bed96d3e3ef2d344de5","isMergeCommit":false,"messageTitle":"Update aboutus page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"af990f6864612ba6553dc906d77db4201b7cbfae","isMergeCommit":true,"messageTitle":"Merge pull request #37 from ararchch/branch-Readme","messageBody":"Update readme","fileTypesAndContributionMap":{}}]}],"alfaloo":[{"date":"2024-03-03","commitResults":[{"hash":"67b95db78d73eb8635635ca4c5415b5438516e99","isMergeCommit":false,"messageTitle":"Update AboutUs documentation","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}}]},{"date":"2024-03-05","commitResults":[{"hash":"15b0836221d5cd1b2f0614a68c5d81d799313ab3","isMergeCommit":true,"messageTitle":"Merge pull request #34 from ararchch/branch-AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"dc4191e7a68ba6a6642962d792c02675d9b628c5","isMergeCommit":false,"messageTitle":"Update developer guide to include relevant user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":14,"deletions":8}}},{"hash":"6f1721ae252b0664ac762c147271b4f8c70c3e04","isMergeCommit":true,"messageTitle":"Merge pull request #39 from Alteqa/master","messageBody":"Update aboutus page","fileTypesAndContributionMap":{}}]}],"officialchengyud":[{"date":"2024-03-05","commitResults":[{"hash":"5e92fb214c54e73b8d07aadb638f01ebecb60ae4","isMergeCommit":true,"messageTitle":"Merge pull request #7 from alfaloo/documentation","messageBody":"Update AboutUs documentation","fileTypesAndContributionMap":{}},{"hash":"9cead3d4996ecdeeb1936418d00555e658f03d62","isMergeCommit":false,"messageTitle":"Add About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":8}}},{"hash":"a1cb74ea322fb115fcf8aab068623f37f1e78782","isMergeCommit":false,"messageTitle":"Update DG Use Cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":31,"deletions":6}}},{"hash":"2e763e9695a1f0a62afd50f19c1fa5b4ff8cddd2","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T15-1/tp into branch-update-DG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1ccbfeea2bfdd2eb7ed2a3293e6c4c1a85b28964","isMergeCommit":false,"messageTitle":"Update DG for Use Cases, NFR and Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":91,"deletions":23}}}]}],"Kappaccinoh":[{"date":"2024-03-05","commitResults":[{"hash":"4f2a67784cede5e06c110b64a665cdf519448a92","isMergeCommit":false,"messageTitle":"update about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}}]}],"ararchch":[{"date":"2024-02-26","commitResults":[{"hash":"4815323a42e4bcdb030bfb7a0081fa34b1c4bcae","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Include codecov badge","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-05","commitResults":[{"hash":"e2e7a4e1b616a7178867dcf6e961be95e8e0a374","isMergeCommit":true,"messageTitle":"Merge pull request #28 from Kappaccinoh/branch-update-documentation","messageBody":"update about us","fileTypesAndContributionMap":{}},{"hash":"868c7c546955b704f7809899cfd9d8d688807c8e","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":6}}},{"hash":"97666b31c575f594a6d4b1fdb9d81a99ded1b9bb","isMergeCommit":true,"messageTitle":"Merge pull request #30 from Kappaccinoh/updateReadMe","messageBody":"added updated UI","fileTypesAndContributionMap":{}},{"hash":"397f9e5471058db0f2be88a4c1ddcda7125903e5","isMergeCommit":true,"messageTitle":"Merge pull request #35 from alfaloo/documentation","messageBody":"Update developer guide to include relevant user stories","fileTypesAndContributionMap":{}},{"hash":"e3c1b682dccab422e90d69e6a3b08e75c88391d7","isMergeCommit":false,"messageTitle":"Update readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":10}}}]}]},"authorFileTypeContributionMap":{"Alteqa":{"docs":7,"functional-code":0,"test-code":0},"alfaloo":{"docs":18,"functional-code":0,"test-code":0},"officialchengyud":{"docs":108,"functional-code":0,"test-code":0},"Kappaccinoh":{"docs":5,"functional-code":0,"test-code":0},"ararchch":{"docs":23,"functional-code":0,"test-code":0}},"authorContributionVariance":{"Alteqa":12.909722,"alfaloo":45.909725,"officialchengyud":2156.0,"Kappaccinoh":7.6388893,"ararchch":109.555565},"authorDisplayNameMap":{"Alteqa":"CS2103T-T15-1 EUGE.. JIN","alfaloo":"CS2103T-T15-1 LU Z..YANG","officialchengyud":"CS2103T-T15-1 DONG..G-YU","Kappaccinoh":"CS2103T-T15-1 LIM .. WEI","ararchch":"CS2103T-T15-1 ARCH..WAMI"}} diff --git a/AY2324S2-CS2103T-T16-3_tp_master/authorship.json b/AY2324S2-CS2103T-T16-3_tp_master/authorship.json index eb8e5084..ac84ed95 100644 --- a/AY2324S2-CS2103T-T16-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T16-3_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":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T17-4/tp/graph/badge.svg?token\u003dLPV8FKMOGM)](https://codecov.io/gh/AY2324S2-CS2103T-T16-3/tp)","lastModifiedDate":"2024-02-13"},{"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":"maze508"},"content":"# Gourmet Grid","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"maze508"},"content":"## Description","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"maze508"},"content":"* The project simulates an ongoing software project for a desktop application (called _Gourmet Grid_) used for managing contact details.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"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":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"maze508"},"content":"* It is named `Gourmet Grid`","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"maze508"},"content":"## Main Features","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"maze508"},"content":"#### List All Contacts ","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"maze508"},"content":"\u003eFormat: `list`","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"maze508"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"maze508"},"content":"\u003eFormat: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]`","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"maze508"},"content":"#### Delete Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"maze508"},"content":"\u003eFormat: `delete INDEX`","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"maze508"},"content":"#### Search Contacts By Name","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"maze508"},"content":"\u003eFormat: `find n/NAME`","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"-":7,"maze508":20}},{"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":"","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"gavingoh99"},"content":"### Sun Ruiheng","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/sunruiheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"gavingoh99"},"content":"[[github](https://github.com/sun-ruiheng)]","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"gavingoh99"},"content":"* Role: Developer, Java Expert","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"gavingoh99"},"content":"### Gavin Goh","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/gavingoh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/gavingoh99)]","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"gavingoh99"},"content":"### Ma Ze Xuan","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/mazexuan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/maze508)]","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"gavingoh99"},"content":"### Tan Guan Quan","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/tanguanquan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/guanquann)]","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"gavingoh99":17,"-":30}},{"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":"maze508"},"content":"# Gourmet Grid","lastModifiedDate":"2024-03-05"},{"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":"guanquann"},"content":"* regularly receives deliveries of supplies from different suppliers","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"guanquann"},"content":"* troublesome to make orders when supplies are running low","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"guanquann"},"content":"* has some favorite and some not great customers","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":284,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"guanquann"},"content":"**Value proposition**: ","lastModifiedDate":"2024-03-05"},{"lineNumber":287,"author":{"gitId":"guanquann"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"guanquann"},"content":"* Our product is specifically tailored to restaurant owners like Bob who juggle multiple suppliers and customer relationships by streamlining daily delivery management, simplifying tracking supplier schedules and enabling personalised engagement with regulars.","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"guanquann"},"content":"* Focusing on a small number of stable suppliers, it centralises contacts and smoothens day-to-day tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"guanquann"},"content":"|----------|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | add contacts with detailed information | better manage relationship with suppliers and customers |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | immediately see a list of contact | contact / check on these parties quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | search by name | quickly find the person I want to contact |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"guanquann"},"content":"| `* * *` | long time user | delete contacts | keep my address book relevant and clean |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"guanquann"},"content":"| `* *` | potential user exploring the app | see examples with sample data on the app | easily visualize how the app will look like when handling data that is typical for my use case |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"guanquann"},"content":"| `* *` | potential user exploring the app | delete all sample data | easily add my own data to a clean slate |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | edit contact details | keep my address book up to date |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"guanquann"},"content":"| `* *` | restaurant owner | keep track of temporary contacts | easily check on the status of my incoming deliveries with the deliverymen responsible |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"guanquann"},"content":"| `* *` | frequent user | immediately see a list of important / frequent contacts that I view | contact / check on these parties quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"guanquann"},"content":"| `* *` | restaurant owner | favourite certain contacts | have quicker and more efficient access to contact |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | search by notes or tag to quickly find specific details about customer preferences (i.e allergies) and delivery details (i.e slow delivery) | |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | filter search base on a specific criteria (like vegan supplier) to better plan deliveries | |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"guanquann"},"content":"| `*` | careless user | undo my orders/contacts | reduces the number of actions I have to take |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"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":"-"},"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":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":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"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":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"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":346,"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":347,"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":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":354,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":364,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":365,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"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":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"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":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"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":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"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":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"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":399,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"guanquann":21,"-":387,"maze508":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":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T17-4/tp/graph/badge.svg?token\u003dLPV8FKMOGM)](https://codecov.io/gh/AY2324S2-CS2103T-T16-3/tp)","lastModifiedDate":"2024-02-13"},{"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":"maze508"},"content":"# Gourmet Grid","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"maze508"},"content":"## Description","lastModifiedDate":"2024-03-05"},{"lineNumber":9,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"maze508"},"content":"* The project simulates an ongoing software project for a desktop application (called _Gourmet Grid_) used for managing contact details.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"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":12,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"maze508"},"content":"* It is named `Gourmet Grid`","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"maze508"},"content":"## Main Features","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"maze508"},"content":"#### List All Contacts ","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"maze508"},"content":"\u003eFormat: `list`","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"maze508"},"content":"#### Add New Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"maze508"},"content":"\u003eFormat: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]`","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"maze508"},"content":"#### Delete Contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"maze508"},"content":"\u003eFormat: `delete INDEX`","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"maze508"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"maze508"},"content":"#### Search Contacts By Name","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"maze508"},"content":"\u003eFormat: `find n/NAME`","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"-":7,"maze508":20}},{"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":"","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"gavingoh99"},"content":"### Sun Ruiheng","lastModifiedDate":"2024-03-05"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/sunruiheng.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"gavingoh99"},"content":"[[github](https://github.com/sun-ruiheng)]","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"gavingoh99"},"content":"* Role: Developer, Java Expert","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Deliverables and deadlines","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"gavingoh99"},"content":"### Gavin Goh","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/gavingoh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/gavingoh99)]","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Scheduling and tracking","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"gavingoh99"},"content":"### Ma Ze Xuan","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/mazexuan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/maze508)]","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"gavingoh99"},"content":"### Tan Guan Quan","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"gavingoh99"},"content":"\u003cimg src\u003d\"images/tanguanquan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"gavingoh99"},"content":"[[github](http://github.com/guanquann)]","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"gavingoh99"},"content":"* Responsibilities: Integration","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"gavingoh99":17,"-":30}},{"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":"maze508"},"content":"# Gourmet Grid","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"sun-ruiheng"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"sun-ruiheng"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"sun-ruiheng"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"sun-ruiheng"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-05"},{"lineNumber":48,"author":{"gitId":"sun-ruiheng"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"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":"sun-ruiheng"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-05"},{"lineNumber":61,"author":{"gitId":"sun-ruiheng"},"content":"- implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-05"},{"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":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"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":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"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":"sun-ruiheng"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-05"},{"lineNumber":82,"author":{"gitId":"sun-ruiheng"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-05"},{"lineNumber":83,"author":{"gitId":"sun-ruiheng"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":84,"author":{"gitId":"sun-ruiheng"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-05"},{"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":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"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":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"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":101,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"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":106,"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":107,"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":108,"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":109,"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":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":111,"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":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"sun-ruiheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":117,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":118,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"sun-ruiheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":122,"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":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"sun-ruiheng"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-05"},{"lineNumber":129,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":130,"author":{"gitId":"sun-ruiheng"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":131,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":135,"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":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"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":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"sun-ruiheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":149,"author":{"gitId":"sun-ruiheng"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-05"},{"lineNumber":150,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":151,"author":{"gitId":"sun-ruiheng"},"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":"2024-03-05"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"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":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"sun-ruiheng"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":170,"author":{"gitId":"sun-ruiheng"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":171,"author":{"gitId":"sun-ruiheng"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-05"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"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":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"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":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"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":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"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":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"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":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"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":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"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":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"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":202,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"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":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":220,"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":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"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":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"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":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"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":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"sun-ruiheng"},"content":"- **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2024-03-05"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"sun-ruiheng"},"content":" - Pros: Easy to implement.","lastModifiedDate":"2024-03-05"},{"lineNumber":247,"author":{"gitId":"sun-ruiheng"},"content":" - Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2024-03-05"},{"lineNumber":248,"author":{"gitId":"sun-ruiheng"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":249,"author":{"gitId":"sun-ruiheng"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-05"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"sun-ruiheng"},"content":" - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-05"},{"lineNumber":252,"author":{"gitId":"sun-ruiheng"},"content":" - Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2024-03-05"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"sun-ruiheng"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":265,"author":{"gitId":"sun-ruiheng"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":266,"author":{"gitId":"sun-ruiheng"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":267,"author":{"gitId":"sun-ruiheng"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":268,"author":{"gitId":"sun-ruiheng"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-05"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"sun-ruiheng"},"content":"- regularly receives deliveries of supplies from different suppliers","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"sun-ruiheng"},"content":"- troublesome to make orders when supplies are running low","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"sun-ruiheng"},"content":"- has some favorite and some not great customers","lastModifiedDate":"2024-03-05"},{"lineNumber":281,"author":{"gitId":"sun-ruiheng"},"content":"- has a need to manage a significant number of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":282,"author":{"gitId":"sun-ruiheng"},"content":"- prefer desktop apps over other types","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"sun-ruiheng"},"content":"- can type fast","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"sun-ruiheng"},"content":"- prefers typing to mouse interactions","lastModifiedDate":"2024-03-05"},{"lineNumber":285,"author":{"gitId":"sun-ruiheng"},"content":"- is reasonably comfortable using CLI apps","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"guanquann"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-05"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":289,"author":{"gitId":"sun-ruiheng"},"content":"- Our product is specifically tailored to restaurant owners like Bob who juggle multiple suppliers and customer relationships by streamlining daily delivery management, simplifying tracking supplier schedules and enabling personalised engagement with regulars.","lastModifiedDate":"2024-03-05"},{"lineNumber":290,"author":{"gitId":"sun-ruiheng"},"content":"- Focusing on a small number of stable suppliers, it centralises contacts and smoothens day-to-day tasks.","lastModifiedDate":"2024-03-05"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"sun-ruiheng"},"content":"| -------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | add contacts with detailed information | better manage relationship with suppliers and customers |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | immediately see a list of contact | contact / check on these parties quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"guanquann"},"content":"| `* * *` | restaurant owner | search by name | quickly find the person I want to contact |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"guanquann"},"content":"| `* * *` | long time user | delete contacts | keep my address book relevant and clean |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"guanquann"},"content":"| `* *` | potential user exploring the app | see examples with sample data on the app | easily visualize how the app will look like when handling data that is typical for my use case |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"guanquann"},"content":"| `* *` | potential user exploring the app | delete all sample data | easily add my own data to a clean slate |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | edit contact details | keep my address book up to date |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"guanquann"},"content":"| `* *` | restaurant owner | keep track of temporary contacts | easily check on the status of my incoming deliveries with the deliverymen responsible |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"guanquann"},"content":"| `* *` | frequent user | immediately see a list of important / frequent contacts that I view | contact / check on these parties quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"guanquann"},"content":"| `* *` | restaurant owner | favourite certain contacts | have quicker and more efficient access to contact |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | search by notes or tag to quickly find specific details about customer preferences (i.e allergies) and delivery details (i.e slow delivery) | |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"guanquann"},"content":"| `* *` | long time user | filter search base on a specific criteria (like vegan supplier) to better plan deliveries | |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"guanquann"},"content":"| `*` | careless user | undo my orders/contacts | reduces the number of actions I have to take |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"sun-ruiheng"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"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":"-"},"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":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":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"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":"sun-ruiheng"},"content":"- 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"- 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"sun-ruiheng"},"content":" - 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"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":"sun-ruiheng"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"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":346,"author":{"gitId":"sun-ruiheng"},"content":"2. Should be able to hold up to a reasonable number of contacts with their corresponding information reliably without detriment to performance.","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"sun-ruiheng"},"content":"3. A user with above average typing speed for regular English text should be able to accomplish most of the tasks faster using commands than using the mouse.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"sun-ruiheng"},"content":"4. Should work consistently regardless of environment, such as the settings of the phone running it (within reasonable bounds).","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"sun-ruiheng"},"content":"5. Users should easily navigate the app with minimal hesitance.","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"sun-ruiheng"},"content":"6. Should remain functional and fully usable in the event that the user enters unexpected inputs, with appropriate error statement displayed before the app returns to a functional state to continue running.","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"sun-ruiheng"},"content":"7. Should update automatically or have a good way to manually update in case of time zone changes.","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"sun-ruiheng"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"sun-ruiheng"},"content":"- **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"sun-ruiheng"},"content":"- **Reasonable Number of Contacts**: Set to be 100 for now","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"sun-ruiheng"},"content":"- **Hesitance**: Time spent deliberating by user due to uncertainty of UI interactions","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"sun-ruiheng"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":370,"author":{"gitId":"sun-ruiheng"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"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":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"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":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"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":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"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":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"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":404,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"guanquann":14,"sun-ruiheng":76,"-":323,"maze508":1}}] diff --git a/AY2324S2-CS2103T-T16-3_tp_master/commits.json b/AY2324S2-CS2103T-T16-3_tp_master/commits.json index 4fcdd2e4..8106a9d9 100644 --- a/AY2324S2-CS2103T-T16-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T16-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"guanquann":[{"date":"2024-03-05","commitResults":[{"hash":"139d797ba4cbe08d2bcad8c79c3be0032195856f","isMergeCommit":true,"messageTitle":"Merge pull request #13 from maze508/master","messageBody":"Update README and Add Ui Mockup","fileTypesAndContributionMap":{}},{"hash":"52a5b35dca429d7ed887c1013b5d61f3b61dd98b","isMergeCommit":false,"messageTitle":"Update developer documentation to include user stories and use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":9}}},{"hash":"460ea80babd93776196a996fe204a92c97e1648d","isMergeCommit":true,"messageTitle":"Merge pull request #16 from maze508/readme_ui","messageBody":"Update README and Ui Mockup","fileTypesAndContributionMap":{}}]}],"sun-ruiheng":[{"date":"2024-03-05","commitResults":[{"hash":"39eade0c06b3772f0b8648f7927db4f416acc51c","isMergeCommit":true,"messageTitle":"Merge pull request #15 from guanquann/user-stories-use-cases","messageBody":"Update developer documentation to include user stories and use cases","fileTypesAndContributionMap":{}}]}],"gavingoh99":[{"date":"2024-03-05","commitResults":[{"hash":"27c0cb119cd49ac19672fa715eb56fe26cdea59d","isMergeCommit":false,"messageTitle":"docs: update aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":31}}},{"hash":"dc2f56f31797b6e6bf7a44a95523b6e8bf060efa","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into updateAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"66df7655f7238ce4c46eb18e7e9e27a64e52b522","isMergeCommit":false,"messageTitle":"docs: update member name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"maze508":[{"date":"2024-03-05","commitResults":[{"hash":"e8a5e5cb0820e2e44c1b42fe6dec38cdcd4cba1b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}},{"hash":"ce96723309ebc5114f4e124a916d07121ceda732","isMergeCommit":true,"messageTitle":"Merge pull request #14 from gavingoh99/updateAboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"912bf611b080dbbee5e23d6b8a9194701cfb721c","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"guanquann":{"docs":21,"functional-code":0,"test-code":0},"sun-ruiheng":{"docs":0,"functional-code":0,"test-code":0},"gavingoh99":{"docs":17,"functional-code":0,"test-code":0},"maze508":{"docs":21,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guanquann":73.40972,"sun-ruiheng":0.0,"gavingoh99":190.97221,"maze508":78.22222},"authorDisplayNameMap":{"guanquann":"CS2103T-T16-3 TAN ..QUAN","sun-ruiheng":"CS2103T-T16-3 SUN ..HENG","gavingoh99":"CS2103T-T16-3 GAVI..HONG","maze508":"CS2103T-T16-3 MA Z..XUAN"}} +{"authorDailyContributionsMap":{"guanquann":[{"date":"2024-03-05","commitResults":[{"hash":"139d797ba4cbe08d2bcad8c79c3be0032195856f","isMergeCommit":true,"messageTitle":"Merge pull request #13 from maze508/master","messageBody":"Update README and Add Ui Mockup","fileTypesAndContributionMap":{}},{"hash":"52a5b35dca429d7ed887c1013b5d61f3b61dd98b","isMergeCommit":false,"messageTitle":"Update developer documentation to include user stories and use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":9}}},{"hash":"460ea80babd93776196a996fe204a92c97e1648d","isMergeCommit":true,"messageTitle":"Merge pull request #16 from maze508/readme_ui","messageBody":"Update README and Ui Mockup","fileTypesAndContributionMap":{}}]}],"sun-ruiheng":[{"date":"2024-03-05","commitResults":[{"hash":"39eade0c06b3772f0b8648f7927db4f416acc51c","isMergeCommit":true,"messageTitle":"Merge pull request #15 from guanquann/user-stories-use-cases","messageBody":"Update developer documentation to include user stories and use cases","fileTypesAndContributionMap":{}},{"hash":"f3577046717c48010c2a1b85be18498e6e7f4de1","isMergeCommit":false,"messageTitle":"Update NFRs and Glossary","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":580,"deletions":0},"docs":{"insertions":79,"deletions":74}}},{"hash":"db411e4ba136783bfc4884417585152af124c85d","isMergeCommit":false,"messageTitle":"Add NFRs","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":580}}}]}],"gavingoh99":[{"date":"2024-03-05","commitResults":[{"hash":"27c0cb119cd49ac19672fa715eb56fe26cdea59d","isMergeCommit":false,"messageTitle":"docs: update aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":31}}},{"hash":"dc2f56f31797b6e6bf7a44a95523b6e8bf060efa","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into updateAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"66df7655f7238ce4c46eb18e7e9e27a64e52b522","isMergeCommit":false,"messageTitle":"docs: update member name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"478c29119233e77284f65b3551a0fad684569fff","isMergeCommit":true,"messageTitle":"Merge pull request #19 from sun-ruiheng/Branch-v1.1-NFR-Glossary","messageBody":"Edit NFRs and Glossary","fileTypesAndContributionMap":{}}]}],"maze508":[{"date":"2024-03-05","commitResults":[{"hash":"e8a5e5cb0820e2e44c1b42fe6dec38cdcd4cba1b","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":9}}},{"hash":"ce96723309ebc5114f4e124a916d07121ceda732","isMergeCommit":true,"messageTitle":"Merge pull request #14 from gavingoh99/updateAboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"912bf611b080dbbee5e23d6b8a9194701cfb721c","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}]},"authorFileTypeContributionMap":{"guanquann":{"docs":14,"functional-code":0,"test-code":0},"sun-ruiheng":{"docs":76,"functional-code":0,"test-code":0},"gavingoh99":{"docs":17,"functional-code":0,"test-code":0},"maze508":{"docs":21,"functional-code":0,"test-code":0}},"authorContributionVariance":{"guanquann":73.40972,"sun-ruiheng":131692.08,"gavingoh99":190.97221,"maze508":78.22222},"authorDisplayNameMap":{"guanquann":"CS2103T-T16-3 TAN ..QUAN","sun-ruiheng":"CS2103T-T16-3 SUN ..HENG","gavingoh99":"CS2103T-T16-3 GAVI..HONG","maze508":"CS2103T-T16-3 MA Z..XUAN"}} diff --git a/AY2324S2-CS2103T-W10-4_tp_master/authorship.json b/AY2324S2-CS2103T-W10-4_tp_master/authorship.json index fa7f8393..3bb21dcd 100644 --- a/AY2324S2-CS2103T-W10-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-4_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"STELLA-LYE"},"content":"### Stella Lye Si Yu","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"STELLA-LYE"},"content":"\u003cimg src\u003d\"images/STELLA-LYE.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"STELLA-LYE"},"content":"[[homepage](http://STELLA-LYE.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"STELLA-LYE"},"content":"[[github](https://github.com/STELLA-LYE)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"STELLA-LYE"},"content":"[[portfolio](team/STELLA-LYE.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"STELLA-LYE"},"content":"* Responsibilities: Dev Ops + Development + UI","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"tohlh"},"content":"### Toh Li Heng","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"tohlh"},"content":"\u003cimg src\u003d\"images/tohlh.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"tohlh"},"content":"[[homepage](http://tohlh.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":60,"author":{"gitId":"tohlh"},"content":"[[github](http://github.com/tohlh)]","lastModifiedDate":"2024-03-04"},{"lineNumber":61,"author":{"gitId":"tohlh"},"content":"[[portfolio](team/tohlh.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"tohlh"},"content":"* Responsibilities: Dev Ops + Development","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"STELLA-LYE":6,"-":52,"tohlh":6}},{"path":"docs/team/STELLA-LYE.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"STELLA-LYE"},"content":"layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"STELLA-LYE"},"content":"title: \"Stella\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"STELLA-LYE"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"STELLA-LYE"},"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-04"},{"lineNumber":9,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"STELLA-LYE"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"STELLA-LYE":11}},{"path":"docs/team/tohlh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"tohlh"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"tohlh"},"content":" title: \"Li Heng\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"tohlh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"tohlh"},"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-04"},{"lineNumber":9,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"tohlh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"tohlh":11}}] +[{"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":"doyelee0313"},"content":"### Doye Lee","lastModifiedDate":"2024-03-05"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"doyelee0313"},"content":"\u003cimg src\u003d\"images/doyelee0313.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"doyelee0313"},"content":"[[github](https://github.com/doyelee0313)]","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"doyelee0313"},"content":"[[portfolio](team/doyelee0313.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"doyelee0313"},"content":"* Responsibilities: Development + UI + Documentation","lastModifiedDate":"2024-03-05"},{"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":"STELLA-LYE"},"content":"### Stella Lye Si Yu","lastModifiedDate":"2024-03-04"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"STELLA-LYE"},"content":"\u003cimg src\u003d\"images/STELLA-LYE.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"STELLA-LYE"},"content":"[[homepage](http://STELLA-LYE.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":39,"author":{"gitId":"STELLA-LYE"},"content":"[[github](https://github.com/STELLA-LYE)] ","lastModifiedDate":"2024-03-04"},{"lineNumber":40,"author":{"gitId":"STELLA-LYE"},"content":"[[portfolio](team/STELLA-LYE.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"STELLA-LYE"},"content":"* Responsibilities: Dev Ops + Development + UI","lastModifiedDate":"2024-03-04"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"tohlh"},"content":"### Toh Li Heng","lastModifiedDate":"2024-03-04"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"tohlh"},"content":"\u003cimg src\u003d\"images/tohlh.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"tohlh"},"content":"[[homepage](http://tohlh.github.io)]","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"tohlh"},"content":"[[github](http://github.com/tohlh)]","lastModifiedDate":"2024-03-04"},{"lineNumber":51,"author":{"gitId":"tohlh"},"content":"[[portfolio](team/tohlh.md)]","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tohlh"},"content":"* Responsibilities: Dev Ops + Development","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"doyelee0313":5,"STELLA-LYE":6,"-":37,"tohlh":6}},{"path":"docs/team/STELLA-LYE.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"STELLA-LYE"},"content":"layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"STELLA-LYE"},"content":"title: \"Stella\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"STELLA-LYE"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"STELLA-LYE"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"STELLA-LYE"},"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-04"},{"lineNumber":9,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"STELLA-LYE"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"STELLA-LYE"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"STELLA-LYE":11}},{"path":"docs/team/doyelee0313.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"doyelee0313"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"doyelee0313"},"content":" title: \"Doye\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"doyelee0313"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"doyelee0313"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"doyelee0313"},"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-05"},{"lineNumber":9,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"doyelee0313"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"doyelee0313"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"doyelee0313":11}},{"path":"docs/team/tohlh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":2,"author":{"gitId":"tohlh"},"content":" layout: default.md","lastModifiedDate":"2024-03-04"},{"lineNumber":3,"author":{"gitId":"tohlh"},"content":" title: \"Li Heng\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-04"},{"lineNumber":4,"author":{"gitId":"tohlh"},"content":"---","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"tohlh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-04"},{"lineNumber":7,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"tohlh"},"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-04"},{"lineNumber":9,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"tohlh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"tohlh"},"content":"","lastModifiedDate":"2024-03-04"}],"authorContributionMap":{"tohlh":11}}] diff --git a/AY2324S2-CS2103T-W10-4_tp_master/commits.json b/AY2324S2-CS2103T-W10-4_tp_master/commits.json index 5c5ae4d3..48f26360 100644 --- a/AY2324S2-CS2103T-W10-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"doyelee0313":[],"STELLA-LYE":[{"date":"2024-03-04","commitResults":[{"hash":"09ba9eb1ce42d538c3a5ccc09292c0b27252ceb3","isMergeCommit":true,"messageTitle":"Merge pull request #6 from tohlh/update-about-me","messageBody":"Add tohlh\u0027s personal info","fileTypesAndContributionMap":{}},{"hash":"a79bf0389bed7ba3dfee07f868f51863ca55fa37","isMergeCommit":false,"messageTitle":"Update Stella AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":4}}}]}],"jocelyn-soh":[],"tohlh":[{"date":"2024-03-04","commitResults":[{"hash":"558a8e598a3c6d1e65235ce3657ed47ef99709d2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W10-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"b225ac386ca9d8d71bdfb4561bc458d960f69a45","isMergeCommit":false,"messageTitle":"Add tohlh\u0027s personal info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"ba5c14fb443856d3fb504f76b5bac2c036f0004a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from STELLA-LYE/Update-AboutUs","messageBody":"Update Stella AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"doyelee0313":{"docs":0,"functional-code":0,"test-code":0},"STELLA-LYE":{"docs":17,"functional-code":0,"test-code":0},"jocelyn-soh":{"docs":0,"functional-code":0,"test-code":0},"tohlh":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"doyelee0313":0.0,"STELLA-LYE":33.6875,"jocelyn-soh":0.0,"tohlh":36.97222},"authorDisplayNameMap":{"doyelee0313":"CS2103T-W10-4 LEE ..DOYE","STELLA-LYE":"CS2103T-W10-4 STEL..I YU","jocelyn-soh":"CS2103T-W10-4 SOH ..ELYN","tohlh":"CS2103T-W10-4 TOH ..HENG"}} +{"authorDailyContributionsMap":{"doyelee0313":[{"date":"2024-03-05","commitResults":[{"hash":"21e7fd316d98570476976d8bfa3a73cc647c0439","isMergeCommit":false,"messageTitle":"Update Doye AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":15}}}]}],"STELLA-LYE":[{"date":"2024-03-04","commitResults":[{"hash":"09ba9eb1ce42d538c3a5ccc09292c0b27252ceb3","isMergeCommit":true,"messageTitle":"Merge pull request #6 from tohlh/update-about-me","messageBody":"Add tohlh\u0027s personal info","fileTypesAndContributionMap":{}},{"hash":"a79bf0389bed7ba3dfee07f868f51863ca55fa37","isMergeCommit":false,"messageTitle":"Update Stella AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":4}}}]}],"jocelyn-soh":[],"tohlh":[{"date":"2024-03-04","commitResults":[{"hash":"558a8e598a3c6d1e65235ce3657ed47ef99709d2","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-W10-4/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"b225ac386ca9d8d71bdfb4561bc458d960f69a45","isMergeCommit":false,"messageTitle":"Add tohlh\u0027s personal info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":5}}}]},{"date":"2024-03-05","commitResults":[{"hash":"ba5c14fb443856d3fb504f76b5bac2c036f0004a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from STELLA-LYE/Update-AboutUs","messageBody":"Update Stella AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"doyelee0313":{"docs":16,"functional-code":0,"test-code":0},"STELLA-LYE":{"docs":17,"functional-code":0,"test-code":0},"jocelyn-soh":{"docs":0,"functional-code":0,"test-code":0},"tohlh":{"docs":17,"functional-code":0,"test-code":0}},"authorContributionVariance":{"doyelee0313":73.40972,"STELLA-LYE":33.6875,"jocelyn-soh":0.0,"tohlh":36.97222},"authorDisplayNameMap":{"doyelee0313":"CS2103T-W10-4 LEE ..DOYE","STELLA-LYE":"CS2103T-W10-4 STEL..I YU","jocelyn-soh":"CS2103T-W10-4 SOH ..ELYN","tohlh":"CS2103T-W10-4 TOH ..HENG"}} diff --git a/AY2324S2-CS2103T-W12-1_tp_master/authorship.json b/AY2324S2-CS2103T-W12-1_tp_master/authorship.json index 656a1562..6e2d8914 100644 --- a/AY2324S2-CS2103T-W12-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W12-1_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"getsquared"},"content":"### Ge Shuqing","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":"\u003cimg src\u003d\"images/getsquared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/getsquared)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/shuqing.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":"* Role: Integration + Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":"* Role: Project Advisor","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"### Regan Choy","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":"\u003cimg src\u003d\"images/reganchoy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":"[[github](http://github.com/ReganChoy)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"[[portfolio](team/reganchoy.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":"* Role: Deliverables + Deadline + Scheduling","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":"* Responsibilities: Model","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":5,"ReganChoy":12,"-":56}},{"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":"getsquared"},"content":"* has a need to manage a significant number of clients for insurance policies","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"getsquared"},"content":"* has a need to organise schedules with clients and their details in one place","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"getsquared"},"content":"* has a need for reminders to keep in touch with clients","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"getsquared"},"content":"**Value proposition**: conveniently manage client details and schedules faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"getsquared"},"content":"|----------|-----------------|---------------------------------------------------------------|-----------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | add a new client contact details | keep track of the clients I have |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | delete a client | remove clients that are leaving |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | find a client by name | locate details of client without having to go through the entire list |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | view client information | know and check client details |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | check what schedules I have with clients on a particular date | keep track of what I have to do in a day |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | add the birthday of my clients | wish them happy birthday to keep in contact with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | delete policy details for a client | remove expired policies of the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | see when I last met a client | check in on a client that I have not met for a long time |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | mark that a schedule is completed | know that i fulfilled the appointment scheduled |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"getsquared"},"content":"| `*` | insurance agent | sort clients by priority | deal with client with higher priority status first |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"getsquared"},"content":"(For all use cases below, the **System** is the `ClientCare` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"getsquared"},"content":"**Use case: Find a client by name**","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"getsquared"},"content":"1. User requests to find a specific client in the list by name","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows list of client that matches the name","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"getsquared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"getsquared"},"content":"* 2a. The list is empty as there is no matching name found.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"getsquared"},"content":"**Use case: Delete a client**","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"getsquared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":331,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"getsquared"},"content":"1. User requests to list clients or find client by name","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows a list of clients","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"getsquared"},"content":"3. User requests to delete a specific client in the list by index","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"getsquared"},"content":"4. ClientCare deletes the client","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"getsquared"},"content":" * 3a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"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":356,"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":357,"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":358,"author":{"gitId":"getsquared"},"content":"4. The system should respond to user input within 2 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"getsquared"},"content":"* **Client**: Customers or potential customers the insurance agent wants to keep in contact with","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"getsquared"},"content":"* **Command Line Interface (CLI)**: A text-based interface to input commands to interact with the system","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":367,"author":{"gitId":"getsquared"},"content":"* **AddressBook**: The underlying system that ClientCare is built on. Interchangeable with ClientCare.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":377,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":378,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"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":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"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":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"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":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"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":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"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":412,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":43,"-":379}},{"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\"\u003eClientCare\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"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":"getsquared"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-1/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"getsquared":1,"-":66}},{"path":"docs/team/reganchoy.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ReganChoy"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ReganChoy"},"content":"title: \"Regan Choy\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"ReganChoy"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":9,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ReganChoy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":14,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":15,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":16,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":17,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"ReganChoy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"ReganChoy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"ReganChoy"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"ReganChoy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"ReganChoy"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"ReganChoy"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"ReganChoy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"ReganChoy"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"ReganChoy"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"ReganChoy"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"ReganChoy"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"ReganChoy"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"ReganChoy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"ReganChoy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ReganChoy":46}},{"path":"docs/team/shuqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"getsquared"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"getsquared"},"content":"title: \"Shuqing\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"getsquared"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":9,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"getsquared"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":14,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":15,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":16,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":17,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"getsquared"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"getsquared"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"getsquared"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"getsquared"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"getsquared"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"getsquared"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"getsquared"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"getsquared"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"getsquared"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"getsquared"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"getsquared"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"getsquared"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"getsquared"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"getsquared"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"getsquared"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"getsquared"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"getsquared"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"getsquared"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"getsquared":46}}] +[{"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":"getsquared"},"content":"### Ge Shuqing","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":"\u003cimg src\u003d\"images/getsquared.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"[[github](http://github.com/getsquared)]","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"[[portfolio](team/shuqing.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":"* Role: Integration + Documentation","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":"* Role: Project Advisor","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"### Regan Choy","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":"\u003cimg src\u003d\"images/reganchoy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":"[[github](http://github.com/ReganChoy)]","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"[[portfolio](team/reganchoy.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":"* Role: Deliverables + Deadline + Scheduling","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":"* Responsibilities: Model","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"solomonng2001"},"content":"### Solomon Ng","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"solomonng2001"},"content":"\u003cimg src\u003d\"images/solomonng2001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"solomonng2001"},"content":"[[github](http://github.com/solomonng2001)] [[portfolio](team/solomonng.md)]","lastModifiedDate":"2024-03-05"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"solomonng2001"},"content":"* Role: Testing","lastModifiedDate":"2024-03-05"},{"lineNumber":53,"author":{"gitId":"solomonng2001"},"content":"* Responsibilities: Storage","lastModifiedDate":"2024-03-05"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":60,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":70,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":5,"ReganChoy":9,"solomonng2001":5,"-":54}},{"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":"getsquared"},"content":"* has a need to manage a significant number of clients for insurance policies","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"getsquared"},"content":"* has a need to organise schedules with clients and their details in one place","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"getsquared"},"content":"* has a need for reminders to keep in touch with clients","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"getsquared"},"content":"**Value proposition**: conveniently manage client details and schedules faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"getsquared"},"content":"|----------|-----------------|---------------------------------------------------------------|-----------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | add a new client contact details | keep track of the clients I have |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | delete a client | remove clients that are leaving |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"getsquared"},"content":"| `* * *` | insurance agent | find a client by name | locate details of client without having to go through the entire list |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | view client information | know and check client details |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | check what schedules I have with clients on a particular date | keep track of what I have to do in a day |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | add the birthday of my clients | wish them happy birthday to keep in contact with them |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | delete policy details for a client | remove expired policies of the client |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | see when I last met a client | check in on a client that I have not met for a long time |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"getsquared"},"content":"| `* *` | insurance agent | mark that a schedule is completed | know that i fulfilled the appointment scheduled |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"getsquared"},"content":"| `*` | insurance agent | sort clients by priority | deal with client with higher priority status first |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"getsquared"},"content":"(For all use cases below, the **System** is the `ClientCare` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"getsquared"},"content":"**Use case: Find a client by name**","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"getsquared"},"content":"1. User requests to find a specific client in the list by name","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows list of client that matches the name","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"getsquared"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"getsquared"},"content":"* 2a. The list is empty as there is no matching name found.","lastModifiedDate":"2024-03-05"},{"lineNumber":324,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":325,"author":{"gitId":"getsquared"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":327,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":328,"author":{"gitId":"getsquared"},"content":"**Use case: Delete a client**","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":330,"author":{"gitId":"getsquared"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":331,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":332,"author":{"gitId":"getsquared"},"content":"1. User requests to list clients or find client by name","lastModifiedDate":"2024-03-05"},{"lineNumber":333,"author":{"gitId":"getsquared"},"content":"2. ClientCare shows a list of clients","lastModifiedDate":"2024-03-05"},{"lineNumber":334,"author":{"gitId":"getsquared"},"content":"3. User requests to delete a specific client in the list by index","lastModifiedDate":"2024-03-05"},{"lineNumber":335,"author":{"gitId":"getsquared"},"content":"4. ClientCare deletes the client","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"getsquared"},"content":" * 3a1. ClientCare shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"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":356,"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":357,"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":358,"author":{"gitId":"getsquared"},"content":"4. The system should respond to user input within 2 seconds.","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"getsquared"},"content":"* **Client**: Customers or potential customers the insurance agent wants to keep in contact with","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"getsquared"},"content":"* **Command Line Interface (CLI)**: A text-based interface to input commands to interact with the system","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":367,"author":{"gitId":"getsquared"},"content":"* **AddressBook**: The underlying system that ClientCare is built on. Interchangeable with ClientCare.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":377,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":378,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"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":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"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":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","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"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"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":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"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":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"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":412,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"getsquared":43,"-":379}},{"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\"\u003eClientCare\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"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":"getsquared"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-W12-1/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"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":{"getsquared":1,"-":66}},{"path":"docs/team/reganchoy.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"ReganChoy"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"ReganChoy"},"content":"title: \"Regan Choy\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"ReganChoy"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"ReganChoy"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":9,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"ReganChoy"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":14,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":15,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":16,"author":{"gitId":"ReganChoy"},"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-05"},{"lineNumber":17,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"ReganChoy"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"ReganChoy"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"ReganChoy"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"ReganChoy"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"ReganChoy"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"ReganChoy"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"ReganChoy"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"ReganChoy"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"ReganChoy"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"ReganChoy"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"ReganChoy"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"ReganChoy"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"ReganChoy"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"ReganChoy"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"ReganChoy"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"ReganChoy"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"ReganChoy"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"ReganChoy"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"ReganChoy"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"ReganChoy"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"ReganChoy"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"ReganChoy"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"ReganChoy"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"ReganChoy":46}},{"path":"docs/team/shuqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"getsquared"},"content":"layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"getsquared"},"content":"title: \"Shuqing\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"getsquared"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"getsquared"},"content":"### Project: ClientCare","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":9,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"getsquared"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":14,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":15,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":16,"author":{"gitId":"getsquared"},"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-05"},{"lineNumber":17,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"getsquared"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"getsquared"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"getsquared"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"getsquared"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"getsquared"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"getsquared"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"getsquared"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"getsquared"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"getsquared"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"getsquared"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"getsquared"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"getsquared"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"getsquared"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"getsquared"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"getsquared"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"getsquared"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"getsquared"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"getsquared"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"getsquared"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"getsquared"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"getsquared"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"getsquared"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"getsquared"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"getsquared":46}},{"path":"docs/team/solomonng.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"solomonng2001"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"solomonng2001"},"content":" layout: default.md","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"solomonng2001"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-05"},{"lineNumber":4,"author":{"gitId":"solomonng2001"},"content":"---","lastModifiedDate":"2024-03-05"},{"lineNumber":5,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":6,"author":{"gitId":"solomonng2001"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-05"},{"lineNumber":7,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"solomonng2001"},"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-05"},{"lineNumber":9,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":10,"author":{"gitId":"solomonng2001"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-05"},{"lineNumber":11,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":12,"author":{"gitId":"solomonng2001"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-05"},{"lineNumber":13,"author":{"gitId":"solomonng2001"},"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-05"},{"lineNumber":14,"author":{"gitId":"solomonng2001"},"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-05"},{"lineNumber":15,"author":{"gitId":"solomonng2001"},"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-05"},{"lineNumber":16,"author":{"gitId":"solomonng2001"},"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-05"},{"lineNumber":17,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":18,"author":{"gitId":"solomonng2001"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-05"},{"lineNumber":19,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":20,"author":{"gitId":"solomonng2001"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-05"},{"lineNumber":21,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":22,"author":{"gitId":"solomonng2001"},"content":"* **Project management**:","lastModifiedDate":"2024-03-05"},{"lineNumber":23,"author":{"gitId":"solomonng2001"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-05"},{"lineNumber":24,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":25,"author":{"gitId":"solomonng2001"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-05"},{"lineNumber":26,"author":{"gitId":"solomonng2001"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-05"},{"lineNumber":27,"author":{"gitId":"solomonng2001"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":29,"author":{"gitId":"solomonng2001"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-05"},{"lineNumber":30,"author":{"gitId":"solomonng2001"},"content":" * User Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":31,"author":{"gitId":"solomonng2001"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-05"},{"lineNumber":32,"author":{"gitId":"solomonng2001"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-05"},{"lineNumber":33,"author":{"gitId":"solomonng2001"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-05"},{"lineNumber":34,"author":{"gitId":"solomonng2001"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-05"},{"lineNumber":35,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":36,"author":{"gitId":"solomonng2001"},"content":"* **Community**:","lastModifiedDate":"2024-03-05"},{"lineNumber":37,"author":{"gitId":"solomonng2001"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-05"},{"lineNumber":38,"author":{"gitId":"solomonng2001"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-05"},{"lineNumber":39,"author":{"gitId":"solomonng2001"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-05"},{"lineNumber":40,"author":{"gitId":"solomonng2001"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-05"},{"lineNumber":41,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":42,"author":{"gitId":"solomonng2001"},"content":"* **Tools**:","lastModifiedDate":"2024-03-05"},{"lineNumber":43,"author":{"gitId":"solomonng2001"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-05"},{"lineNumber":44,"author":{"gitId":"solomonng2001"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-05"},{"lineNumber":45,"author":{"gitId":"solomonng2001"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":46,"author":{"gitId":"solomonng2001"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"solomonng2001":46}}] diff --git a/AY2324S2-CS2103T-W12-1_tp_master/commits.json b/AY2324S2-CS2103T-W12-1_tp_master/commits.json index 55538f08..00ecea3f 100644 --- a/AY2324S2-CS2103T-W12-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W12-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"getsquared":[{"date":"2024-03-05","commitResults":[{"hash":"39ea1f1fa1afce0456ff0b1288151b2aa0449569","isMergeCommit":false,"messageTitle":"Add info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"3a3e3f5c068f6a3534397c6af710f823b850e8ed","isMergeCommit":false,"messageTitle":"Update info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8a0f965fcf9f26b526ed4efbe62b47b3d0163cfc","isMergeCommit":false,"messageTitle":"Update Website Navbar Github Link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"69226491532efdc47d888697436b1ed041a072bf","isMergeCommit":false,"messageTitle":"Update DG Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":18}}}]}],"ReganChoy":[{"date":"2024-02-25","commitResults":[{"hash":"3a7ec979d8f15325c7f31b1f51946536fae91b31","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":86,"deletions":0}}},{"hash":"1910c330493fb2d66724749ae4650a6620903b7a","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":148,"deletions":46}}}]},{"date":"2024-03-05","commitResults":[{"hash":"bb196b2ea48c3731d2c9a1488986a7b56bb99fca","isMergeCommit":true,"messageTitle":"Merge pull request #25 from getsquared/add-getsquared-info","messageBody":"Add Shuqing AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"082c80138aee6a0d3502c740f66e1149243df4f2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from getsquared/update-docs-settings","messageBody":"Update Website Navbar Github Link","fileTypesAndContributionMap":{}},{"hash":"0c737d7b30e0a18c54fe2e92ac075384da7f9266","isMergeCommit":true,"messageTitle":"Merge pull request #36 from getsquared/add-dg-requirements","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"0a2ab9906b6efcc28bd28d1b4ae79d363c21fa73","isMergeCommit":false,"messageTitle":"Reset master branch back to origin state","messageBody":"Copy origin src folder back into the branch\n","fileTypesAndContributionMap":{"functional-code":{"insertions":11,"deletions":48}}},{"hash":"1fea686b0b0fdf00852a3f757d5fcd9f06e9d197","isMergeCommit":false,"messageTitle":"Remove MetCommand class file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":91}}},{"hash":"972427777c85a30d40d854d851bb01e288eabde8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f8649316089211b45b834035c45817648d078d4","isMergeCommit":false,"messageTitle":"Add ReganChoy AboutUs info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":0}}},{"hash":"dfe3a7435b5f895b1dcfa0bd766f33c5abfb9161","isMergeCommit":false,"messageTitle":"Fix naming error in aboutMe","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9385de5870c9d8724b5b5c1574f93ae70954a1d9","isMergeCommit":false,"messageTitle":"Fix check errors","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60},"docs":{"insertions":46,"deletions":46}}},{"hash":"398a53ad1f4f809ddd95f3c26658422e5cc5b06d","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"solomonng2001":[{"date":"2024-03-05","commitResults":[{"hash":"7609ad60931949f6f6a8e02bfd363e0736272924","isMergeCommit":true,"messageTitle":"Merge pull request #47 from ReganChoy/branch_aboutus","messageBody":"Add ReganChoy AboutUs Info","fileTypesAndContributionMap":{}}]}],"yorklim":[]},"authorFileTypeContributionMap":{"getsquared":{"docs":95,"functional-code":0,"test-code":0},"ReganChoy":{"docs":58,"functional-code":0,"test-code":0},"solomonng2001":{"docs":0,"functional-code":0,"test-code":0},"yorklim":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"getsquared":1100.0,"ReganChoy":14694.555,"solomonng2001":0.0,"yorklim":0.0},"authorDisplayNameMap":{"getsquared":"CS2103T-W12-1 GE S..QING","ReganChoy":"CS2103T-W12-1 REGA..N FU","solomonng2001":"CS2103T-W12-1 NG R..OMON","yorklim":"CS2103T-W12-1 CHIA.. LIM"}} +{"authorDailyContributionsMap":{"getsquared":[{"date":"2024-03-05","commitResults":[{"hash":"39ea1f1fa1afce0456ff0b1288151b2aa0449569","isMergeCommit":false,"messageTitle":"Add info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"3a3e3f5c068f6a3534397c6af710f823b850e8ed","isMergeCommit":false,"messageTitle":"Update info in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"8a0f965fcf9f26b526ed4efbe62b47b3d0163cfc","isMergeCommit":false,"messageTitle":"Update Website Navbar Github Link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"69226491532efdc47d888697436b1ed041a072bf","isMergeCommit":false,"messageTitle":"Update DG Requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":18}}}]}],"ReganChoy":[{"date":"2024-02-25","commitResults":[{"hash":"3a7ec979d8f15325c7f31b1f51946536fae91b31","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":86,"deletions":0}}},{"hash":"1910c330493fb2d66724749ae4650a6620903b7a","isMergeCommit":false,"messageTitle":"Add new MetCommand class","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":148,"deletions":46}}}]},{"date":"2024-03-05","commitResults":[{"hash":"bb196b2ea48c3731d2c9a1488986a7b56bb99fca","isMergeCommit":true,"messageTitle":"Merge pull request #25 from getsquared/add-getsquared-info","messageBody":"Add Shuqing AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"082c80138aee6a0d3502c740f66e1149243df4f2","isMergeCommit":true,"messageTitle":"Merge pull request #35 from getsquared/update-docs-settings","messageBody":"Update Website Navbar Github Link","fileTypesAndContributionMap":{}},{"hash":"0c737d7b30e0a18c54fe2e92ac075384da7f9266","isMergeCommit":true,"messageTitle":"Merge pull request #36 from getsquared/add-dg-requirements","messageBody":"Update DG Requirements","fileTypesAndContributionMap":{}},{"hash":"0a2ab9906b6efcc28bd28d1b4ae79d363c21fa73","isMergeCommit":false,"messageTitle":"Reset master branch back to origin state","messageBody":"Copy origin src folder back into the branch\n","fileTypesAndContributionMap":{"functional-code":{"insertions":11,"deletions":48}}},{"hash":"1fea686b0b0fdf00852a3f757d5fcd9f06e9d197","isMergeCommit":false,"messageTitle":"Remove MetCommand class file","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":91}}},{"hash":"972427777c85a30d40d854d851bb01e288eabde8","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W12-1/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f8649316089211b45b834035c45817648d078d4","isMergeCommit":false,"messageTitle":"Add ReganChoy AboutUs info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":0}}},{"hash":"dfe3a7435b5f895b1dcfa0bd766f33c5abfb9161","isMergeCommit":false,"messageTitle":"Fix naming error in aboutMe","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9385de5870c9d8724b5b5c1574f93ae70954a1d9","isMergeCommit":false,"messageTitle":"Fix check errors","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":60},"docs":{"insertions":46,"deletions":46}}},{"hash":"398a53ad1f4f809ddd95f3c26658422e5cc5b06d","isMergeCommit":false,"messageTitle":"Fix name change","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"solomonng2001":[{"date":"2024-03-05","commitResults":[{"hash":"735042ec98fecd4dcfbb1dc9a63885e98103cfa1","isMergeCommit":false,"messageTitle":"Add solomonng info in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":5}}},{"hash":"9373c40d227a562e98f1957a46fb86ad97e12767","isMergeCommit":false,"messageTitle":"Refactor solomonng2001 photo link in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7609ad60931949f6f6a8e02bfd363e0736272924","isMergeCommit":true,"messageTitle":"Merge pull request #47 from ReganChoy/branch_aboutus","messageBody":"Add ReganChoy AboutUs Info","fileTypesAndContributionMap":{}},{"hash":"5285950245ad9624602d5954e2bb16ac335fb1bb","isMergeCommit":true,"messageTitle":"Merge fix for met class errors Merge branch \u0027master\u0027 into add-solomonng-aboutus","messageBody":"","fileTypesAndContributionMap":{}}]}],"yorklim":[{"date":"2024-03-06","commitResults":[{"hash":"1b0f8c9f7d675c1a147026367750ba7fc20541f9","isMergeCommit":true,"messageTitle":"Merge pull request #49 from solomonng2001/add-solomonng-aboutus","messageBody":"Add solomonng aboutus info","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"getsquared":{"docs":95,"functional-code":0,"test-code":0},"ReganChoy":{"docs":55,"functional-code":0,"test-code":0},"solomonng2001":{"docs":51,"functional-code":0,"test-code":0},"yorklim":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"getsquared":1022.4853,"ReganChoy":13768.713,"solomonng2001":238.86388,"yorklim":0.0},"authorDisplayNameMap":{"getsquared":"CS2103T-W12-1 GE S..QING","ReganChoy":"CS2103T-W12-1 REGA..N FU","solomonng2001":"CS2103T-W12-1 NG R..OMON","yorklim":"CS2103T-W12-1 CHIA.. LIM"}} diff --git a/AY2324S2-CS2103T-W13-3_tp_master/authorship.json b/AY2324S2-CS2103T-W13-3_tp_master/authorship.json index 38182a87..5fb5fe76 100644 --- a/AY2324S2-CS2103T-W13-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W13-3_tp_master/authorship.json @@ -1 +1 @@ -[{"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":"HongRay"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eRainbow Dragon\u003c/a\u003e","lastModifiedDate":"2024-02-23"},{"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":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"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":{"HongRay":1,"-":66}},{"path":"members/Cedricaca.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Cedricaca"},"content":"I am bad at CS lol","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Cedricaca":1}}] +[{"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":"HongRay"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eRainbow Dragon\u003c/a\u003e","lastModifiedDate":"2024-02-23"},{"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":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"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":{"HongRay":1,"-":66}},{"path":"members/Cedricaca.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Xuyan0518"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Xuyan0518":1}},{"path":"members/Xuyan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Xuyan0518"},"content":"","lastModifiedDate":"2024-03-05"}],"authorContributionMap":{"Xuyan0518":1}}] diff --git a/AY2324S2-CS2103T-W13-3_tp_master/commits.json b/AY2324S2-CS2103T-W13-3_tp_master/commits.json index 5da96615..95e66bf6 100644 --- a/AY2324S2-CS2103T-W13-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W13-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"ChenXy128":[],"HongRay":[{"date":"2024-02-23","commitResults":[{"hash":"5cb5fb2f021702e67ed979849d0260edf5d40e3e","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/switch-docs-to-markbind\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8aa20a20638241550b26b946f95396caa93462c5","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"changed name as instructed","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"d222d5a78b1f54f40d7c08b05d08c888db67b1d4","isMergeCommit":false,"messageTitle":"Add file and directory","messageBody":"Added file and directory as instructed\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"ab256704770f2944a8c727cbf1afdbf2c1f1002d","isMergeCommit":true,"messageTitle":"Merge pull request #9 from HongRay/add-{Hong-Ray}-info","messageBody":"Add file and directory","fileTypesAndContributionMap":{}}]}],"Cedricaca":[{"date":"2024-03-05","commitResults":[{"hash":"02c4c145b6d0093392ac59f7518d5255ffcc2c1d","isMergeCommit":false,"messageTitle":"added Cedricaca.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"f91d437165e6bec5614c30bf9c86e3e7e11fabff","isMergeCommit":true,"messageTitle":"Merge pull request #1 from Cedricaca/add-Cedricaca-info","messageBody":"added Cedricaca.md","fileTypesAndContributionMap":{}}]}],"Xuyan0518":[],"NusMinato":[{"date":"2024-03-05","commitResults":[{"hash":"59731184317b43e1dba4ed38d563e3e3f94aa0e2","isMergeCommit":false,"messageTitle":"Add Chengzhen.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"c6e9dce85a8b3662b7ff1615aee4ad230a17dd36","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W13-3:master\u0027 into add-LiChengzhen-info","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f98dbe670e6d4b3e2ba166b4a88b6e4ba79b7703","isMergeCommit":true,"messageTitle":"Merge pull request #16 from NusMinato/add-LiChengzhen-info","messageBody":"Add Chengzhen.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"ChenXy128":{"docs":0,"functional-code":0,"test-code":0},"HongRay":{"docs":1,"functional-code":0,"test-code":0},"Cedricaca":{"docs":1,"functional-code":0,"test-code":0},"Xuyan0518":{"docs":0,"functional-code":0,"test-code":0},"NusMinato":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ChenXy128":0.0,"HongRay":0.30555546,"Cedricaca":0.07638889,"Xuyan0518":0.0,"NusMinato":0.0},"authorDisplayNameMap":{"ChenXy128":"CS2103T-W13-3 CHEN..YANG","HongRay":"CS2103T-W13-3 NG H.. RAY","Cedricaca":"CS2103T-W13-3 TAN ..DRIC","Xuyan0518":"CS2103T-W13-3 ZHOU..UYAN","NusMinato":"CS2103T-W13-3 LI C..ZHEN"}} +{"authorDailyContributionsMap":{"ChenXy128":[{"date":"2024-03-05","commitResults":[{"hash":"9cdae2465e4f80a615ef0e48602418efe2ee10a7","isMergeCommit":false,"messageTitle":"Adds Xiaoyang.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"ced41adcc920ff00527dcfc1c65456a5603aed6a","isMergeCommit":false,"messageTitle":"Adds Xiaoyang.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"b9dbfcb6defd121cbd84cfe0bbaa2297884c549d","isMergeCommit":false,"messageTitle":"Adds Xiaoyang.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}}]}],"HongRay":[{"date":"2024-02-23","commitResults":[{"hash":"5cb5fb2f021702e67ed979849d0260edf5d40e3e","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/switch-docs-to-markbind\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8aa20a20638241550b26b946f95396caa93462c5","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"changed name as instructed","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-05","commitResults":[{"hash":"d222d5a78b1f54f40d7c08b05d08c888db67b1d4","isMergeCommit":false,"messageTitle":"Add file and directory","messageBody":"Added file and directory as instructed\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"ab256704770f2944a8c727cbf1afdbf2c1f1002d","isMergeCommit":true,"messageTitle":"Merge pull request #9 from HongRay/add-{Hong-Ray}-info","messageBody":"Add file and directory","fileTypesAndContributionMap":{}},{"hash":"3dcc30e3f73c2ea967c4390fed5f23023ba10632","isMergeCommit":true,"messageTitle":"Merge pull request #19 from ChenXy128/XiaoyangMd","messageBody":"Adds Xiaoyang.md","fileTypesAndContributionMap":{}},{"hash":"cc8f9f3874934289f827d29f87aa5959b1b4634d","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Xuyan0518/add-xuyan-info","messageBody":"Add xuyan.md","fileTypesAndContributionMap":{}}]}],"Cedricaca":[{"date":"2024-03-05","commitResults":[{"hash":"02c4c145b6d0093392ac59f7518d5255ffcc2c1d","isMergeCommit":false,"messageTitle":"added Cedricaca.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"f91d437165e6bec5614c30bf9c86e3e7e11fabff","isMergeCommit":true,"messageTitle":"Merge pull request #1 from Cedricaca/add-Cedricaca-info","messageBody":"added Cedricaca.md","fileTypesAndContributionMap":{}}]}],"Xuyan0518":[{"date":"2024-03-05","commitResults":[{"hash":"4706acec585f0c2ef225a373b892e396e850de0e","isMergeCommit":false,"messageTitle":"Add Xuyan.md","messageBody":"Xuyan.md contains some info about me.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"8e3b91ad6cbe7f841088d84c96834db3aff20f96","isMergeCommit":false,"messageTitle":"Add Xuyan.md","messageBody":"Xuyan.md contains some info about me.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"431230b78209461b1ff05e5c9f0f930f60b88fc6","isMergeCommit":false,"messageTitle":"Add Xuyan.md","messageBody":"Xuyan.md contains some info about me.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"NusMinato":[{"date":"2024-03-05","commitResults":[{"hash":"59731184317b43e1dba4ed38d563e3e3f94aa0e2","isMergeCommit":false,"messageTitle":"Add Chengzhen.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"c6e9dce85a8b3662b7ff1615aee4ad230a17dd36","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W13-3:master\u0027 into add-LiChengzhen-info","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f98dbe670e6d4b3e2ba166b4a88b6e4ba79b7703","isMergeCommit":true,"messageTitle":"Merge pull request #16 from NusMinato/add-LiChengzhen-info","messageBody":"Add Chengzhen.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"ChenXy128":{"docs":0,"functional-code":0,"test-code":0},"HongRay":{"docs":1,"functional-code":0,"test-code":0},"Cedricaca":{"docs":0,"functional-code":0,"test-code":0},"Xuyan0518":{"docs":2,"functional-code":0,"test-code":0},"NusMinato":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"ChenXy128":0.0,"HongRay":0.30555546,"Cedricaca":0.07638889,"Xuyan0518":1.9097223,"NusMinato":0.0},"authorDisplayNameMap":{"ChenXy128":"CS2103T-W13-3 CHEN..YANG","HongRay":"CS2103T-W13-3 NG H.. RAY","Cedricaca":"CS2103T-W13-3 TAN ..DRIC","Xuyan0518":"CS2103T-W13-3 ZHOU..UYAN","NusMinato":"CS2103T-W13-3 LI C..ZHEN"}} diff --git a/archive.zip b/archive.zip index 33d14cd07fdefc9fc80330c783707e359e0e5872..3e052a239ea67238974bd6b3532688dce0442a32 100644 GIT binary patch delta 114393 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

PnsGuu&fx?-2uDMg7gm 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 Cf2vLZ delta 97223 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%0DgVG^-SNcV0voHFN2q<@{zc+1&-df4hpa1E#+$ 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 J;K2gu{{WztCtCmj diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 3955e4bd..f924974f 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,42 +1,42 @@ -Mar 05, 2024 2:46:45 PM reposense.system.LogsManager addFileHandler +Mar 05, 2024 4:17:41 PM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 05, 2024 2:46:45 PM reposense.parser.CsvParser validateHeader +Mar 05, 2024 4:17:41 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 05, 2024 2:46:45 PM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 05, 2024 4:17:41 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 05, 2024 2:46:45 PM reposense.parser.CsvParser validateHeader +Mar 05, 2024 4:17:42 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 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 05, 2024 2:46:45 PM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 05, 2024 4:17:42 PM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 05, 2024 2:46:45 PM reposense.parser.CsvParser validateHeader +Mar 05, 2024 4:17:42 PM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 05, 2024 2:46:45 PM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 05, 2024 4:17:42 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 @@ -52,1455 +52,1481 @@ 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 05, 2024 2:46:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 05, 2024 2:46:45 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:42 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 05, 2024 2:46:46 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:17:43 PM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 05, 2024 2:46:46 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:43 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 05, 2024 4:17:43 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 05, 2024 4:17:43 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! +Mar 05, 2024 4:17:43 PM reposense.report.ReportGenerator analyzeRepos +INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 05, 2024 2:46:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:43 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:43 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:43 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 05, 2024 4:17:43 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 05, 2024 4:17:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 05, 2024 2:46:46 PM reposense.report.ReportGenerator analyzeRepos -INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 05, 2024 2:46:46 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 05, 2024 2:46:46 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 05, 2024 2:46:47 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator analyzeRepos -INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 05, 2024 2:46:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:44 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 05, 2024 2:46:47 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 05, 2024 2:46:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator analyzeRepos +INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... +Mar 05, 2024 4:17:44 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... +Mar 05, 2024 4:17:44 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:44 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:44 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 05, 2024 2:46:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:45 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepos -INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 05, 2024 2:46:48 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:45 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:45 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 05, 2024 2:46:48 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:45 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 05, 2024 2:46:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator analyzeRepos +INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! +Mar 05, 2024 4:17:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator analyzeRepos +INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... +Mar 05, 2024 4:17:46 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:46 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator analyzeRepos -INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 05, 2024 2:46:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:46 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 05, 2024 4:17:46 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 05, 2024 4:17:47 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator analyzeRepos -INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:47 PM reposense.report.ReportGenerator analyzeRepos +INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 05, 2024 4:17:47 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... +Mar 05, 2024 4:17:47 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... +Mar 05, 2024 4:17:47 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:47 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 05, 2024 2:46:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:47 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:47 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:47 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! +Mar 05, 2024 4:17:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... +Mar 05, 2024 4:17:48 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:48 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 05, 2024 4:17:48 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! +Mar 05, 2024 4:17:48 PM reposense.report.ReportGenerator analyzeRepos +INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... +Mar 05, 2024 4:17:48 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... +Mar 05, 2024 4:17:48 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 05, 2024 4:17:48 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 05, 2024 2:46:50 PM reposense.report.ReportGenerator analyzeRepos -INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator analyzeRepos +INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 05, 2024 2:46:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 05, 2024 2:46:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.ReportGenerator analyzeRepos -INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 05, 2024 2:46:50 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator analyzeRepos +INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:49 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! +Mar 05, 2024 4:17:49 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepos -INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:49 PM reposense.report.ReportGenerator analyzeRepos +INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! +Mar 05, 2024 4:17:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator analyzeRepos +INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:50 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepos -INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:50 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 05, 2024 4:17:50 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepos INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 05, 2024 2:46:51 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepos -INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 05, 2024 2:46:52 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 05, 2024 2:46:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepos +INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... +Mar 05, 2024 4:17:51 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:51 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 05, 2024 4:17:51 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! +Mar 05, 2024 4:17:52 PM reposense.report.ReportGenerator analyzeRepos +INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... +Mar 05, 2024 4:17:52 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:17:52 PM reposense.report.ReportGenerator analyzeRepos INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:52 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:52 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:52 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator analyzeRepos -INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:52 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 05, 2024 4:17:52 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... +Mar 05, 2024 4:17:52 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! +Mar 05, 2024 4:17:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator analyzeRepos +INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 05, 2024 2:46:53 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 05, 2024 2:46:53 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 05, 2024 2:46:54 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 05, 2024 2:46:54 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 05, 2024 2:46:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 05, 2024 2:46:54 PM reposense.report.ReportGenerator analyzeRepos -INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 05, 2024 2:46:54 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 05, 2024 2:46:54 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... +Mar 05, 2024 4:17:53 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... +Mar 05, 2024 4:17:53 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:53 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:53 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator analyzeRepos +INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... +Mar 05, 2024 4:17:54 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:54 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 05, 2024 4:17:54 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! +Mar 05, 2024 4:17:54 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 05, 2024 4:17:55 PM reposense.report.ReportGenerator analyzeRepos +INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:55 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:55 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 05, 2024 2:46:55 PM reposense.report.ReportGenerator analyzeRepos -INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator analyzeRepos +INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepos -INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepos -INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 05, 2024 2:46:56 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 05, 2024 2:46:56 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 05, 2024 2:46:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 05, 2024 4:17:56 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator analyzeRepos +INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 05, 2024 4:17:56 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... +Mar 05, 2024 4:17:56 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:56 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepos INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 05, 2024 2:46:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepos INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:57 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 05, 2024 2:46:57 PM reposense.report.ReportGenerator analyzeRepos -INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 05, 2024 2:46:57 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:57 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 05, 2024 4:17:57 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! +Mar 05, 2024 4:17:58 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator analyzeRepos -INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:17:58 PM reposense.report.ReportGenerator analyzeRepos +INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 05, 2024 4:17:58 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... +Mar 05, 2024 4:17:58 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... +Mar 05, 2024 4:17:58 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:17:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator analyzeRepos -INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! +Mar 05, 2024 4:17:59 PM reposense.report.ReportGenerator analyzeRepos +INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... +Mar 05, 2024 4:17:59 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:17:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! +Mar 05, 2024 4:17:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 05, 2024 2:46:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:17:59 PM reposense.report.ReportGenerator analyzeRepos +INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 05, 2024 4:17:59 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:58 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 05, 2024 2:46:58 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 05, 2024 2:46:58 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 05, 2024 2:46:59 PM reposense.report.ReportGenerator analyzeRepos -INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator analyzeRepos +INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator analyzeRepos +INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 05, 2024 2:46:59 PM reposense.report.ReportGenerator analyzeRepos -INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:00 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 05, 2024 2:46:59 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:46:59 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 05, 2024 2:46:59 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 05, 2024 4:18:00 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 05, 2024 2:47:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:02 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... +Mar 05, 2024 4:18:02 PM reposense.report.ReportGenerator analyzeRepos +INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 05, 2024 4:18:02 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:00 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 05, 2024 2:47:00 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 05, 2024 2:47:00 PM reposense.report.ReportGenerator analyzeRepos -INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 05, 2024 2:47:00 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepos +INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 05, 2024 2:47:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator analyzeRepos -INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 05, 2024 2:47:01 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! +Mar 05, 2024 4:18:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 05, 2024 2:47:01 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator analyzeRepos INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 05, 2024 2:47:01 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:03 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 05, 2024 2:47:01 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:01 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:03 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 05, 2024 2:47:02 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator analyzeRepos INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 05, 2024 2:47:02 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 05, 2024 2:47:02 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 05, 2024 4:18:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 05, 2024 2:47:02 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator analyzeRepos INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 05, 2024 2:47:02 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:04 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 05, 2024 2:47:02 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:04 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:02 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 05, 2024 2:47:02 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:05 PM reposense.report.ReportGenerator analyzeRepos INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:05 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 05, 2024 2:47:03 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:05 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:05 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:03 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 05, 2024 2:47:03 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 05, 2024 2:47:03 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 05, 2024 2:47:03 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:05 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 05, 2024 2:47:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepos -INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator analyzeRepos -INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 05, 2024 2:47:04 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 05, 2024 2:47:04 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepos +INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... +Mar 05, 2024 4:18:06 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:04 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator analyzeRepos -INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:06 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! +Mar 05, 2024 4:18:07 PM reposense.report.ReportGenerator analyzeRepos +INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... +Mar 05, 2024 4:18:07 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 05, 2024 4:18:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:07 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator analyzeRepos -INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! +Mar 05, 2024 4:18:07 PM reposense.report.ReportGenerator analyzeRepos +INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... +Mar 05, 2024 4:18:07 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... +Mar 05, 2024 4:18:07 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 05, 2024 4:18:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:05 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 05, 2024 2:47:05 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepos -INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepos +INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepos -INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepos +INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... +Mar 05, 2024 4:18:08 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:06 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:08 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 05, 2024 4:18:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator analyzeRepos +INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 05, 2024 2:47:06 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 05, 2024 2:47:06 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator analyzeRepos INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 05, 2024 2:47:06 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... +Mar 05, 2024 4:18:09 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 05, 2024 4:18:09 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator analyzeRepos -INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator analyzeRepos +INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:10 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 05, 2024 4:18:10 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator analyzeRepos INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 05, 2024 2:47:07 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 05, 2024 2:47:07 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:07 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 05, 2024 2:47:07 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 05, 2024 2:47:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator analyzeRepos INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:11 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:11 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator analyzeRepos INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator analyzeRepos INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:08 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 05, 2024 2:47:08 PM reposense.report.ReportGenerator analyzeRepos -INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator analyzeRepos +INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 05, 2024 2:47:08 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:12 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 05, 2024 4:18:12 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! +Mar 05, 2024 4:18:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 05, 2024 4:18:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator analyzeRepos +INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator analyzeRepos +INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... +Mar 05, 2024 4:18:13 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:13 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 05, 2024 2:47:09 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator analyzeRepos -INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 05, 2024 2:47:09 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 05, 2024 2:47:09 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:09 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 05, 2024 4:18:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 05, 2024 4:18:14 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepos -INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepos -INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:14 PM reposense.report.ReportGenerator analyzeRepos +INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:14 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 05, 2024 2:47:10 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 05, 2024 2:47:10 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:14 PM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 05, 2024 4:18:14 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... +Mar 05, 2024 4:18:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:14 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 05, 2024 2:47:10 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 05, 2024 2:47:10 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:10 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 05, 2024 2:47:11 PM reposense.report.ReportGenerator analyzeRepos -INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 05, 2024 2:47:11 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:11 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 05, 2024 2:47:11 PM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator analyzeRepos +INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... +Mar 05, 2024 4:18:15 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... +Mar 05, 2024 4:18:15 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 05, 2024 2:47:11 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepos INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepos INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:16 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:12 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 05, 2024 2:47:12 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:16 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:17 PM reposense.report.ReportGenerator analyzeRepos INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:17 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:13 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:17 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 05, 2024 2:47:13 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 05, 2024 2:47:13 PM reposense.report.ReportGenerator analyzeRepos -INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 05, 2024 2:47:13 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 05, 2024 2:47:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:17 PM reposense.report.ReportGenerator analyzeRepos +INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... +Mar 05, 2024 4:18:17 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator analyzeRepos -INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 05, 2024 2:47:14 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:14 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 05, 2024 2:47:14 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 05, 2024 2:47:14 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator analyzeRepos +INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... +Mar 05, 2024 4:18:18 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 05, 2024 4:18:18 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 05, 2024 4:18:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! +Mar 05, 2024 4:18:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 05, 2024 2:47:15 PM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 05, 2024 2:47:15 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 05, 2024 2:47:15 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator analyzeRepos +INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... +Mar 05, 2024 4:18:19 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 05, 2024 4:18:19 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 05, 2024 2:47:15 PM reposense.report.ReportGenerator analyzeRepos -INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 05, 2024 2:47:15 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:20 PM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... +Mar 05, 2024 4:18:20 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:15 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 05, 2024 2:47:15 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:20 PM reposense.report.ReportGenerator analyzeRepos +INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... +Mar 05, 2024 4:18:20 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... +Mar 05, 2024 4:18:20 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:20 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 05, 2024 4:18:20 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator analyzeRepos -INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator analyzeRepos +INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator analyzeRepos -INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:21 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 05, 2024 2:47:16 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:16 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:21 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 05, 2024 4:18:21 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! +Mar 05, 2024 4:18:21 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 05, 2024 4:18:22 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 05, 2024 4:18:22 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess WARNING: Exception met while trying to clone the repo "AY2324S2-CS2103T-F12-1/tp[master]", will skip this repo. reposense.system.CommandRunnerProcessException: Error returned from command git clone --bare 'https://github.com/AY2324S2-CS2103T-F12-1/tp.git' 'repos/AY2324S2-CS2103T-F12-1_tp/tp_bare' on path . : Cloning into bare repository 'repos/AY2324S2-CS2103T-F12-1_tp/tp_bare'... @@ -1516,201 +1542,175 @@ fatal: could not read Username for 'https://github.com': No such device or addre at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 05, 2024 2:47:16 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 05, 2024 2:47:16 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepos -INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepos -INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 05, 2024 2:47:17 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepos -INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... +Mar 05, 2024 4:18:23 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! +Mar 05, 2024 4:18:23 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator analyzeRepos +INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator analyzeRepos -INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 05, 2024 2:47:17 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:17 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 05, 2024 2:47:17 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! +Mar 05, 2024 4:18:23 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:23 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:23 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... +Mar 05, 2024 4:18:24 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:24 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 05, 2024 4:18:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 05, 2024 4:18:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 05, 2024 4:18:24 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! +Mar 05, 2024 4:18:24 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 05, 2024 4:18:24 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 05, 2024 4:18:24 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepos -INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepos +INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepos +INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepos INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:18 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 05, 2024 2:47:18 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 05, 2024 2:47:18 PM reposense.report.ReportGenerator analyzeRepos -INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner spawnCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator analyzeRepos +INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 05, 2024 2:47:18 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:25 PM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 05, 2024 2:47:19 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepos -INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:25 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:25 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 05, 2024 4:18:25 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! +Mar 05, 2024 4:18:26 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepos +INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 05, 2024 2:47:19 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepos -INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:26 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepos +INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 05, 2024 2:47:19 PM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepos -INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:26 PM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepos +INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 05, 2024 2:47:19 PM reposense.report.RepoCloner waitForCloneProcess +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. +Mar 05, 2024 4:18:26 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 05, 2024 4:18:26 PM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! +Mar 05, 2024 4:18:27 PM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator analyzeRepos +Mar 05, 2024 4:18:27 PM reposense.report.ReportGenerator analyzeRepos INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.report.ReportGenerator updateRepoConfig +Mar 05, 2024 4:18:27 PM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 05, 2024 2:47:19 PM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 05, 2024 4:18:27 PM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 05, 2024 2:47:19 PM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 05, 2024 4:18:27 PM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 05, 2024 2:47:20 PM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 05, 2024 4:18:27 PM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 05, 2024 2:47:20 PM reposense.report.ReportGenerator analyzeRepo +Mar 05, 2024 4:18:27 PM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 05, 2024 2:47:20 PM reposense.report.ReportGenerator generateReposReport +Mar 05, 2024 4:18:27 PM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 05, 2024 2:47:20 PM reposense.RepoSense main -INFO: Elapsed processing time: 35.13 second(s) +Mar 05, 2024 4:18:27 PM reposense.RepoSense main +INFO: Elapsed processing time: 45.86 second(s) diff --git a/summary.json b/summary.json index c2265202..bad564e2 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Tue Mar 5 22:46:45 2024 UTC+08:00","reportGenerationTime":" 34.92 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-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":[{"repoName":"AY2324S2-CS2103T-F12-1/tp[master]","errorMessage":"Failed to clone from https://github.com/AY2324S2-CS2103T-F12-1/tp.git"}],"sinceDate":"2024-02-23","untilDate":"2024-03-05","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":"Wed Mar 6 00:17:42 2024 UTC+08:00","reportGenerationTime":" 45.65 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-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":[{"repoName":"AY2324S2-CS2103T-F12-1/tp[master]","errorMessage":"Failed to clone from https://github.com/AY2324S2-CS2103T-F12-1/tp.git"}],"sinceDate":"2024-02-23","untilDate":"2024-03-06","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"}}}