-
Notifications
You must be signed in to change notification settings - Fork 232
[CS2113T-T09-1] ConTech #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 250 commits
18fcaa5
56f11c0
8bd5717
a98fae8
e8aa334
ee3bc07
0f28962
63f2f5d
56652e6
17a07c2
2289404
d7240b0
26c4392
f07e452
d466817
ef6fb13
094dfca
58eb2f9
01445d5
6479e3b
e173806
dde4267
3826eff
f7e62d6
9115d98
f83b9ef
dba382d
30957af
0ba3982
f1b0c07
b3a7a35
a5bd01e
17172c8
9bd4fe0
78ce064
3116895
b580226
aa753fb
46aac4d
c6fc10e
3f73558
382caac
a971169
7920ffe
28c88f0
3e511e4
dd92516
71dd867
7863337
eb8775c
79cb9e5
0af56b4
7af4d1e
e54fbfb
735426e
b232862
a2c65a0
cadd4df
8dfdfc1
dfa2182
152dd29
6557b8a
2774f8e
4478e7a
91f5de9
01f2a32
24254d9
44b416f
efbf827
81813e8
d819792
89bb68c
bb0e15b
c6195c7
28e0cf0
7416f26
2a6ae7c
bf9db8f
7169e9a
159f614
31d71c1
e4f5523
0749b4e
617852b
b4d8c93
9c09929
381d6c9
431370c
28ada49
d726e5f
a44110c
de98b73
cc3a245
a96558b
c55beb6
9f3a8bb
c13b252
ad83d6a
5e0cb00
db1ff0a
c44147b
06b4312
a798aed
1d9cfd2
d2d6af2
301ae1b
504c6d8
fe61793
8b36498
b3fae31
4bb17d2
4581dd3
5f16b8a
b391877
ad40beb
4478393
cb43817
11a5d48
7bab42a
e2573bc
1e864a7
0b9e5c0
dc7d4c9
b70197a
7ca0061
f134696
708df4b
a2348a9
352f882
1c0e454
4f20c1a
1aa3539
1970f07
f356bba
b52e2ba
65c5371
b85f0ac
3f5d55e
a8bf949
37c6caa
16ca0e2
1a6b635
11596bc
c1940d8
5efc2f6
bbffa33
92c1cf1
cd1ae03
cd115fe
530717e
a13c86f
78a4988
7a0ef26
937a862
f5e3868
1211a54
e814308
f6c4273
115ddcf
d7b2008
f04130c
35fdc96
e4f7b40
c87b34d
1846fdf
1bd9f7a
610d55c
bc05c30
8c5571a
7741a48
f9da9ff
be3a0af
68230e8
876520f
653a898
2049ccb
f3d6011
52c4be3
52d0ed5
ee307ee
be732d8
693008f
6ef1cef
1b2bd93
4678ad1
5563cf3
fe565b5
54f69e2
dff0dc2
fdd50c8
6edbe7f
c6399b9
6b6cc30
3edd3dc
4a4d20e
e38e1db
7601757
b5d8ef1
c31c7e1
7c6d354
ae30c85
06e8c3f
66e2073
1868de2
3700b2c
2e7b2fc
a1cfecd
ad3088e
ccc7a62
5613cd7
210ad1e
d728bbf
f31ab04
9fa2585
5cd8cda
215580c
f89d665
dc29324
9622535
a022c8c
4ee56ce
4d4bea2
5ef88e7
183dc22
6ab0938
118fdd9
c88b9d4
1483c6e
e354ffe
1fb2935
d2a2846
63a1a1c
762e5f4
692ffbf
08dac1c
0044343
22feab5
fe6f2d5
145dfc3
eb1dffa
18c34e4
e85f9df
dc4b41f
b106517
a23a14d
f94f319
b83daac
09f3fd9
8b45a00
18192ba
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <classpath> | ||
| <classpathentry kind="src" output="bin/main" path="src/main/java"> | ||
| <attributes> | ||
| <attribute name="gradle_scope" value="main"/> | ||
| <attribute name="gradle_used_by_scope" value="main,test"/> | ||
| </attributes> | ||
| </classpathentry> | ||
| <classpathentry kind="src" output="bin/test" path="src/test/java"> | ||
| <attributes> | ||
| <attribute name="gradle_scope" value="test"/> | ||
| <attribute name="gradle_used_by_scope" value="test"/> | ||
| <attribute name="test" value="true"/> | ||
| </attributes> | ||
| </classpathentry> | ||
| <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11/"/> | ||
| <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/> | ||
| <classpathentry kind="output" path="bin/default"/> | ||
| </classpath> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <projectDescription> | ||
| <name>tp</name> | ||
| <comment>Project tp created by Buildship.</comment> | ||
| <projects> | ||
| </projects> | ||
| <buildSpec> | ||
| <buildCommand> | ||
| <name>org.eclipse.jdt.core.javabuilder</name> | ||
| <arguments> | ||
| </arguments> | ||
| </buildCommand> | ||
| <buildCommand> | ||
| <name>org.eclipse.buildship.core.gradleprojectbuilder</name> | ||
| <arguments> | ||
| </arguments> | ||
| </buildCommand> | ||
| </buildSpec> | ||
| <natures> | ||
| <nature>org.eclipse.jdt.core.javanature</nature> | ||
| <nature>org.eclipse.buildship.core.gradleprojectnature</nature> | ||
| </natures> | ||
| <filteredResources> | ||
| <filter> | ||
| <id>1633538525160</id> | ||
| <name></name> | ||
| <type>30</type> | ||
| <matcher> | ||
| <id>org.eclipse.core.resources.regexFilterMatcher</id> | ||
| <arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments> | ||
| </matcher> | ||
| </filter> | ||
| </filteredResources> | ||
| </projectDescription> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| arguments= | ||
| auto.sync=false | ||
| build.scans.enabled=false | ||
| connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) | ||
| connection.project.dir= | ||
| eclipse.preferences.version=1 | ||
| gradle.user.home= | ||
| java.home=C\:/src/jdk11 | ||
| jvm.arguments= | ||
| offline.mode=false | ||
| override.workspace.settings=true | ||
| show.console.view=true | ||
| show.executions.view=true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| Manifest-Version: 1.0 | ||
| Main-Class: seedu.duke.Duke | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| ashraf,ashrafjfr,null,null,null,null | ||
| lezai,lezongmun,null,null,null,null | ||
| andre,null | ||
| marcus,null,null,null,null,null | ||
| badgithub,@@github,null,null,null,null | ||
| Le Zong,lezongmun,null,lezongg,null,lezongmun@gmail.com |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,38 +1,229 @@ | ||
| # Developer Guide | ||
|
|
||
| ## Acknowledgements | ||
| ### Table of Content | ||
| - [Acknowledgements](#acknowledgements) | ||
| - [Design](#design) | ||
| - [System Architecture](#sys-arch) | ||
| - [TextUi](#text-ui) | ||
| - [MainParser](#main-parser) | ||
| - [Command](#command) | ||
| - [ContactList](#contact-list) | ||
| - [Storage](#storage) | ||
| - [Implementation](#implementation) | ||
| - [Supported contact details](#supported-details) | ||
| - [Adding a contact](#Add) | ||
| - [Viewing a contact](#View) | ||
| - [Editing a contact](#Edit) | ||
| - [Deleting a contact](#Delete) | ||
| - [Searching a contact](#Search) | ||
| - [Listing all contacts](#List) | ||
| - [Product Scope](#scope) | ||
| - [Target user profile](#target) | ||
| - [Value proposition](#value) | ||
| - [User Stories](#stories) | ||
| - [Non-Function Requirements](#nf-req) | ||
| - [Glossary](#glossary) | ||
| - [Instructions for manual testing](#manual-test) | ||
|
|
||
| ## <a name="acknowledgements"></a>Acknowledgements | ||
|
|
||
| - Inspiration for App Idea and OOP Structure: AddressBook (Level 2) <br /> | ||
| https://github.com/se-edu/addressbook-level2 | ||
| - Inspiration for User Guide and Developer Guide: AddressBook (Level 3) <br /> | ||
| https://se-education.org/addressbook-level3/DeveloperGuide.html <br/> | ||
| https://se-education.org/addressbook-level3/UserGuide.html | ||
| - Converting text for ConTech: <br /> | ||
| https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20 | ||
| - GitHub Markdown Emoji Syntax for User Guide: <br /> | ||
| https://github.com/ikatyang/emoji-cheat-sheet/blob/master/README.md | ||
| - PlantUML Tutorial: <br /> | ||
| https://se-education.org/guides/tutorials/plantUml.html | ||
|
|
||
| {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} | ||
|
|
||
| ## Design & implementation | ||
| ## <a name="design"></a>Design | ||
|
|
||
| {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} | ||
| ### <a name="sys-arch"></a>System Architecture | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
marcusbory marked this conversation as resolved.
marcusbory marked this conversation as resolved.
|
||
|
|
||
| ## Product scope | ||
| ### Target user profile | ||
| The above **System Architecture** diagram shows the high-level design of ConTech. | ||
|
|
||
| {Describe the target user profile} | ||
| On launch, the `Main` class initialises the app components in the correct sequence and links them up | ||
| with each other, in the correct sequence. | ||
|
|
||
| ### Value proposition | ||
| ConTech comprises five main components, namely: | ||
| - `TextUi`: Command Line User Interface of ConTech. | ||
| - `MainParser`: Parser to parser user inputs from `TextUi` for `Command`. | ||
| - `Command`: Command to be executed upon input parsing. | ||
| - `ContactList`: Data structure to store `Contact`s while running ConTech. | ||
| - `Storage`: Reads from and writes to [`LocalStorage`](#local-storage). | ||
|
|
||
| {Describe the value proposition: what problem does it solve?} | ||
| **How the architecture components interact with each other** | ||
|
|
||
| ## User Stories | ||
| The five main components interact with each other, as shown in the sequence diagram below | ||
| for the example: `view 2` | ||
|
|
||
| |Version| As a ... | I want to ... | So that I can ...| | ||
| |--------|----------|---------------|------------------| | ||
| |v1.0|new user|see usage instructions|refer to them when I forget how to use the application| | ||
| |v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| | ||
|  | ||
|
marcusbory marked this conversation as resolved.
Outdated
|
||
|
|
||
|
|
||
| ### <a name="text-ui"></a>TextUi | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Text-ui does not seem to be complete, along with Command and ContactList, maybe can try finish up the details soon |
||
| ### <a name="main-parser"></a>MainParser | ||
| The `MainParser` component is responsible for making sense of the user's inputs. It functions as the | ||
| not only the identifier for commands, but also calls its relevant sub-parsers to further destructure | ||
| the inputs, allowing ConTech to perform its commands. | ||
|
|
||
| The diagram below shows a sequence diagram of how `MainParser` works, and a reference diagram is used | ||
| to indicate that further parsing is done by sub-parsers for each different command type. This reference diagram | ||
| will be referred to later on. | ||
|
|
||
|  | ||
|
|
||
| ### <a name="command"></a>Command | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sections under “Design” seems not finished. Include “Command”, “ContactList”, and “TextUi”. Please fill them in soon. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the Command section can consider add in the Class diagram to relate all the commands together |
||
| ### <a name="contact-list"></a>ContactList | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
| ### <a name="storage"></a>Storage | ||
| **API** :`Storage.java` | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
|
||
|
|
||
| The `Storage` component is responsible for saving both contacts data and personal contact data locally inside the file | ||
| paths, `data/contacts.txt` and `data/me.txt`. `Storage` is also responsible for loading these data back into their | ||
| corresponding `ContactList` and `Contact` objects. It is thus dependent on the classes, `ContactList` and | ||
| `Contact`. | ||
|
marcusbory marked this conversation as resolved.
Outdated
|
||
|
|
||
|
|
||
| ## <a name="implementation"></a>Implementation | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i think for each functionality, adding some sample inputs & outputs is much clear? |
||
|
|
||
| ### <a name="supported-details"></a>Supported Contact Details | ||
| The currently supported contact details are provided in the table below: | ||
|
|
||
| |Flag|Detail of contact| | ||
| |----|------| | ||
| |`-n`|Name| | ||
| |`-g`|Github username| | ||
| |`-l`|LinkedIn handle| | ||
| |`-te`|Telegram handle| | ||
| |`-tw`|Twitter handle| | ||
| |`-e`|Email| | ||
|
|
||
| ### <a name="Add"></a>Adding a contact: `add` | ||
| This feature is processed using `AddContactCommand`. This feature allows a user to add a contact to their contact list. | ||
|
marcusbory marked this conversation as resolved.
|
||
| The user is able to add a contact by entering a command in the form of `add [DETAILS WITH FLAGS]`, where | ||
| the details with flags are specified in the form `-<flag> <detail>`. | ||
|
|
||
| The user's input is parsed in `MainParser` and `AddContactParser`, the latter which inherits `ContactParser`. | ||
| `ContactParser` inherits `RegexParser` (for regex checks regarding each detail) and implements the `ContactDetails` | ||
| interface (which uniquely allows the parsers to easily identify each detail based on their indexes). | ||
|
marcusbory marked this conversation as resolved.
Outdated
marcusbory marked this conversation as resolved.
Outdated
|
||
|
|
||
| As the contacts are identified by their names, the name field is made compulsory at the `MainParser` level. | ||
| The diagram below shows the process of parsing the user's input. | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
|
||
|
|
||
| Upon parsing the user's input, the details are passed to an `AddContactCommand`, and this command will be | ||
| executed in `Duke`. The sequence diagram below illustrates the process of executing `AddContactCommand`. | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
marcusbory marked this conversation as resolved.
|
||
|
|
||
| ### <a name="View"></a>Viewing a contact: `view` | ||
| This feature is processed using `ViewContactCommand`. Whenever a user wants to view a specific contact from the | ||
| contact list, user can input `view [INDEX]` with the index of the desired contact displayed from the `list` feature. | ||
| `ViewContactCommand` is then created in the `MainParser` and executed in `Duke`. | ||
| The sequence diagram below illustrates the `execute()` function in `ViewContactCommand`. | ||
|
|
||
|  | ||
|
|
||
| ## Non-Functional Requirements | ||
| ### <a name="Edit"></a>Editing a contact: `edit` | ||
| This feature is processed using `EditContactParser` under `MainParser`. In order to edit a contact in the contact list, | ||
| a user must enter a command in the form `edit [CONTACT INDEX] [DETAILS WITH FLAGS]`, where the details with flags are | ||
| specified in the form `-<flag> <detail>` with up to 6 details i.e. `-g github-username -tw twitter_handle`. The user | ||
|
marcusbory marked this conversation as resolved.
Outdated
|
||
| input will be parsed by `EditContactParser` methods `getIndexToStore` and `parseContactDetails` to obtain a String | ||
| array with the details to be edited. An `EditContactCommand` with the specified parameters will then be created and | ||
| executed in `Duke`. The sequence diagram below shows how the whole process is carried out. | ||
|
|
||
|  | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ya, I agree with Mick. The diagram seems to be too big which causes the words inside the diagram a bit hard to see. You can try changing the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. One way to solve this is by putting reference frame :D |
||
|
|
||
|
|
||
| ### <a name="Delete"></a>Deleting contacts: `rm` | ||
| This feature is processed using the `DeleteContactCommand`. `DeleteContactCommand` is created | ||
| in the `MainParser`and executed in`Duke`. Users can either delete a specified contact | ||
| or delete all contacts at once. | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
|
||
|
|
||
| To delete all contacts, a user must enter the command `rm all`. The sequence diagram below | ||
| shows how the removal of all contacts works. Before any deletion, the user will be | ||
| prompted with a message to confirm deletion. If the user confirms deletion for all contacts, | ||
| deletion will be executed, along with a message to show that deletion has been executed. | ||
| If user cancels deletion, a message is printed to show that the deletion has been cancelled. | ||
|
|
||
|  | ||
|
|
||
| To delete a selected contact, a user must enter a command in the form `rm [INDEX]`. The sequence diagram below | ||
| shows how the removal of a contact works. Before any deletion, details of the contact with the specified`INDEX` | ||
| will be displayed to the user, along with a prompt to confirm deletion. If the user confirms deletion, | ||
| deletion of the selected contact will be executed, along with a message to show that deletion has been executed. | ||
| If user cancels deletion, a message is printed to show that the deletion has been cancelled. | ||
|
|
||
|  | ||
|
|
||
|
|
||
| ### <a name="Search"></a>Searching a contact: `search` | ||
| This feature is processed using `SearchContactParser` under `MainParser`. In order to edit a contact in the contact list, | ||
| a user must enter a command in the form `search [FLAG] [SEARCH QUERY]`. If no flag is specified, the search will be done | ||
| on contact names buy default. From the user input, the search query and the search flag are obtained from the | ||
| `parseSearchQuery` and the `getDetailFlag` methods respectively. A `SearchContactCommand` with the specified parameters | ||
| will be created and executed in `Duke`. The sequence diagram below shows how the whole process is carried out. | ||
|
|
||
|  | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The SearchContactCommand constructor have also not been called here There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
|
|
||
|
|
||
| ### <a name="List"></a>Listing all contacts: `ls` | ||
| This feature is processed using `MainParser`. The control is sent to `ListContactsCommand` under `Command` to execute the | ||
| command which uses a loop to get the Contact object at every available index and print it using the `printContactWithIndex` | ||
| function in `TextUi` class. | ||
|
|
||
|  | ||
|
marcusbory marked this conversation as resolved.
|
||
|
|
||
|
|
||
| ## <a name="scope"></a>Product scope | ||
| ### <a name="target"></a>Target user profile | ||
| - Has a need to store a significant amount of computing-related contacts | ||
| - Prefers and is familiar with Command Line Interface (CLI) applications | ||
| - Has many contacts that use common computing platforms, such as: Github, Linkedin, Twitter, Telegram, and Email | ||
| - Can type fast and prefers typing to mouse interactions | ||
|
|
||
| ### <a name="value"></a>Value proposition | ||
|
|
||
| As computing professionals are often on their computer, ConTech allows them to have a platform to | ||
| manage their computing-related contacts locally and efficiently, without the need to use | ||
| additional devices or platforms. | ||
|
|
||
| ## <a name="stories"></a>User Stories | ||
|
|
||
| |Version| As a ... | I want to ... | So that I can ...| | ||
| |--------|----------|---------------|------------------| | ||
| |v1.0|programmer|add my colleague's account usernames|easily access it| | ||
| |v1.0|programmer|edit my colleague's account usernames|update it if there is a change| | ||
| |v1.0|programmer|save contact data locally on my hard drive|access it without internet| | ||
| |v1.0|programmer|view various contact details of my colleague|contact him easily on different platforms| | ||
| |v1.0|programmer|see the names and index of saved contacts|know the contacts I have saved| | ||
| |v1.0|programmer|delete a specific contact|| | ||
| |v1.0|programmer|be able to copy and paste the displayed contact's URLs|visit the contact's accounts| | ||
| |v2.0|programmer|save my personal details|the application is aware of the user| | ||
| |v2.0|forgetful user|be able to search for my contacts by name|find their contact details| | ||
| |v2.0|programmer|import a list of contacts quickly from an input txt file|save time typing each contact | ||
|
|
||
| ## <a name="nf-req"></a>Non-Functional Requirements | ||
|
|
||
| - Should work on any [*mainstream Operating Systems*](#os) as long as Java `11` or higher has been installed on it | ||
| {Give non-functional requirements} | ||
|
marcusbory marked this conversation as resolved.
Outdated
|
||
|
|
||
| ## Glossary | ||
| ## <a name="glossary"></a>Glossary | ||
|
|
||
| * *glossary item* - Definition | ||
| * <a name="os"></a>**Mainstream Operating Systems** - Windows, macOS, *NIX | ||
| * <a name="local-storage"></a>**LocalStorage** - Refers to user's hard disk storage | ||
|
|
||
| ## Instructions for manual testing | ||
| ## <a name="manual-test"></a>Instructions for manual testing | ||
|
|
||
| {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe you could provide some instructions here for the manual testing? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe can include some manual testing instructions? |
||



Uh oh!
There was an error while loading. Please reload this page.