From 911c2751ea8ed5f24b7dd722e74180bd180bf4f4 Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Tue, 18 Feb 2020 21:46:16 +0800
Subject: [PATCH 001/324] test travis
---
src/main/java/seedu/address/Main.java | 1 +
src/main/main.iml | 11 +++++++++++
src/test/test.iml | 12 ++++++++++++
3 files changed, 24 insertions(+)
create mode 100644 src/main/main.iml
create mode 100644 src/test/test.iml
diff --git a/src/main/java/seedu/address/Main.java b/src/main/java/seedu/address/Main.java
index 052a5068631..08f7453dcad 100644
--- a/src/main/java/seedu/address/Main.java
+++ b/src/main/java/seedu/address/Main.java
@@ -22,4 +22,5 @@ public class Main {
public static void main(String[] args) {
Application.launch(MainApp.class, args);
}
+ //testing travis, delete later
}
diff --git a/src/main/main.iml b/src/main/main.iml
new file mode 100644
index 00000000000..908ad4f521a
--- /dev/null
+++ b/src/main/main.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/test.iml b/src/test/test.iml
new file mode 100644
index 00000000000..5ebc6f48ecb
--- /dev/null
+++ b/src/test/test.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 748b9ae1aac1c0c4a75db58ddd07e0c9cc5b894a Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Tue, 18 Feb 2020 22:11:06 +0800
Subject: [PATCH 002/324] test travis
---
.gitignore | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.gitignore b/.gitignore
index 5e59b862ba4..69edc14044e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ src/test/data/sandbox/
# MacOS custom attributes files created by Finder
.DS_Store
+*.iml
+bin/
From fa1b623de903ed3e0c6c1b300f9342baf8605d16 Mon Sep 17 00:00:00 2001
From: Kangwkk <49367086+Kangwkk@users.noreply.github.com>
Date: Tue, 18 Feb 2020 22:18:05 +0800
Subject: [PATCH 003/324] Delete main.iml
---
src/main/main.iml | 11 -----------
1 file changed, 11 deletions(-)
delete mode 100644 src/main/main.iml
diff --git a/src/main/main.iml b/src/main/main.iml
deleted file mode 100644
index 908ad4f521a..00000000000
--- a/src/main/main.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From db4717c32f105a4c224f003ccc4149eecbe11318 Mon Sep 17 00:00:00 2001
From: Kangwkk <49367086+Kangwkk@users.noreply.github.com>
Date: Tue, 18 Feb 2020 22:18:18 +0800
Subject: [PATCH 004/324] Delete test.iml
---
src/test/test.iml | 12 ------------
1 file changed, 12 deletions(-)
delete mode 100644 src/test/test.iml
diff --git a/src/test/test.iml b/src/test/test.iml
deleted file mode 100644
index 5ebc6f48ecb..00000000000
--- a/src/test/test.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From f53a8ee598b815890478635dd8a54d0695046345 Mon Sep 17 00:00:00 2001
From: zhouxinwei97 <45256284+zhouxinwei97@users.noreply.github.com>
Date: Fri, 28 Feb 2020 16:11:15 +0800
Subject: [PATCH 005/324] tutorial-removing-field
---
.../address/logic/commands/EditCommand.java | 17 +-----
.../logic/parser/AddCommandParser.java | 4 +-
.../logic/parser/EditCommandParser.java | 3 -
.../address/logic/parser/ParserUtil.java | 16 +-----
.../seedu/address/model/person/Address.java | 57 -------------------
.../seedu/address/model/person/Person.java | 15 +----
.../address/model/util/SampleDataUtil.java | 7 ---
.../address/storage/JsonAdaptedPerson.java | 15 +----
.../java/seedu/address/ui/PersonCard.java | 1 -
.../logic/parser/AddCommandParserTest.java | 4 --
.../logic/parser/EditCommandParserTest.java | 12 ++--
.../address/logic/parser/ParserUtilTest.java | 24 --------
.../address/model/person/AddressTest.java | 36 ------------
.../storage/JsonAdaptedPersonTest.java | 31 +++-------
.../testutil/EditPersonDescriptorBuilder.java | 9 ---
.../seedu/address/testutil/PersonBuilder.java | 15 +----
16 files changed, 21 insertions(+), 245 deletions(-)
delete mode 100644 src/main/java/seedu/address/model/person/Address.java
delete mode 100644 src/test/java/seedu/address/model/person/AddressTest.java
diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java
index 7e36114902f..45eb6cc758a 100644
--- a/src/main/java/seedu/address/logic/commands/EditCommand.java
+++ b/src/main/java/seedu/address/logic/commands/EditCommand.java
@@ -19,7 +19,6 @@
import seedu.address.commons.util.CollectionUtil;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -96,10 +95,9 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName());
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());
- Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
- return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);
+ return new Person(updatedName, updatedPhone, updatedEmail, updatedTags);
}
@Override
@@ -128,7 +126,6 @@ public static class EditPersonDescriptor {
private Name name;
private Phone phone;
private Email email;
- private Address address;
private Set tags;
public EditPersonDescriptor() {}
@@ -141,7 +138,6 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setName(toCopy.name);
setPhone(toCopy.phone);
setEmail(toCopy.email);
- setAddress(toCopy.address);
setTags(toCopy.tags);
}
@@ -149,7 +145,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
* Returns true if at least one field is edited.
*/
public boolean isAnyFieldEdited() {
- return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);
+ return CollectionUtil.isAnyNonNull(name, phone, email, tags);
}
public void setName(Name name) {
@@ -176,14 +172,6 @@ public Optional getEmail() {
return Optional.ofNullable(email);
}
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Optional getAddress() {
- return Optional.ofNullable(address);
- }
-
/**
* Sets {@code tags} to this object's {@code tags}.
* A defensive copy of {@code tags} is used internally.
@@ -219,7 +207,6 @@ public boolean equals(Object other) {
return getName().equals(e.getName())
&& getPhone().equals(e.getPhone())
&& getEmail().equals(e.getEmail())
- && getAddress().equals(e.getAddress())
&& getTags().equals(e.getTags());
}
}
diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
index 3b8bfa035e8..8dd6e2889c9 100644
--- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
@@ -12,7 +12,6 @@
import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -41,10 +40,9 @@ public AddCommand parse(String args) throws ParseException {
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
- Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
- Person person = new Person(name, phone, email, address, tagList);
+ Person person = new Person(name, phone, email, tagList);
return new AddCommand(person);
}
diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java
index 845644b7dea..dea2943ee2a 100644
--- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java
@@ -52,9 +52,6 @@ public EditCommand parse(String args) throws ParseException {
if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {
editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));
}
- if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {
- editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));
- }
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
if (!editPersonDescriptor.isAnyFieldEdited()) {
diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java
index b117acb9c55..bae45b31f36 100644
--- a/src/main/java/seedu/address/logic/parser/ParserUtil.java
+++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java
@@ -9,7 +9,6 @@
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.StringUtil;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -65,20 +64,7 @@ public static Phone parsePhone(String phone) throws ParseException {
return new Phone(trimmedPhone);
}
- /**
- * Parses a {@code String address} into an {@code Address}.
- * Leading and trailing whitespaces will be trimmed.
- *
- * @throws ParseException if the given {@code address} is invalid.
- */
- public static Address parseAddress(String address) throws ParseException {
- requireNonNull(address);
- String trimmedAddress = address.trim();
- if (!Address.isValidAddress(trimmedAddress)) {
- throw new ParseException(Address.MESSAGE_CONSTRAINTS);
- }
- return new Address(trimmedAddress);
- }
+
/**
* Parses a {@code String email} into an {@code Email}.
diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java
deleted file mode 100644
index 60472ca22a0..00000000000
--- a/src/main/java/seedu/address/model/person/Address.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package seedu.address.model.person;
-
-import static java.util.Objects.requireNonNull;
-import static seedu.address.commons.util.AppUtil.checkArgument;
-
-/**
- * Represents a Person's address in the address book.
- * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}
- */
-public class Address {
-
- public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank";
-
- /*
- * The first character of the address must not be a whitespace,
- * otherwise " " (a blank string) becomes a valid input.
- */
- public static final String VALIDATION_REGEX = "[^\\s].*";
-
- public final String value;
-
- /**
- * Constructs an {@code Address}.
- *
- * @param address A valid address.
- */
- public Address(String address) {
- requireNonNull(address);
- checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);
- value = address;
- }
-
- /**
- * Returns true if a given string is a valid email.
- */
- public static boolean isValidAddress(String test) {
- return test.matches(VALIDATION_REGEX);
- }
-
- @Override
- public String toString() {
- return value;
- }
-
- @Override
- public boolean equals(Object other) {
- return other == this // short circuit if same object
- || (other instanceof Address // instanceof handles nulls
- && value.equals(((Address) other).value)); // state check
- }
-
- @Override
- public int hashCode() {
- return value.hashCode();
- }
-
-}
diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java
index 557a7a60cd5..f43cae3f1a1 100644
--- a/src/main/java/seedu/address/model/person/Person.java
+++ b/src/main/java/seedu/address/model/person/Person.java
@@ -21,18 +21,16 @@ public class Person {
private final Email email;
// Data fields
- private final Address address;
private final Set tags = new HashSet<>();
/**
* Every field must be present and not null.
*/
- public Person(Name name, Phone phone, Email email, Address address, Set tags) {
- requireAllNonNull(name, phone, email, address, tags);
+ public Person(Name name, Phone phone, Email email, Set tags) {
+ requireAllNonNull(name, phone, email, tags);
this.name = name;
this.phone = phone;
this.email = email;
- this.address = address;
this.tags.addAll(tags);
}
@@ -48,10 +46,6 @@ public Email getEmail() {
return email;
}
- public Address getAddress() {
- return address;
- }
-
/**
* Returns an immutable tag set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
@@ -92,14 +86,13 @@ public boolean equals(Object other) {
return otherPerson.getName().equals(getName())
&& otherPerson.getPhone().equals(getPhone())
&& otherPerson.getEmail().equals(getEmail())
- && otherPerson.getAddress().equals(getAddress())
&& otherPerson.getTags().equals(getTags());
}
@Override
public int hashCode() {
// use this method for custom fields hashing instead of implementing your own
- return Objects.hash(name, phone, email, address, tags);
+ return Objects.hash(name, phone, email, tags);
}
@Override
@@ -110,8 +103,6 @@ public String toString() {
.append(getPhone())
.append(" Email: ")
.append(getEmail())
- .append(" Address: ")
- .append(getAddress())
.append(" Tags: ");
getTags().forEach(builder::append);
return builder.toString();
diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java
index 1806da4facf..c8ca69d0cbc 100644
--- a/src/main/java/seedu/address/model/util/SampleDataUtil.java
+++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java
@@ -6,7 +6,6 @@
import seedu.address.model.AddressBook;
import seedu.address.model.ReadOnlyAddressBook;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -20,22 +19,16 @@ public class SampleDataUtil {
public static Person[] getSamplePersons() {
return new Person[] {
new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
- new Address("Blk 30 Geylang Street 29, #06-40"),
getTagSet("friends")),
new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"),
- new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
getTagSet("colleagues", "friends")),
new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"),
- new Address("Blk 11 Ang Mo Kio Street 74, #11-04"),
getTagSet("neighbours")),
new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"),
- new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
getTagSet("family")),
new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"),
- new Address("Blk 47 Tampines Street 20, #17-35"),
getTagSet("classmates")),
new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"),
- new Address("Blk 45 Aljunied Street 85, #11-31"),
getTagSet("colleagues"))
};
}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
index a6321cec2ea..da07e68bdd1 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
@@ -10,7 +10,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import seedu.address.commons.exceptions.IllegalValueException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -27,7 +26,6 @@ class JsonAdaptedPerson {
private final String name;
private final String phone;
private final String email;
- private final String address;
private final List tagged = new ArrayList<>();
/**
@@ -35,12 +33,11 @@ class JsonAdaptedPerson {
*/
@JsonCreator
public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
- @JsonProperty("email") String email, @JsonProperty("address") String address,
+ @JsonProperty("email") String email,
@JsonProperty("tagged") List tagged) {
this.name = name;
this.phone = phone;
this.email = email;
- this.address = address;
if (tagged != null) {
this.tagged.addAll(tagged);
}
@@ -53,7 +50,6 @@ public JsonAdaptedPerson(Person source) {
name = source.getName().fullName;
phone = source.getPhone().value;
email = source.getEmail().value;
- address = source.getAddress().value;
tagged.addAll(source.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList()));
@@ -94,16 +90,9 @@ public Person toModelType() throws IllegalValueException {
}
final Email modelEmail = new Email(email);
- if (address == null) {
- throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));
- }
- if (!Address.isValidAddress(address)) {
- throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);
- }
- final Address modelAddress = new Address(address);
final Set modelTags = new HashSet<>(personTags);
- return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);
+ return new Person(modelName, modelPhone, modelEmail, modelTags);
}
}
diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java
index 0684b088868..85142fe6048 100644
--- a/src/main/java/seedu/address/ui/PersonCard.java
+++ b/src/main/java/seedu/address/ui/PersonCard.java
@@ -47,7 +47,6 @@ public PersonCard(Person person, int displayedIndex) {
id.setText(displayedIndex + ". ");
name.setText(person.getName().fullName);
phone.setText(person.getPhone().value);
- address.setText(person.getAddress().value);
email.setText(person.getEmail().value);
person.getTags().stream()
.sorted(Comparator.comparing(tag -> tag.tagName))
diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
index 5cf487d7ebb..3656f7dbba4 100644
--- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
@@ -32,7 +32,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.logic.commands.AddCommand;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -121,9 +120,6 @@ public void parse_invalidValue_failure() {
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);
- // invalid address
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);
// invalid tag
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
index 2ff31522486..67d833e845d 100644
--- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
@@ -5,7 +5,6 @@
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;
-import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;
@@ -36,7 +35,6 @@
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -84,7 +82,6 @@ public void parse_invalidValue_failure() {
assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name
assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone
assertParseFailure(parser, "1" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email
- assertParseFailure(parser, "1" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address
assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag
// invalid phone followed by valid email
@@ -112,7 +109,7 @@ public void parse_allFieldsSpecified_success() {
+ EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)
- .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)
+ .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY)
.withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
@@ -154,7 +151,7 @@ public void parse_oneFieldSpecified_success() {
// address
userInput = targetIndex.getOneBased() + ADDRESS_DESC_AMY;
- descriptor = new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();
+ descriptor = new EditPersonDescriptorBuilder().build();
expectedCommand = new EditCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
@@ -173,7 +170,7 @@ public void parse_multipleRepeatedFields_acceptsLast() {
+ PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)
- .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
+ .withEmail(VALID_EMAIL_BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
.build();
EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
@@ -192,8 +189,7 @@ public void parse_invalidValueFollowedByValidValue_success() {
// other valid values specified
userInput = targetIndex.getOneBased() + EMAIL_DESC_BOB + INVALID_PHONE_DESC + ADDRESS_DESC_BOB
+ PHONE_DESC_BOB;
- descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)
- .withAddress(VALID_ADDRESS_BOB).build();
+ descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).build();
expectedCommand = new EditCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
index 4256788b1a7..2f0027be91f 100644
--- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
+++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
@@ -14,7 +14,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -102,29 +101,6 @@ public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exc
assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));
}
- @Test
- public void parseAddress_null_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((String) null));
- }
-
- @Test
- public void parseAddress_invalidValue_throwsParseException() {
- assertThrows(ParseException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS));
- }
-
- @Test
- public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {
- Address expectedAddress = new Address(VALID_ADDRESS);
- assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));
- }
-
- @Test
- public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {
- String addressWithWhitespace = WHITESPACE + VALID_ADDRESS + WHITESPACE;
- Address expectedAddress = new Address(VALID_ADDRESS);
- assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));
- }
-
@Test
public void parseEmail_null_throwsNullPointerException() {
assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((String) null));
diff --git a/src/test/java/seedu/address/model/person/AddressTest.java b/src/test/java/seedu/address/model/person/AddressTest.java
deleted file mode 100644
index dcd3be87b3a..00000000000
--- a/src/test/java/seedu/address/model/person/AddressTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package seedu.address.model.person;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static seedu.address.testutil.Assert.assertThrows;
-
-import org.junit.jupiter.api.Test;
-
-public class AddressTest {
-
- @Test
- public void constructor_null_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> new Address(null));
- }
-
- @Test
- public void constructor_invalidAddress_throwsIllegalArgumentException() {
- String invalidAddress = "";
- assertThrows(IllegalArgumentException.class, () -> new Address(invalidAddress));
- }
-
- @Test
- public void isValidAddress() {
- // null address
- assertThrows(NullPointerException.class, () -> Address.isValidAddress(null));
-
- // invalid addresses
- assertFalse(Address.isValidAddress("")); // empty string
- assertFalse(Address.isValidAddress(" ")); // spaces only
-
- // valid addresses
- assertTrue(Address.isValidAddress("Blk 456, Den Road, #01-355"));
- assertTrue(Address.isValidAddress("-")); // one character
- assertTrue(Address.isValidAddress("Leng Inc; 1234 Market St; San Francisco CA 2349879; USA")); // long address
- }
-}
diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
index 83b11331cdb..50715d7650d 100644
--- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
+++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
@@ -12,7 +12,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.commons.exceptions.IllegalValueException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -27,7 +26,6 @@ public class JsonAdaptedPersonTest {
private static final String VALID_NAME = BENSON.getName().toString();
private static final String VALID_PHONE = BENSON.getPhone().toString();
private static final String VALID_EMAIL = BENSON.getEmail().toString();
- private static final String VALID_ADDRESS = BENSON.getAddress().toString();
private static final List VALID_TAGS = BENSON.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList());
@@ -41,14 +39,14 @@ public void toModelType_validPersonDetails_returnsPerson() throws Exception {
@Test
public void toModelType_invalidName_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = Name.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullName_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -56,14 +54,14 @@ public void toModelType_nullName_throwsIllegalValueException() {
@Test
public void toModelType_invalidPhone_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = Phone.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullPhone_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -71,39 +69,24 @@ public void toModelType_nullPhone_throwsIllegalValueException() {
@Test
public void toModelType_invalidEmail_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_TAGS);
String expectedMessage = Email.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullEmail_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
- @Test
- public void toModelType_invalidAddress_throwsIllegalValueException() {
- JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);
- String expectedMessage = Address.MESSAGE_CONSTRAINTS;
- assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
- }
-
- @Test
- public void toModelType_nullAddress_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);
- String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());
- assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
- }
-
@Test
public void toModelType_invalidTags_throwsIllegalValueException() {
List invalidTags = new ArrayList<>(VALID_TAGS);
invalidTags.add(new JsonAdaptedTag(INVALID_TAG));
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);
+ new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, invalidTags);
assertThrows(IllegalValueException.class, person::toModelType);
}
diff --git a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
index 4584bd5044e..3c4eddd02d3 100644
--- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
+++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
@@ -5,7 +5,6 @@
import java.util.stream.Stream;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -35,7 +34,6 @@ public EditPersonDescriptorBuilder(Person person) {
descriptor.setName(person.getName());
descriptor.setPhone(person.getPhone());
descriptor.setEmail(person.getEmail());
- descriptor.setAddress(person.getAddress());
descriptor.setTags(person.getTags());
}
@@ -63,13 +61,6 @@ public EditPersonDescriptorBuilder withEmail(String email) {
return this;
}
- /**
- * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.
- */
- public EditPersonDescriptorBuilder withAddress(String address) {
- descriptor.setAddress(new Address(address));
- return this;
- }
/**
* Parses the {@code tags} into a {@code Set} and set it to the {@code EditPersonDescriptor}
diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java
index 5eff412178b..3fa8be41566 100644
--- a/src/test/java/seedu/address/testutil/PersonBuilder.java
+++ b/src/test/java/seedu/address/testutil/PersonBuilder.java
@@ -3,7 +3,6 @@
import java.util.HashSet;
import java.util.Set;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -19,19 +18,16 @@ public class PersonBuilder {
public static final String DEFAULT_NAME = "Alice Pauline";
public static final String DEFAULT_PHONE = "85355255";
public static final String DEFAULT_EMAIL = "alice@gmail.com";
- public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111";
private Name name;
private Phone phone;
private Email email;
- private Address address;
private Set tags;
public PersonBuilder() {
name = new Name(DEFAULT_NAME);
phone = new Phone(DEFAULT_PHONE);
email = new Email(DEFAULT_EMAIL);
- address = new Address(DEFAULT_ADDRESS);
tags = new HashSet<>();
}
@@ -42,7 +38,6 @@ public PersonBuilder(Person personToCopy) {
name = personToCopy.getName();
phone = personToCopy.getPhone();
email = personToCopy.getEmail();
- address = personToCopy.getAddress();
tags = new HashSet<>(personToCopy.getTags());
}
@@ -62,14 +57,6 @@ public PersonBuilder withTags(String ... tags) {
return this;
}
- /**
- * Sets the {@code Address} of the {@code Person} that we are building.
- */
- public PersonBuilder withAddress(String address) {
- this.address = new Address(address);
- return this;
- }
-
/**
* Sets the {@code Phone} of the {@code Person} that we are building.
*/
@@ -87,7 +74,7 @@ public PersonBuilder withEmail(String email) {
}
public Person build() {
- return new Person(name, phone, email, address, tags);
+ return new Person(name, phone, email, tags);
}
}
From a64e35858da724d8ea27556e498f7f1ad1bbc43c Mon Sep 17 00:00:00 2001
From: zhouxinwei97 <45256284+zhouxinwei97@users.noreply.github.com>
Date: Fri, 28 Feb 2020 16:16:18 +0800
Subject: [PATCH 006/324] Removed JSON field
---
.../invalidAndValidPersonAddressBook.json | 6 ++----
.../invalidPersonAddressBook.json | 3 +--
.../duplicatePersonAddressBook.json | 4 +---
.../invalidPersonAddressBook.json | 3 +--
.../typicalPersonsAddressBook.json | 7 -------
5 files changed, 5 insertions(+), 18 deletions(-)
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
index 6a4d2b7181c..e342fecdc02 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
+++ b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
@@ -2,12 +2,10 @@
"persons": [ {
"name": "Valid Person",
"phone": "9482424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
}, {
"name": "Person With Invalid Phone Field",
"phone": "948asdf2424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
} ]
}
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
index ccd21f7d1a9..b6156e4bc23 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
@@ -2,7 +2,6 @@
"persons": [ {
"name": "Person with invalid name field: Ha!ns Mu@ster",
"phone": "9482424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
index 48831cc7674..9ea44d3244c 100644
--- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
@@ -3,12 +3,10 @@
"name": "Alice Pauline",
"phone": "94351253",
"email": "alice@example.com",
- "address": "123, Jurong West Ave 6, #08-111",
"tagged": [ "friends" ]
}, {
"name": "Alice Pauline",
"phone": "94351253",
- "email": "pauline@example.com",
- "address": "4th street"
+ "email": "pauline@example.com"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
index ad3f135ae42..671f3da654c 100644
--- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
@@ -2,7 +2,6 @@
"persons": [ {
"name": "Hans Muster",
"phone": "9482424",
- "email": "invalid@email!3e",
- "address": "4th street"
+ "email": "invalid@email!3e"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
index f10eddee12e..51a5ce525a3 100644
--- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
@@ -4,43 +4,36 @@
"name" : "Alice Pauline",
"phone" : "94351253",
"email" : "alice@example.com",
- "address" : "123, Jurong West Ave 6, #08-111",
"tagged" : [ "friends" ]
}, {
"name" : "Benson Meier",
"phone" : "98765432",
"email" : "johnd@example.com",
- "address" : "311, Clementi Ave 2, #02-25",
"tagged" : [ "owesMoney", "friends" ]
}, {
"name" : "Carl Kurz",
"phone" : "95352563",
"email" : "heinz@example.com",
- "address" : "wall street",
"tagged" : [ ]
}, {
"name" : "Daniel Meier",
"phone" : "87652533",
"email" : "cornelia@example.com",
- "address" : "10th street",
"tagged" : [ "friends" ]
}, {
"name" : "Elle Meyer",
"phone" : "9482224",
"email" : "werner@example.com",
- "address" : "michegan ave",
"tagged" : [ ]
}, {
"name" : "Fiona Kunz",
"phone" : "9482427",
"email" : "lydia@example.com",
- "address" : "little tokyo",
"tagged" : [ ]
}, {
"name" : "George Best",
"phone" : "9482442",
"email" : "anna@example.com",
- "address" : "4th street",
"tagged" : [ ]
} ]
}
From 703ac3bf7ec1db9c681fd167ba727f3c55bc5ebf Mon Sep 17 00:00:00 2001
From: zhouxinwei97 <45256284+zhouxinwei97@users.noreply.github.com>
Date: Fri, 28 Feb 2020 17:15:56 +0800
Subject: [PATCH 007/324] tutorial-adding-command
---
.../address/logic/commands/EditCommand.java | 6 +-
.../address/logic/commands/RemarkCommand.java | 89 +++++++++++++++++++
.../logic/parser/AddCommandParser.java | 4 +-
.../logic/parser/AddressBookParser.java | 41 +++++----
.../seedu/address/logic/parser/CliSyntax.java | 1 +
.../logic/parser/RemarkCommandParser.java | 36 ++++++++
.../seedu/address/model/person/Person.java | 11 ++-
.../seedu/address/model/person/Remark.java | 33 +++++++
.../address/model/util/SampleDataUtil.java | 14 +--
.../address/storage/JsonAdaptedPerson.java | 14 ++-
.../java/seedu/address/ui/PersonCard.java | 3 +
src/main/resources/view/PersonListCard.fxml | 1 +
.../duplicatePersonAddressBook.json | 5 +-
.../typicalPersonsAddressBook.json | 7 ++
.../logic/commands/CommandTestUtil.java | 2 +
.../seedu/address/testutil/PersonBuilder.java | 15 +++-
.../address/testutil/TypicalPersons.java | 4 +-
17 files changed, 252 insertions(+), 34 deletions(-)
create mode 100644 src/main/java/seedu/address/logic/commands/RemarkCommand.java
create mode 100644 src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
create mode 100644 src/main/java/seedu/address/model/person/Remark.java
diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java
index 7e36114902f..f4c8bda0680 100644
--- a/src/main/java/seedu/address/logic/commands/EditCommand.java
+++ b/src/main/java/seedu/address/logic/commands/EditCommand.java
@@ -17,6 +17,8 @@
import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.CollectionUtil;
+import seedu.address.logic.commands.Command;
+import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Address;
@@ -25,6 +27,7 @@
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.tag.Tag;
+import seedu.address.model.person.Remark;
/**
* Edits the details of an existing person in the address book.
@@ -97,9 +100,10 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
+ Remark updatedRemark = personToEdit.getRemark(); // edit command does not allow editing remarks
Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
- return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);
+ return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedRemark, updatedTags);
}
@Override
diff --git a/src/main/java/seedu/address/logic/commands/RemarkCommand.java b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
new file mode 100644
index 00000000000..955ec1b923f
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
@@ -0,0 +1,89 @@
+package seedu.address.logic.commands;
+
+import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+
+import seedu.address.commons.core.Messages;
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.exceptions.CommandException;
+import seedu.address.model.Model;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.Remark;
+import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * Changes the remark of an existing person in the address book.
+ */
+public class RemarkCommand extends Command {
+
+ public static final String COMMAND_WORD = "remark";
+ private final Index index;
+ private final Remark remark;
+ public static final String MESSAGE_ADD_REMARK_SUCCESS = "Added remark to Person: %1$s";
+ public static final String MESSAGE_DELETE_REMARK_SUCCESS = "Removed remark from Person: %1$s";
+ public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the person identified"
+ + "by the index number used in the last person listing. "
+ + "Existing remark will be overwritten by the input.\n"
+ + "Parameters: INDEX (must be a positive integer) "
+ + "r/ [REMARK]\n"
+ + "Example: " + COMMAND_WORD + " 1 " + "r/ Likes to swim.";
+
+ /**
+ * @param index of the person in the filtered person list to edit the remark
+ * @param remark of the person to be updated to
+ */
+ public RemarkCommand(Index index, Remark remark) {
+
+ requireAllNonNull(index, remark);
+ this.index = index;
+ this.remark = remark;
+
+ }
+
+ @Override
+ public CommandResult execute(Model model) throws CommandException {
+ List lastShownList = model.getFilteredPersonList();
+
+ if (index.getZeroBased() >= lastShownList.size()) {
+ throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
+ }
+
+ Person personToEdit = lastShownList.get(index.getZeroBased());
+ Person editedPerson = new Person(personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),
+ personToEdit.getAddress(), remark, personToEdit.getTags());
+
+ model.setPerson(personToEdit, editedPerson);
+ model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
+
+ return new CommandResult(generateSuccessMessage(editedPerson));
+ }
+
+ /**
+ * Generates a command execution success message based on whether the remark is added to or removed from
+ * {@code personToEdit}.
+ */
+ private String generateSuccessMessage(Person personToEdit) {
+ String message = !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;
+ return String.format(message, personToEdit);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ // short circuit if same object
+ if (other == this) {
+ return true;
+ }
+
+ // instanceof handles nulls
+ if (!(other instanceof RemarkCommand)) {
+ return false;
+ }
+
+ // state check
+ RemarkCommand e = (RemarkCommand) other;
+ return index.equals(e.index)
+ && remark.equals(e.remark);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
index 3b8bfa035e8..c7d0f809928 100644
--- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
@@ -17,6 +17,7 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
@@ -42,9 +43,10 @@ public AddCommand parse(String args) throws ParseException {
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
+ Remark remark = new Remark(""); // add command does not allow adding remarks straight away
Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
- Person person = new Person(name, phone, email, address, tagList);
+ Person person = new Person(name, phone, email, address, remark, tagList);
return new AddCommand(person);
}
diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
index 1e466792b46..8bb1acdfd34 100644
--- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
@@ -15,6 +15,7 @@
import seedu.address.logic.commands.FindCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.commands.RemarkCommand;
import seedu.address.logic.parser.exceptions.ParseException;
/**
@@ -44,32 +45,36 @@ public Command parseCommand(String userInput) throws ParseException {
final String arguments = matcher.group("arguments");
switch (commandWord) {
- case AddCommand.COMMAND_WORD:
- return new AddCommandParser().parse(arguments);
+ case AddCommand.COMMAND_WORD:
+ return new AddCommandParser().parse(arguments);
- case EditCommand.COMMAND_WORD:
- return new EditCommandParser().parse(arguments);
+ case EditCommand.COMMAND_WORD:
+ return new EditCommandParser().parse(arguments);
- case DeleteCommand.COMMAND_WORD:
- return new DeleteCommandParser().parse(arguments);
+ case DeleteCommand.COMMAND_WORD:
+ return new DeleteCommandParser().parse(arguments);
- case ClearCommand.COMMAND_WORD:
- return new ClearCommand();
+ case ClearCommand.COMMAND_WORD:
+ return new ClearCommand();
- case FindCommand.COMMAND_WORD:
- return new FindCommandParser().parse(arguments);
+ case FindCommand.COMMAND_WORD:
+ return new FindCommandParser().parse(arguments);
- case ListCommand.COMMAND_WORD:
- return new ListCommand();
+ case ListCommand.COMMAND_WORD:
+ return new ListCommand();
- case ExitCommand.COMMAND_WORD:
- return new ExitCommand();
+ case ExitCommand.COMMAND_WORD:
+ return new ExitCommand();
- case HelpCommand.COMMAND_WORD:
- return new HelpCommand();
+ case HelpCommand.COMMAND_WORD:
+ return new HelpCommand();
- default:
- throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
+ case RemarkCommand.COMMAND_WORD:
+ return new RemarkCommandParser().parse(arguments);
+
+
+ default:
+ throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
}
}
diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java
index 75b1a9bf119..96be13b3772 100644
--- a/src/main/java/seedu/address/logic/parser/CliSyntax.java
+++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java
@@ -11,5 +11,6 @@ public class CliSyntax {
public static final Prefix PREFIX_EMAIL = new Prefix("e/");
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
public static final Prefix PREFIX_TAG = new Prefix("t/");
+ public static final Prefix PREFIX_REMARK = new Prefix("r/");
}
diff --git a/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
new file mode 100644
index 00000000000..ed2295f8543
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
@@ -0,0 +1,36 @@
+package seedu.address.logic.parser;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.commons.exceptions.IllegalValueException;
+import seedu.address.logic.commands.RemarkCommand;
+import seedu.address.logic.parser.exceptions.ParseException;
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+import seedu.address.model.person.Remark;
+
+/**
+ * Parses input arguments and creates a new {@code RemarkCommand} object
+ */
+public class RemarkCommandParser implements Parser {
+ /**
+ * Parses the given {@code String} of arguments in the context of the {@code RemarkCommand}
+ * and returns a {@code RemarkCommand} object for execution.
+ * @throws ParseException if the user input does not conform the expected format
+ */
+ public RemarkCommand parse(String args) throws ParseException {
+ requireNonNull(args);
+ ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_REMARK);
+
+ Index index;
+ try {
+ index = ParserUtil.parseIndex(argMultimap.getPreamble());
+ } catch (IllegalValueException ive) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, RemarkCommand.MESSAGE_USAGE), ive);
+ }
+
+ String remark = argMultimap.getValue(PREFIX_REMARK).orElse("");
+
+ return new RemarkCommand(index, new Remark(remark));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java
index 557a7a60cd5..fcfd0723445 100644
--- a/src/main/java/seedu/address/model/person/Person.java
+++ b/src/main/java/seedu/address/model/person/Person.java
@@ -9,6 +9,7 @@
import seedu.address.model.tag.Tag;
+
/**
* Represents a Person in the address book.
* Guarantees: details are present and not null, field values are validated, immutable.
@@ -22,17 +23,19 @@ public class Person {
// Data fields
private final Address address;
+ private final Remark remark;
private final Set tags = new HashSet<>();
/**
* Every field must be present and not null.
*/
- public Person(Name name, Phone phone, Email email, Address address, Set tags) {
+ public Person(Name name, Phone phone, Email email, Address address, Remark remark, Set tags) {
requireAllNonNull(name, phone, email, address, tags);
this.name = name;
this.phone = phone;
this.email = email;
this.address = address;
+ this.remark = remark;
this.tags.addAll(tags);
}
@@ -52,6 +55,10 @@ public Address getAddress() {
return address;
}
+ public Remark getRemark() {
+ return remark;
+ }
+
/**
* Returns an immutable tag set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
@@ -112,6 +119,8 @@ public String toString() {
.append(getEmail())
.append(" Address: ")
.append(getAddress())
+ .append(" Remark: ")
+ .append(getRemark())
.append(" Tags: ");
getTags().forEach(builder::append);
return builder.toString();
diff --git a/src/main/java/seedu/address/model/person/Remark.java b/src/main/java/seedu/address/model/person/Remark.java
new file mode 100644
index 00000000000..c8fd1193895
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/Remark.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Represents a Person's remark in the address book.
+ * Guarantees: immutable; is always valid
+ */
+public class Remark {
+ public final String value;
+
+ public Remark(String remark) {
+ requireNonNull(remark);
+ value = remark;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return other == this // short circuit if same object
+ || (other instanceof Remark // instanceof handles nulls
+ && value.equals(((Remark) other).value)); // state check
+ }
+
+ @Override
+ public int hashCode() {
+ return value.hashCode();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java
index 1806da4facf..5dd3d5b44bd 100644
--- a/src/main/java/seedu/address/model/util/SampleDataUtil.java
+++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java
@@ -11,31 +11,33 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
* Contains utility methods for populating {@code AddressBook} with sample data.
*/
public class SampleDataUtil {
+ public static final Remark EMPTY_REMARK = new Remark("");
public static Person[] getSamplePersons() {
return new Person[] {
new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
- new Address("Blk 30 Geylang Street 29, #06-40"),
+ new Address("Blk 30 Geylang Street 29, #06-40"), EMPTY_REMARK,
getTagSet("friends")),
new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"),
- new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
+ new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), EMPTY_REMARK,
getTagSet("colleagues", "friends")),
new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"),
- new Address("Blk 11 Ang Mo Kio Street 74, #11-04"),
+ new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), EMPTY_REMARK,
getTagSet("neighbours")),
new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"),
- new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
+ new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), EMPTY_REMARK,
getTagSet("family")),
new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"),
- new Address("Blk 47 Tampines Street 20, #17-35"),
+ new Address("Blk 47 Tampines Street 20, #17-35"), EMPTY_REMARK,
getTagSet("classmates")),
new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"),
- new Address("Blk 45 Aljunied Street 85, #11-31"),
+ new Address("Blk 45 Aljunied Street 85, #11-31"), EMPTY_REMARK,
getTagSet("colleagues"))
};
}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
index a6321cec2ea..2229179f4d7 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
@@ -15,6 +15,7 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
/**
@@ -28,6 +29,7 @@ class JsonAdaptedPerson {
private final String phone;
private final String email;
private final String address;
+ private final String remark;
private final List tagged = new ArrayList<>();
/**
@@ -35,12 +37,13 @@ class JsonAdaptedPerson {
*/
@JsonCreator
public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
- @JsonProperty("email") String email, @JsonProperty("address") String address,
- @JsonProperty("tagged") List tagged) {
+ @JsonProperty("email") String email, @JsonProperty("address") String address,
+ @JsonProperty("remark") String remark, @JsonProperty("tagged") List tagged) {
this.name = name;
this.phone = phone;
this.email = email;
this.address = address;
+ this.remark = remark;
if (tagged != null) {
this.tagged.addAll(tagged);
}
@@ -54,6 +57,7 @@ public JsonAdaptedPerson(Person source) {
phone = source.getPhone().value;
email = source.getEmail().value;
address = source.getAddress().value;
+ remark = source.getRemark().value;
tagged.addAll(source.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList()));
@@ -100,10 +104,14 @@ public Person toModelType() throws IllegalValueException {
if (!Address.isValidAddress(address)) {
throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);
}
+ if (remark == null) {
+ throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Remark.class.getSimpleName()));
+ }
+ final Remark modelRemark = new Remark(remark);
final Address modelAddress = new Address(address);
final Set modelTags = new HashSet<>(personTags);
- return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);
+ return new Person(modelName, modelPhone, modelEmail, modelAddress, modelRemark, modelTags);
}
}
diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java
index 0684b088868..34350442ebd 100644
--- a/src/main/java/seedu/address/ui/PersonCard.java
+++ b/src/main/java/seedu/address/ui/PersonCard.java
@@ -40,6 +40,8 @@ public class PersonCard extends UiPart {
private Label email;
@FXML
private FlowPane tags;
+ @FXML
+ private Label remark;
public PersonCard(Person person, int displayedIndex) {
super(FXML);
@@ -49,6 +51,7 @@ public PersonCard(Person person, int displayedIndex) {
phone.setText(person.getPhone().value);
address.setText(person.getAddress().value);
email.setText(person.getEmail().value);
+ remark.setText(person.getRemark().value);
person.getTags().stream()
.sorted(Comparator.comparing(tag -> tag.tagName))
.forEach(tag -> tags.getChildren().add(new Label(tag.tagName)));
diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml
index f08ea32ad55..d1a7eb614f8 100644
--- a/src/main/resources/view/PersonListCard.fxml
+++ b/src/main/resources/view/PersonListCard.fxml
@@ -31,6 +31,7 @@
+
diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
index 9ea44d3244c..c76c9839cce 100644
--- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
@@ -3,10 +3,13 @@
"name": "Alice Pauline",
"phone": "94351253",
"email": "alice@example.com",
+ "remark" : "",
"tagged": [ "friends" ]
}, {
"name": "Alice Pauline",
"phone": "94351253",
- "email": "pauline@example.com"
+ "email": "pauline@example.com",
+ "address": "4th street",
+ "remark" : ""
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
index 51a5ce525a3..508744188dd 100644
--- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
@@ -4,36 +4,43 @@
"name" : "Alice Pauline",
"phone" : "94351253",
"email" : "alice@example.com",
+ "remark" : "",
"tagged" : [ "friends" ]
}, {
"name" : "Benson Meier",
"phone" : "98765432",
"email" : "johnd@example.com",
+ "remark" : "",
"tagged" : [ "owesMoney", "friends" ]
}, {
"name" : "Carl Kurz",
"phone" : "95352563",
"email" : "heinz@example.com",
+ "remark" : "",
"tagged" : [ ]
}, {
"name" : "Daniel Meier",
"phone" : "87652533",
"email" : "cornelia@example.com",
+ "remark" : "",
"tagged" : [ "friends" ]
}, {
"name" : "Elle Meyer",
"phone" : "9482224",
"email" : "werner@example.com",
+ "remark" : "",
"tagged" : [ ]
}, {
"name" : "Fiona Kunz",
"phone" : "9482427",
"email" : "lydia@example.com",
+ "remark" : "",
"tagged" : [ ]
}, {
"name" : "George Best",
"phone" : "9482442",
"email" : "anna@example.com",
+ "remark" : "",
"tagged" : [ ]
} ]
}
diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
index 643a1d08069..313b370a7a8 100644
--- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
+++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
@@ -34,6 +34,8 @@ public class CommandTestUtil {
public static final String VALID_EMAIL_BOB = "bob@example.com";
public static final String VALID_ADDRESS_AMY = "Block 312, Amy Street 1";
public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3";
+ public static final String VALID_REMARK_AMY = "Like skiing.";
+ public static final String VALID_REMARK_BOB = "Favourite pastime: Eating";
public static final String VALID_TAG_HUSBAND = "husband";
public static final String VALID_TAG_FRIEND = "friend";
diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java
index 5eff412178b..c3b56b172e6 100644
--- a/src/test/java/seedu/address/testutil/PersonBuilder.java
+++ b/src/test/java/seedu/address/testutil/PersonBuilder.java
@@ -8,6 +8,7 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
+import seedu.address.model.person.Remark;
import seedu.address.model.tag.Tag;
import seedu.address.model.util.SampleDataUtil;
@@ -20,12 +21,14 @@ public class PersonBuilder {
public static final String DEFAULT_PHONE = "85355255";
public static final String DEFAULT_EMAIL = "alice@gmail.com";
public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111";
+ public static final String DEFAULT_REMARK = "She likes aardvarks.";
private Name name;
private Phone phone;
private Email email;
private Address address;
private Set tags;
+ private Remark remark;
public PersonBuilder() {
name = new Name(DEFAULT_NAME);
@@ -33,6 +36,7 @@ public PersonBuilder() {
email = new Email(DEFAULT_EMAIL);
address = new Address(DEFAULT_ADDRESS);
tags = new HashSet<>();
+ remark = new Remark(DEFAULT_REMARK);
}
/**
@@ -44,6 +48,7 @@ public PersonBuilder(Person personToCopy) {
email = personToCopy.getEmail();
address = personToCopy.getAddress();
tags = new HashSet<>(personToCopy.getTags());
+ remark = personToCopy.getRemark();
}
/**
@@ -86,8 +91,16 @@ public PersonBuilder withEmail(String email) {
return this;
}
+ /**
+ * Sets the {@code Remark} of the {@code Person} that we are building.
+ */
+ public PersonBuilder withRemark(String remark) {
+ this.remark = new Remark(remark);
+ return this;
+ }
+
public Person build() {
- return new Person(name, phone, email, address, tags);
+ return new Person(name, phone, email, address, remark, tags);
}
}
diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java
index fec76fb7129..328c34eeb30 100644
--- a/src/test/java/seedu/address/testutil/TypicalPersons.java
+++ b/src/test/java/seedu/address/testutil/TypicalPersons.java
@@ -25,10 +25,10 @@ public class TypicalPersons {
public static final Person ALICE = new PersonBuilder().withName("Alice Pauline")
.withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com")
- .withPhone("94351253")
+ .withPhone("94351253").withRemark("She likes aardvarks.")
.withTags("friends").build();
public static final Person BENSON = new PersonBuilder().withName("Benson Meier")
- .withAddress("311, Clementi Ave 2, #02-25")
+ .withAddress("311, Clementi Ave 2, #02-25").withRemark("He can't take beer!")
.withEmail("johnd@example.com").withPhone("98765432")
.withTags("owesMoney", "friends").build();
public static final Person CARL = new PersonBuilder().withName("Carl Kurz").withPhone("95352563")
From 23aaf1d045e0ee33fa771ec98049ceb19b08a6ab Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Mon, 2 Mar 2020 00:24:17 +0800
Subject: [PATCH 008/324] remove codacy badge for testing
---
README.adoc | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.adoc b/README.adoc
index e36efe534bb..f56d18696cc 100644
--- a/README.adoc
+++ b/README.adoc
@@ -4,7 +4,6 @@ ifdef::env-github,env-browser[:relfileprefix: docs/]
https://travis-ci.org/se-edu/addressbook-level3[image:https://travis-ci.org/se-edu/addressbook-level3.svg?branch=master[Build Status]]
https://ci.appveyor.com/project/damithc/addressbook-level3[image:https://ci.appveyor.com/api/projects/status/3boko2x2vr5cc3w2?svg=true[Build status]]
https://coveralls.io/github/se-edu/addressbook-level3?branch=master[image:https://coveralls.io/repos/github/se-edu/addressbook-level3/badge.svg?branch=master[Coverage Status]]
-https://www.codacy.com/app/damith/addressbook-level3?utm_source=github.com&utm_medium=referral&utm_content=se-edu/addressbook-level3&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/fc0b7775cf7f4fdeaf08776f3d8e364a[Codacy Badge]]
ifdef::env-github[]
From 616f2e71e76420bea2621bafcc4cca6a748b6d42 Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Mon, 2 Mar 2020 00:29:15 +0800
Subject: [PATCH 009/324] Revert "remove codacy badge for testing"
This reverts commit 23aaf1d045e0ee33fa771ec98049ceb19b08a6ab.
---
README.adoc | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.adoc b/README.adoc
index f56d18696cc..e36efe534bb 100644
--- a/README.adoc
+++ b/README.adoc
@@ -4,6 +4,7 @@ ifdef::env-github,env-browser[:relfileprefix: docs/]
https://travis-ci.org/se-edu/addressbook-level3[image:https://travis-ci.org/se-edu/addressbook-level3.svg?branch=master[Build Status]]
https://ci.appveyor.com/project/damithc/addressbook-level3[image:https://ci.appveyor.com/api/projects/status/3boko2x2vr5cc3w2?svg=true[Build status]]
https://coveralls.io/github/se-edu/addressbook-level3?branch=master[image:https://coveralls.io/repos/github/se-edu/addressbook-level3/badge.svg?branch=master[Coverage Status]]
+https://www.codacy.com/app/damith/addressbook-level3?utm_source=github.com&utm_medium=referral&utm_content=se-edu/addressbook-level3&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/fc0b7775cf7f4fdeaf08776f3d8e364a[Codacy Badge]]
ifdef::env-github[]
From d7a78164b18f9d18037a33648a88083a5cb2adef Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Mon, 2 Mar 2020 00:35:04 +0800
Subject: [PATCH 010/324] remove codacy badge
---
README.adoc | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.adoc b/README.adoc
index e36efe534bb..c42a77ca510 100644
--- a/README.adoc
+++ b/README.adoc
@@ -4,8 +4,6 @@ ifdef::env-github,env-browser[:relfileprefix: docs/]
https://travis-ci.org/se-edu/addressbook-level3[image:https://travis-ci.org/se-edu/addressbook-level3.svg?branch=master[Build Status]]
https://ci.appveyor.com/project/damithc/addressbook-level3[image:https://ci.appveyor.com/api/projects/status/3boko2x2vr5cc3w2?svg=true[Build status]]
https://coveralls.io/github/se-edu/addressbook-level3?branch=master[image:https://coveralls.io/repos/github/se-edu/addressbook-level3/badge.svg?branch=master[Coverage Status]]
-https://www.codacy.com/app/damith/addressbook-level3?utm_source=github.com&utm_medium=referral&utm_content=se-edu/addressbook-level3&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/fc0b7775cf7f4fdeaf08776f3d8e364a[Codacy Badge]]
-
ifdef::env-github[]
image::docs/images/Ui.png[width="600"]
From 10eb3a5c3fde612d5a8c3b4982b82b3177578215 Mon Sep 17 00:00:00 2001
From: Kangwkk <846199604@qq.com>
Date: Mon, 2 Mar 2020 15:33:23 +0800
Subject: [PATCH 011/324] remove address
---
.../address/logic/commands/EditCommand.java | 17 +-----
.../logic/parser/AddCommandParser.java | 8 +--
.../logic/parser/EditCommandParser.java | 3 -
.../address/logic/parser/ParserUtil.java | 16 ------
.../seedu/address/model/person/Address.java | 57 -------------------
.../seedu/address/model/person/Person.java | 14 +----
.../address/model/util/SampleDataUtil.java | 7 ---
.../address/storage/JsonAdaptedPerson.java | 16 +-----
.../java/seedu/address/ui/PersonCard.java | 3 -
src/main/resources/view/PersonListCard.fxml | 1 -
.../invalidAndValidPersonAddressBook.json | 6 +-
.../invalidPersonAddressBook.json | 3 +-
.../duplicatePersonAddressBook.json | 4 +-
.../invalidPersonAddressBook.json | 3 +-
.../typicalPersonsAddressBook.json | 7 ---
.../seedu/address/logic/LogicManagerTest.java | 3 +-
.../logic/commands/CommandTestUtil.java | 4 +-
.../commands/EditPersonDescriptorTest.java | 4 --
.../logic/parser/AddCommandParserTest.java | 39 +++++--------
.../logic/parser/EditCommandParserTest.java | 15 +----
.../address/logic/parser/ParserUtilTest.java | 24 --------
.../seedu/address/model/AddressBookTest.java | 4 +-
.../address/model/person/AddressTest.java | 29 ----------
.../NameContainsKeywordsPredicateTest.java | 2 +-
.../address/model/person/PersonTest.java | 10 +---
.../model/person/UniquePersonListTest.java | 4 +-
.../storage/JsonAdaptedPersonTest.java | 31 +++-------
.../testutil/EditPersonDescriptorBuilder.java | 10 ----
.../seedu/address/testutil/PersonBuilder.java | 14 +----
.../seedu/address/testutil/PersonUtil.java | 2 -
.../address/testutil/TypicalPersons.java | 21 ++++---
31 files changed, 62 insertions(+), 319 deletions(-)
delete mode 100644 src/main/java/seedu/address/model/person/Address.java
diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java
index 7e36114902f..45eb6cc758a 100644
--- a/src/main/java/seedu/address/logic/commands/EditCommand.java
+++ b/src/main/java/seedu/address/logic/commands/EditCommand.java
@@ -19,7 +19,6 @@
import seedu.address.commons.util.CollectionUtil;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -96,10 +95,9 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName());
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail());
- Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
- return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);
+ return new Person(updatedName, updatedPhone, updatedEmail, updatedTags);
}
@Override
@@ -128,7 +126,6 @@ public static class EditPersonDescriptor {
private Name name;
private Phone phone;
private Email email;
- private Address address;
private Set tags;
public EditPersonDescriptor() {}
@@ -141,7 +138,6 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setName(toCopy.name);
setPhone(toCopy.phone);
setEmail(toCopy.email);
- setAddress(toCopy.address);
setTags(toCopy.tags);
}
@@ -149,7 +145,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
* Returns true if at least one field is edited.
*/
public boolean isAnyFieldEdited() {
- return CollectionUtil.isAnyNonNull(name, phone, email, address, tags);
+ return CollectionUtil.isAnyNonNull(name, phone, email, tags);
}
public void setName(Name name) {
@@ -176,14 +172,6 @@ public Optional getEmail() {
return Optional.ofNullable(email);
}
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Optional getAddress() {
- return Optional.ofNullable(address);
- }
-
/**
* Sets {@code tags} to this object's {@code tags}.
* A defensive copy of {@code tags} is used internally.
@@ -219,7 +207,6 @@ public boolean equals(Object other) {
return getName().equals(e.getName())
&& getPhone().equals(e.getPhone())
&& getEmail().equals(e.getEmail())
- && getAddress().equals(e.getAddress())
&& getTags().equals(e.getTags());
}
}
diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
index 3b8bfa035e8..02f7f38edf1 100644
--- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
@@ -12,7 +12,6 @@
import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -31,9 +30,9 @@ public class AddCommandParser implements Parser {
*/
public AddCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
- ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
+ ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG);
- if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
+ if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL)
|| !argMultimap.getPreamble().isEmpty()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
}
@@ -41,10 +40,9 @@ public AddCommand parse(String args) throws ParseException {
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
- Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
- Person person = new Person(name, phone, email, address, tagList);
+ Person person = new Person(name, phone, email, tagList);
return new AddCommand(person);
}
diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java
index 845644b7dea..dea2943ee2a 100644
--- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java
@@ -52,9 +52,6 @@ public EditCommand parse(String args) throws ParseException {
if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) {
editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()));
}
- if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {
- editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));
- }
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
if (!editPersonDescriptor.isAnyFieldEdited()) {
diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java
index b117acb9c55..9ab53095f44 100644
--- a/src/main/java/seedu/address/logic/parser/ParserUtil.java
+++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java
@@ -9,7 +9,6 @@
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.StringUtil;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -65,21 +64,6 @@ public static Phone parsePhone(String phone) throws ParseException {
return new Phone(trimmedPhone);
}
- /**
- * Parses a {@code String address} into an {@code Address}.
- * Leading and trailing whitespaces will be trimmed.
- *
- * @throws ParseException if the given {@code address} is invalid.
- */
- public static Address parseAddress(String address) throws ParseException {
- requireNonNull(address);
- String trimmedAddress = address.trim();
- if (!Address.isValidAddress(trimmedAddress)) {
- throw new ParseException(Address.MESSAGE_CONSTRAINTS);
- }
- return new Address(trimmedAddress);
- }
-
/**
* Parses a {@code String email} into an {@code Email}.
* Leading and trailing whitespaces will be trimmed.
diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java
deleted file mode 100644
index 60472ca22a0..00000000000
--- a/src/main/java/seedu/address/model/person/Address.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package seedu.address.model.person;
-
-import static java.util.Objects.requireNonNull;
-import static seedu.address.commons.util.AppUtil.checkArgument;
-
-/**
- * Represents a Person's address in the address book.
- * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}
- */
-public class Address {
-
- public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank";
-
- /*
- * The first character of the address must not be a whitespace,
- * otherwise " " (a blank string) becomes a valid input.
- */
- public static final String VALIDATION_REGEX = "[^\\s].*";
-
- public final String value;
-
- /**
- * Constructs an {@code Address}.
- *
- * @param address A valid address.
- */
- public Address(String address) {
- requireNonNull(address);
- checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);
- value = address;
- }
-
- /**
- * Returns true if a given string is a valid email.
- */
- public static boolean isValidAddress(String test) {
- return test.matches(VALIDATION_REGEX);
- }
-
- @Override
- public String toString() {
- return value;
- }
-
- @Override
- public boolean equals(Object other) {
- return other == this // short circuit if same object
- || (other instanceof Address // instanceof handles nulls
- && value.equals(((Address) other).value)); // state check
- }
-
- @Override
- public int hashCode() {
- return value.hashCode();
- }
-
-}
diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java
index 557a7a60cd5..c1399e159cf 100644
--- a/src/main/java/seedu/address/model/person/Person.java
+++ b/src/main/java/seedu/address/model/person/Person.java
@@ -21,18 +21,16 @@ public class Person {
private final Email email;
// Data fields
- private final Address address;
private final Set tags = new HashSet<>();
/**
* Every field must be present and not null.
*/
- public Person(Name name, Phone phone, Email email, Address address, Set tags) {
- requireAllNonNull(name, phone, email, address, tags);
+ public Person(Name name, Phone phone, Email email, Set tags) {
+ requireAllNonNull(name, phone, email, tags);
this.name = name;
this.phone = phone;
this.email = email;
- this.address = address;
this.tags.addAll(tags);
}
@@ -48,10 +46,6 @@ public Email getEmail() {
return email;
}
- public Address getAddress() {
- return address;
- }
-
/**
* Returns an immutable tag set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
@@ -92,14 +86,13 @@ public boolean equals(Object other) {
return otherPerson.getName().equals(getName())
&& otherPerson.getPhone().equals(getPhone())
&& otherPerson.getEmail().equals(getEmail())
- && otherPerson.getAddress().equals(getAddress())
&& otherPerson.getTags().equals(getTags());
}
@Override
public int hashCode() {
// use this method for custom fields hashing instead of implementing your own
- return Objects.hash(name, phone, email, address, tags);
+ return Objects.hash(name, phone, email, tags);
}
@Override
@@ -111,7 +104,6 @@ public String toString() {
.append(" Email: ")
.append(getEmail())
.append(" Address: ")
- .append(getAddress())
.append(" Tags: ");
getTags().forEach(builder::append);
return builder.toString();
diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java
index 1806da4facf..c8ca69d0cbc 100644
--- a/src/main/java/seedu/address/model/util/SampleDataUtil.java
+++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java
@@ -6,7 +6,6 @@
import seedu.address.model.AddressBook;
import seedu.address.model.ReadOnlyAddressBook;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -20,22 +19,16 @@ public class SampleDataUtil {
public static Person[] getSamplePersons() {
return new Person[] {
new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
- new Address("Blk 30 Geylang Street 29, #06-40"),
getTagSet("friends")),
new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"),
- new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
getTagSet("colleagues", "friends")),
new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"),
- new Address("Blk 11 Ang Mo Kio Street 74, #11-04"),
getTagSet("neighbours")),
new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"),
- new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
getTagSet("family")),
new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"),
- new Address("Blk 47 Tampines Street 20, #17-35"),
getTagSet("classmates")),
new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"),
- new Address("Blk 45 Aljunied Street 85, #11-31"),
getTagSet("colleagues"))
};
}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
index a6321cec2ea..52af76e9ca7 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
@@ -10,7 +10,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import seedu.address.commons.exceptions.IllegalValueException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -27,7 +26,6 @@ class JsonAdaptedPerson {
private final String name;
private final String phone;
private final String email;
- private final String address;
private final List tagged = new ArrayList<>();
/**
@@ -35,12 +33,11 @@ class JsonAdaptedPerson {
*/
@JsonCreator
public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
- @JsonProperty("email") String email, @JsonProperty("address") String address,
+ @JsonProperty("email") String email,
@JsonProperty("tagged") List tagged) {
this.name = name;
this.phone = phone;
this.email = email;
- this.address = address;
if (tagged != null) {
this.tagged.addAll(tagged);
}
@@ -53,7 +50,6 @@ public JsonAdaptedPerson(Person source) {
name = source.getName().fullName;
phone = source.getPhone().value;
email = source.getEmail().value;
- address = source.getAddress().value;
tagged.addAll(source.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList()));
@@ -94,16 +90,8 @@ public Person toModelType() throws IllegalValueException {
}
final Email modelEmail = new Email(email);
- if (address == null) {
- throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));
- }
- if (!Address.isValidAddress(address)) {
- throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);
- }
- final Address modelAddress = new Address(address);
-
final Set modelTags = new HashSet<>(personTags);
- return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags);
+ return new Person(modelName, modelPhone, modelEmail, modelTags);
}
}
diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java
index 0684b088868..0c1d88bc4c1 100644
--- a/src/main/java/seedu/address/ui/PersonCard.java
+++ b/src/main/java/seedu/address/ui/PersonCard.java
@@ -35,8 +35,6 @@ public class PersonCard extends UiPart {
@FXML
private Label phone;
@FXML
- private Label address;
- @FXML
private Label email;
@FXML
private FlowPane tags;
@@ -47,7 +45,6 @@ public PersonCard(Person person, int displayedIndex) {
id.setText(displayedIndex + ". ");
name.setText(person.getName().fullName);
phone.setText(person.getPhone().value);
- address.setText(person.getAddress().value);
email.setText(person.getEmail().value);
person.getTags().stream()
.sorted(Comparator.comparing(tag -> tag.tagName))
diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml
index f08ea32ad55..2a8da41fae8 100644
--- a/src/main/resources/view/PersonListCard.fxml
+++ b/src/main/resources/view/PersonListCard.fxml
@@ -29,7 +29,6 @@
-
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
index 6a4d2b7181c..e342fecdc02 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
+++ b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json
@@ -2,12 +2,10 @@
"persons": [ {
"name": "Valid Person",
"phone": "9482424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
}, {
"name": "Person With Invalid Phone Field",
"phone": "948asdf2424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
} ]
}
diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
index ccd21f7d1a9..b6156e4bc23 100644
--- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json
@@ -2,7 +2,6 @@
"persons": [ {
"name": "Person with invalid name field: Ha!ns Mu@ster",
"phone": "9482424",
- "email": "hans@example.com",
- "address": "4th street"
+ "email": "hans@example.com"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
index 48831cc7674..9ea44d3244c 100644
--- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json
@@ -3,12 +3,10 @@
"name": "Alice Pauline",
"phone": "94351253",
"email": "alice@example.com",
- "address": "123, Jurong West Ave 6, #08-111",
"tagged": [ "friends" ]
}, {
"name": "Alice Pauline",
"phone": "94351253",
- "email": "pauline@example.com",
- "address": "4th street"
+ "email": "pauline@example.com"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
index ad3f135ae42..671f3da654c 100644
--- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json
@@ -2,7 +2,6 @@
"persons": [ {
"name": "Hans Muster",
"phone": "9482424",
- "email": "invalid@email!3e",
- "address": "4th street"
+ "email": "invalid@email!3e"
} ]
}
diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
index f10eddee12e..51a5ce525a3 100644
--- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json
@@ -4,43 +4,36 @@
"name" : "Alice Pauline",
"phone" : "94351253",
"email" : "alice@example.com",
- "address" : "123, Jurong West Ave 6, #08-111",
"tagged" : [ "friends" ]
}, {
"name" : "Benson Meier",
"phone" : "98765432",
"email" : "johnd@example.com",
- "address" : "311, Clementi Ave 2, #02-25",
"tagged" : [ "owesMoney", "friends" ]
}, {
"name" : "Carl Kurz",
"phone" : "95352563",
"email" : "heinz@example.com",
- "address" : "wall street",
"tagged" : [ ]
}, {
"name" : "Daniel Meier",
"phone" : "87652533",
"email" : "cornelia@example.com",
- "address" : "10th street",
"tagged" : [ "friends" ]
}, {
"name" : "Elle Meyer",
"phone" : "9482224",
"email" : "werner@example.com",
- "address" : "michegan ave",
"tagged" : [ ]
}, {
"name" : "Fiona Kunz",
"phone" : "9482427",
"email" : "lydia@example.com",
- "address" : "little tokyo",
"tagged" : [ ]
}, {
"name" : "George Best",
"phone" : "9482442",
"email" : "anna@example.com",
- "address" : "4th street",
"tagged" : [ ]
} ]
}
diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java
index ad923ac249a..8e9005c1c55 100644
--- a/src/test/java/seedu/address/logic/LogicManagerTest.java
+++ b/src/test/java/seedu/address/logic/LogicManagerTest.java
@@ -79,8 +79,7 @@ public void execute_storageThrowsIoException_throwsCommandException() {
logic = new LogicManager(model, storage);
// Execute add command
- String addCommand = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY
- + ADDRESS_DESC_AMY;
+ String addCommand = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY;
Person expectedPerson = new PersonBuilder(AMY).withTags().build();
ModelManager expectedModel = new ModelManager();
expectedModel.addPerson(expectedPerson);
diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
index 643a1d08069..78393dd9d84 100644
--- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
+++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
@@ -62,10 +62,10 @@ public class CommandTestUtil {
static {
DESC_AMY = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)
- .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)
+ .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY)
.withTags(VALID_TAG_FRIEND).build();
DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB)
- .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)
+ .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)
.withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
}
diff --git a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
index e0288792e72..ab45ca4c6ef 100644
--- a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
+++ b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java
@@ -47,10 +47,6 @@ public void equals() {
editedAmy = new EditPersonDescriptorBuilder(DESC_AMY).withEmail(VALID_EMAIL_BOB).build();
assertFalse(DESC_AMY.equals(editedAmy));
- // different address -> returns false
- editedAmy = new EditPersonDescriptorBuilder(DESC_AMY).withAddress(VALID_ADDRESS_BOB).build();
- assertFalse(DESC_AMY.equals(editedAmy));
-
// different tags -> returns false
editedAmy = new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build();
assertFalse(DESC_AMY.equals(editedAmy));
diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
index 5cf487d7ebb..3e7dbe91565 100644
--- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
@@ -32,7 +32,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.logic.commands.AddCommand;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -49,28 +48,28 @@ public void parse_allFieldsPresent_success() {
// whitespace only preamble
assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
// multiple names - last name accepted
assertParseSuccess(parser, NAME_DESC_AMY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
// multiple phones - last phone accepted
assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_AMY + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
// multiple emails - last email accepted
assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_AMY + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
// multiple addresses - last address accepted
- assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_AMY
- + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
+ assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ + TAG_DESC_FRIEND, new AddCommand(expectedPerson));
// multiple tags - all accepted
Person expectedPersonMultipleTags = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
.build();
- assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, new AddCommand(expectedPersonMultipleTags));
}
@@ -78,7 +77,7 @@ public void parse_allFieldsPresent_success() {
public void parse_optionalFieldsMissing_success() {
// zero tags
Person expectedPerson = new PersonBuilder(AMY).withTags().build();
- assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,
+ assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY ,
new AddCommand(expectedPerson));
}
@@ -98,44 +97,36 @@ public void parse_compulsoryFieldMissing_failure() {
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB,
expectedMessage);
- // missing address prefix
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,
- expectedMessage);
-
// all prefixes missing
- assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,
+ assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB,
expectedMessage);
}
@Test
public void parse_invalidValue_failure() {
// invalid name
- assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS);
// invalid phone
- assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS);
// invalid email
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB
+ assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);
- // invalid address
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC
- + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);
-
// invalid tag
- assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);
// two invalid values, only first invalid value reported
- assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,
+ assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB,
Name.MESSAGE_CONSTRAINTS);
// non-empty preamble
assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
- + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
+ + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
}
}
diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
index 2ff31522486..64e48b37ca4 100644
--- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java
@@ -5,7 +5,6 @@
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;
-import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;
@@ -36,7 +35,6 @@
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -84,7 +82,6 @@ public void parse_invalidValue_failure() {
assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name
assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone
assertParseFailure(parser, "1" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email
- assertParseFailure(parser, "1" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address
assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag
// invalid phone followed by valid email
@@ -112,7 +109,7 @@ public void parse_allFieldsSpecified_success() {
+ EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY)
- .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)
+ .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY)
.withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build();
EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
@@ -152,12 +149,6 @@ public void parse_oneFieldSpecified_success() {
expectedCommand = new EditCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
- // address
- userInput = targetIndex.getOneBased() + ADDRESS_DESC_AMY;
- descriptor = new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build();
- expectedCommand = new EditCommand(targetIndex, descriptor);
- assertParseSuccess(parser, userInput, expectedCommand);
-
// tags
userInput = targetIndex.getOneBased() + TAG_DESC_FRIEND;
descriptor = new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build();
@@ -173,7 +164,7 @@ public void parse_multipleRepeatedFields_acceptsLast() {
+ PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;
EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB)
- .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
+ .withEmail(VALID_EMAIL_BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND)
.build();
EditCommand expectedCommand = new EditCommand(targetIndex, descriptor);
@@ -193,7 +184,7 @@ public void parse_invalidValueFollowedByValidValue_success() {
userInput = targetIndex.getOneBased() + EMAIL_DESC_BOB + INVALID_PHONE_DESC + ADDRESS_DESC_BOB
+ PHONE_DESC_BOB;
descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB)
- .withAddress(VALID_ADDRESS_BOB).build();
+ .build();
expectedCommand = new EditCommand(targetIndex, descriptor);
assertParseSuccess(parser, userInput, expectedCommand);
}
diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
index 4256788b1a7..2f0027be91f 100644
--- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
+++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
@@ -14,7 +14,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.logic.parser.exceptions.ParseException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -102,29 +101,6 @@ public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exc
assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace));
}
- @Test
- public void parseAddress_null_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((String) null));
- }
-
- @Test
- public void parseAddress_invalidValue_throwsParseException() {
- assertThrows(ParseException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS));
- }
-
- @Test
- public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception {
- Address expectedAddress = new Address(VALID_ADDRESS);
- assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS));
- }
-
- @Test
- public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception {
- String addressWithWhitespace = WHITESPACE + VALID_ADDRESS + WHITESPACE;
- Address expectedAddress = new Address(VALID_ADDRESS);
- assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace));
- }
-
@Test
public void parseEmail_null_throwsNullPointerException() {
assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((String) null));
diff --git a/src/test/java/seedu/address/model/AddressBookTest.java b/src/test/java/seedu/address/model/AddressBookTest.java
index 87782528ecd..39374b3c710 100644
--- a/src/test/java/seedu/address/model/AddressBookTest.java
+++ b/src/test/java/seedu/address/model/AddressBookTest.java
@@ -46,7 +46,7 @@ public void resetData_withValidReadOnlyAddressBook_replacesData() {
@Test
public void resetData_withDuplicatePersons_throwsDuplicatePersonException() {
// Two persons with the same identity fields
- Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
+ Person editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND)
.build();
List newPersons = Arrays.asList(ALICE, editedAlice);
AddressBookStub newData = new AddressBookStub(newPersons);
@@ -73,7 +73,7 @@ public void hasPerson_personInAddressBook_returnsTrue() {
@Test
public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() {
addressBook.addPerson(ALICE);
- Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
+ Person editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND)
.build();
assertTrue(addressBook.hasPerson(editedAlice));
}
diff --git a/src/test/java/seedu/address/model/person/AddressTest.java b/src/test/java/seedu/address/model/person/AddressTest.java
index dcd3be87b3a..9d73965adb0 100644
--- a/src/test/java/seedu/address/model/person/AddressTest.java
+++ b/src/test/java/seedu/address/model/person/AddressTest.java
@@ -5,32 +5,3 @@
import static seedu.address.testutil.Assert.assertThrows;
import org.junit.jupiter.api.Test;
-
-public class AddressTest {
-
- @Test
- public void constructor_null_throwsNullPointerException() {
- assertThrows(NullPointerException.class, () -> new Address(null));
- }
-
- @Test
- public void constructor_invalidAddress_throwsIllegalArgumentException() {
- String invalidAddress = "";
- assertThrows(IllegalArgumentException.class, () -> new Address(invalidAddress));
- }
-
- @Test
- public void isValidAddress() {
- // null address
- assertThrows(NullPointerException.class, () -> Address.isValidAddress(null));
-
- // invalid addresses
- assertFalse(Address.isValidAddress("")); // empty string
- assertFalse(Address.isValidAddress(" ")); // spaces only
-
- // valid addresses
- assertTrue(Address.isValidAddress("Blk 456, Den Road, #01-355"));
- assertTrue(Address.isValidAddress("-")); // one character
- assertTrue(Address.isValidAddress("Leng Inc; 1234 Market St; San Francisco CA 2349879; USA")); // long address
- }
-}
diff --git a/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java b/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
index f136664e017..96be3290be9 100644
--- a/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
+++ b/src/test/java/seedu/address/model/person/NameContainsKeywordsPredicateTest.java
@@ -70,6 +70,6 @@ public void test_nameDoesNotContainKeywords_returnsFalse() {
// Keywords match phone, email and address, but does not match name
predicate = new NameContainsKeywordsPredicate(Arrays.asList("12345", "alice@email.com", "Main", "Street"));
assertFalse(predicate.test(new PersonBuilder().withName("Alice").withPhone("12345")
- .withEmail("alice@email.com").withAddress("Main Street").build()));
+ .withEmail("alice@email.com").build()));
}
}
diff --git a/src/test/java/seedu/address/model/person/PersonTest.java b/src/test/java/seedu/address/model/person/PersonTest.java
index 7c1058d8635..28f591d6190 100644
--- a/src/test/java/seedu/address/model/person/PersonTest.java
+++ b/src/test/java/seedu/address/model/person/PersonTest.java
@@ -40,17 +40,17 @@ public void isSamePerson() {
assertFalse(ALICE.isSamePerson(editedAlice));
// same name, same phone, different attributes -> returns true
- editedAlice = new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)
+ editedAlice = new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB)
.withTags(VALID_TAG_HUSBAND).build();
assertTrue(ALICE.isSamePerson(editedAlice));
// same name, same email, different attributes -> returns true
- editedAlice = new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withAddress(VALID_ADDRESS_BOB)
+ editedAlice = new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB)
.withTags(VALID_TAG_HUSBAND).build();
assertTrue(ALICE.isSamePerson(editedAlice));
// same name, same phone, same email, different attributes -> returns true
- editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build();
+ editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();
assertTrue(ALICE.isSamePerson(editedAlice));
}
@@ -84,10 +84,6 @@ public void equals() {
editedAlice = new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build();
assertFalse(ALICE.equals(editedAlice));
- // different address -> returns false
- editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build();
- assertFalse(ALICE.equals(editedAlice));
-
// different tags -> returns false
editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build();
assertFalse(ALICE.equals(editedAlice));
diff --git a/src/test/java/seedu/address/model/person/UniquePersonListTest.java b/src/test/java/seedu/address/model/person/UniquePersonListTest.java
index 1cc5fe9e0fe..c58c0304699 100644
--- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java
+++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java
@@ -42,7 +42,7 @@ public void contains_personInList_returnsTrue() {
@Test
public void contains_personWithSameIdentityFieldsInList_returnsTrue() {
uniquePersonList.add(ALICE);
- Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
+ Person editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND)
.build();
assertTrue(uniquePersonList.contains(editedAlice));
}
@@ -85,7 +85,7 @@ public void setPerson_editedPersonIsSamePerson_success() {
@Test
public void setPerson_editedPersonHasSameIdentity_success() {
uniquePersonList.add(ALICE);
- Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND)
+ Person editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND)
.build();
uniquePersonList.setPerson(ALICE, editedAlice);
UniquePersonList expectedUniquePersonList = new UniquePersonList();
diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
index 83b11331cdb..50715d7650d 100644
--- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
+++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java
@@ -12,7 +12,6 @@
import org.junit.jupiter.api.Test;
import seedu.address.commons.exceptions.IllegalValueException;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
@@ -27,7 +26,6 @@ public class JsonAdaptedPersonTest {
private static final String VALID_NAME = BENSON.getName().toString();
private static final String VALID_PHONE = BENSON.getPhone().toString();
private static final String VALID_EMAIL = BENSON.getEmail().toString();
- private static final String VALID_ADDRESS = BENSON.getAddress().toString();
private static final List VALID_TAGS = BENSON.getTags().stream()
.map(JsonAdaptedTag::new)
.collect(Collectors.toList());
@@ -41,14 +39,14 @@ public void toModelType_validPersonDetails_returnsPerson() throws Exception {
@Test
public void toModelType_invalidName_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = Name.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullName_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -56,14 +54,14 @@ public void toModelType_nullName_throwsIllegalValueException() {
@Test
public void toModelType_invalidPhone_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_TAGS);
String expectedMessage = Phone.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullPhone_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@@ -71,39 +69,24 @@ public void toModelType_nullPhone_throwsIllegalValueException() {
@Test
public void toModelType_invalidEmail_throwsIllegalValueException() {
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS);
+ new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_TAGS);
String expectedMessage = Email.MESSAGE_CONSTRAINTS;
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
@Test
public void toModelType_nullEmail_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS);
+ JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_TAGS);
String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName());
assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
}
- @Test
- public void toModelType_invalidAddress_throwsIllegalValueException() {
- JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS);
- String expectedMessage = Address.MESSAGE_CONSTRAINTS;
- assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
- }
-
- @Test
- public void toModelType_nullAddress_throwsIllegalValueException() {
- JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS);
- String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName());
- assertThrows(IllegalValueException.class, expectedMessage, person::toModelType);
- }
-
@Test
public void toModelType_invalidTags_throwsIllegalValueException() {
List invalidTags = new ArrayList<>(VALID_TAGS);
invalidTags.add(new JsonAdaptedTag(INVALID_TAG));
JsonAdaptedPerson person =
- new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags);
+ new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, invalidTags);
assertThrows(IllegalValueException.class, person::toModelType);
}
diff --git a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
index 4584bd5044e..60f8b888d12 100644
--- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
+++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java
@@ -5,7 +5,6 @@
import java.util.stream.Stream;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -35,7 +34,6 @@ public EditPersonDescriptorBuilder(Person person) {
descriptor.setName(person.getName());
descriptor.setPhone(person.getPhone());
descriptor.setEmail(person.getEmail());
- descriptor.setAddress(person.getAddress());
descriptor.setTags(person.getTags());
}
@@ -63,14 +61,6 @@ public EditPersonDescriptorBuilder withEmail(String email) {
return this;
}
- /**
- * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building.
- */
- public EditPersonDescriptorBuilder withAddress(String address) {
- descriptor.setAddress(new Address(address));
- return this;
- }
-
/**
* Parses the {@code tags} into a {@code Set} and set it to the {@code EditPersonDescriptor}
* that we are building.
diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java
index 5eff412178b..1f99937b467 100644
--- a/src/test/java/seedu/address/testutil/PersonBuilder.java
+++ b/src/test/java/seedu/address/testutil/PersonBuilder.java
@@ -3,7 +3,6 @@
import java.util.HashSet;
import java.util.Set;
-import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
@@ -24,14 +23,12 @@ public class PersonBuilder {
private Name name;
private Phone phone;
private Email email;
- private Address address;
private Set tags;
public PersonBuilder() {
name = new Name(DEFAULT_NAME);
phone = new Phone(DEFAULT_PHONE);
email = new Email(DEFAULT_EMAIL);
- address = new Address(DEFAULT_ADDRESS);
tags = new HashSet<>();
}
@@ -42,7 +39,6 @@ public PersonBuilder(Person personToCopy) {
name = personToCopy.getName();
phone = personToCopy.getPhone();
email = personToCopy.getEmail();
- address = personToCopy.getAddress();
tags = new HashSet<>(personToCopy.getTags());
}
@@ -62,14 +58,6 @@ public PersonBuilder withTags(String ... tags) {
return this;
}
- /**
- * Sets the {@code Address} of the {@code Person} that we are building.
- */
- public PersonBuilder withAddress(String address) {
- this.address = new Address(address);
- return this;
- }
-
/**
* Sets the {@code Phone} of the {@code Person} that we are building.
*/
@@ -87,7 +75,7 @@ public PersonBuilder withEmail(String email) {
}
public Person build() {
- return new Person(name, phone, email, address, tags);
+ return new Person(name, phone, email, tags);
}
}
diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java
index 90849945183..4491dbfe4dc 100644
--- a/src/test/java/seedu/address/testutil/PersonUtil.java
+++ b/src/test/java/seedu/address/testutil/PersonUtil.java
@@ -33,7 +33,6 @@ public static String getPersonDetails(Person person) {
sb.append(PREFIX_NAME + person.getName().fullName + " ");
sb.append(PREFIX_PHONE + person.getPhone().value + " ");
sb.append(PREFIX_EMAIL + person.getEmail().value + " ");
- sb.append(PREFIX_ADDRESS + person.getAddress().value + " ");
person.getTags().stream().forEach(
s -> sb.append(PREFIX_TAG + s.tagName + " ")
);
@@ -48,7 +47,6 @@ public static String getEditPersonDescriptorDetails(EditPersonDescriptor descrip
descriptor.getName().ifPresent(name -> sb.append(PREFIX_NAME).append(name.fullName).append(" "));
descriptor.getPhone().ifPresent(phone -> sb.append(PREFIX_PHONE).append(phone.value).append(" "));
descriptor.getEmail().ifPresent(email -> sb.append(PREFIX_EMAIL).append(email.value).append(" "));
- descriptor.getAddress().ifPresent(address -> sb.append(PREFIX_ADDRESS).append(address.value).append(" "));
if (descriptor.getTags().isPresent()) {
Set tags = descriptor.getTags().get();
if (tags.isEmpty()) {
diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java
index fec76fb7129..53cc896f43c 100644
--- a/src/test/java/seedu/address/testutil/TypicalPersons.java
+++ b/src/test/java/seedu/address/testutil/TypicalPersons.java
@@ -24,35 +24,34 @@
public class TypicalPersons {
public static final Person ALICE = new PersonBuilder().withName("Alice Pauline")
- .withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com")
+ .withEmail("alice@example.com")
.withPhone("94351253")
.withTags("friends").build();
public static final Person BENSON = new PersonBuilder().withName("Benson Meier")
- .withAddress("311, Clementi Ave 2, #02-25")
.withEmail("johnd@example.com").withPhone("98765432")
.withTags("owesMoney", "friends").build();
public static final Person CARL = new PersonBuilder().withName("Carl Kurz").withPhone("95352563")
- .withEmail("heinz@example.com").withAddress("wall street").build();
+ .withEmail("heinz@example.com").build();
public static final Person DANIEL = new PersonBuilder().withName("Daniel Meier").withPhone("87652533")
- .withEmail("cornelia@example.com").withAddress("10th street").withTags("friends").build();
+ .withEmail("cornelia@example.com").withTags("friends").build();
public static final Person ELLE = new PersonBuilder().withName("Elle Meyer").withPhone("9482224")
- .withEmail("werner@example.com").withAddress("michegan ave").build();
+ .withEmail("werner@example.com").build();
public static final Person FIONA = new PersonBuilder().withName("Fiona Kunz").withPhone("9482427")
- .withEmail("lydia@example.com").withAddress("little tokyo").build();
+ .withEmail("lydia@example.com").build();
public static final Person GEORGE = new PersonBuilder().withName("George Best").withPhone("9482442")
- .withEmail("anna@example.com").withAddress("4th street").build();
+ .withEmail("anna@example.com").build();
// Manually added
public static final Person HOON = new PersonBuilder().withName("Hoon Meier").withPhone("8482424")
- .withEmail("stefan@example.com").withAddress("little india").build();
+ .withEmail("stefan@example.com").build();
public static final Person IDA = new PersonBuilder().withName("Ida Mueller").withPhone("8482131")
- .withEmail("hans@example.com").withAddress("chicago ave").build();
+ .withEmail("hans@example.com").build();
// Manually added - Person's details found in {@code CommandTestUtil}
public static final Person AMY = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)
- .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND).build();
+ .withEmail(VALID_EMAIL_AMY).withTags(VALID_TAG_FRIEND).build();
public static final Person BOB = new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)
- .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)
+ .withEmail(VALID_EMAIL_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)
.build();
public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER
From b0dd5563aa21bcac23ed3424d61e9edfbe3625b4 Mon Sep 17 00:00:00 2001
From: xuanxinng <59906064+xuanxinng@users.noreply.github.com>
Date: Tue, 3 Mar 2020 12:50:37 +0800
Subject: [PATCH 012/324] Update DeveloperGuide.adoc
---
docs/DeveloperGuide.adoc | 49 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 48 insertions(+), 1 deletion(-)
diff --git a/docs/DeveloperGuide.adoc b/docs/DeveloperGuide.adoc
index 3d65905a853..ec97c9b36e5 100644
--- a/docs/DeveloperGuide.adoc
+++ b/docs/DeveloperGuide.adoc
@@ -284,6 +284,9 @@ Refer to the guide <>.
* can type fast
* prefers typing over mouse input
* is reasonably comfortable using CLI apps
+* has a need to manage deadlines and tasks
+* has a need to manage module planning
+* is studying in NUS
*Value proposition*: manage contacts faster than a typical mouse/GUI driven app
@@ -292,9 +295,10 @@ Refer to the guide <>.
Priorities: High (must have) - `* * \*`, Medium (nice to have) - `* \*`, Low (unlikely to have) - `*`
-[width="59%",cols="22%,<23%,<25%,<30%",options="header",]
+
|=======================================================================
|Priority |As a ... |I want to ... |So that I can...
+|---------|---------|--------------|----------------
|`* * *` |new user |see usage instructions |refer to instructions when I forget how to use the App
|`* * *` |user |add a new person |
@@ -303,8 +307,26 @@ Priorities: High (must have) - `* * \*`, Medium (nice to have) - `* \*`, Low (un
|`* * *` |user |find a person by name |locate details of persons without having to go through the entire list
+|`* * *` |user |add deadline |know when to complete tasks in todo list
+
+|`* * *` |user |add module to module plan |see modules I need to take to fulfill degree requirements
+
+|`* * *` |user |show module plan |see list of modules I need to take/have taken
+
|`* *` |user |hide <> by default |minimize chance of someone else seeing them by accident
+|`* *` |user |add diary entry |record what I have done for the day
+
+|`* *` |user |delete diary entry |
+
+|`* *` |user |delete module from module plan |know which modules I have taken
+
+|`* *` |user |fetch module information |
+
+|`* *` |user |know my current CAP |
+
+|`* *` |user |sort deadlines |prioritize which tasks to finish first
+
|`*` |user with many persons in the address book |sort persons by name |locate a person easily
|=======================================================================
@@ -341,6 +363,27 @@ Use case ends.
+
Use case resumes at step 2.
+[discrete]
+=== Use case: Delete module
+
+*MSS*
+
+1. User requests to show module plan
+2. AddressBook shows module plan
+3. User requests to delete a module taken
+4. AddressBook deletes module
++
+Use case ends.
+
+*Extensions*
+[none]
+* 3a. The given module code is invalid.
++
+[none]
+** 3a1. AddressBook shows an error message.
++
+Use case resumes at step 2.
+
_{More to be added}_
[appendix]
@@ -349,6 +392,10 @@ _{More to be added}_
. Should work on any <> as long as it has Java `11` or above installed.
. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
. 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.
+. Should respond within 2 seconds
+. Should be easy to use for users who are not IT-savvy
+. User should be a current student in NUS
+
_{More to be added}_
From 6c7dad043b15d8792a68a2aca76d5000bb07b730 Mon Sep 17 00:00:00 2001
From: zhouxinwei97 <45256284+zhouxinwei97@users.noreply.github.com>
Date: Tue, 3 Mar 2020 14:00:22 +0800
Subject: [PATCH 013/324] roll back
---
.../address/logic/commands/EditCommand.java | 5 +--
.../address/logic/commands/RemarkCommand.java | 15 ++++---
.../logic/parser/AddressBookParser.java | 41 +++++++++----------
.../logic/parser/RemarkCommandParser.java | 9 ++--
.../seedu/address/model/person/Remark.java | 2 +-
.../address/storage/JsonAdaptedPerson.java | 3 +-
6 files changed, 39 insertions(+), 36 deletions(-)
diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java
index f4c8bda0680..b8371190383 100644
--- a/src/main/java/seedu/address/logic/commands/EditCommand.java
+++ b/src/main/java/seedu/address/logic/commands/EditCommand.java
@@ -17,8 +17,6 @@
import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.CollectionUtil;
-import seedu.address.logic.commands.Command;
-import seedu.address.logic.commands.CommandResult;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Address;
@@ -26,8 +24,9 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
-import seedu.address.model.tag.Tag;
import seedu.address.model.person.Remark;
+import seedu.address.model.tag.Tag;
+
/**
* Edits the details of an existing person in the address book.
diff --git a/src/main/java/seedu/address/logic/commands/RemarkCommand.java b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
index 955ec1b923f..d03d13dd34a 100644
--- a/src/main/java/seedu/address/logic/commands/RemarkCommand.java
+++ b/src/main/java/seedu/address/logic/commands/RemarkCommand.java
@@ -1,6 +1,9 @@
package seedu.address.logic.commands;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
+import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
+
+import java.util.List;
import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
@@ -8,10 +11,8 @@
import seedu.address.model.Model;
import seedu.address.model.person.Person;
import seedu.address.model.person.Remark;
-import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
-import java.util.List;
-import java.util.function.Predicate;
+
/**
* Changes the remark of an existing person in the address book.
@@ -19,8 +20,6 @@
public class RemarkCommand extends Command {
public static final String COMMAND_WORD = "remark";
- private final Index index;
- private final Remark remark;
public static final String MESSAGE_ADD_REMARK_SUCCESS = "Added remark to Person: %1$s";
public static final String MESSAGE_DELETE_REMARK_SUCCESS = "Removed remark from Person: %1$s";
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the person identified"
@@ -30,6 +29,10 @@ public class RemarkCommand extends Command {
+ "r/ [REMARK]\n"
+ "Example: " + COMMAND_WORD + " 1 " + "r/ Likes to swim.";
+
+ private final Index index;
+ private final Remark remark;
+
/**
* @param index of the person in the filtered person list to edit the remark
* @param remark of the person to be updated to
@@ -86,4 +89,4 @@ public boolean equals(Object other) {
return index.equals(e.index)
&& remark.equals(e.remark);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
index 8bb1acdfd34..de6fbde12a7 100644
--- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
@@ -44,37 +44,36 @@ public Command parseCommand(String userInput) throws ParseException {
final String commandWord = matcher.group("commandWord");
final String arguments = matcher.group("arguments");
switch (commandWord) {
+ case AddCommand.COMMAND_WORD:
+ return new AddCommandParser().parse(arguments);
- case AddCommand.COMMAND_WORD:
- return new AddCommandParser().parse(arguments);
+ case EditCommand.COMMAND_WORD:
+ return new EditCommandParser().parse(arguments);
- case EditCommand.COMMAND_WORD:
- return new EditCommandParser().parse(arguments);
+ case DeleteCommand.COMMAND_WORD:
+ return new DeleteCommandParser().parse(arguments);
- case DeleteCommand.COMMAND_WORD:
- return new DeleteCommandParser().parse(arguments);
+ case ClearCommand.COMMAND_WORD:
+ return new ClearCommand();
- case ClearCommand.COMMAND_WORD:
- return new ClearCommand();
+ case FindCommand.COMMAND_WORD:
+ return new FindCommandParser().parse(arguments);
- case FindCommand.COMMAND_WORD:
- return new FindCommandParser().parse(arguments);
+ case ListCommand.COMMAND_WORD:
+ return new ListCommand();
- case ListCommand.COMMAND_WORD:
- return new ListCommand();
+ case ExitCommand.COMMAND_WORD:
+ return new ExitCommand();
- case ExitCommand.COMMAND_WORD:
- return new ExitCommand();
+ case HelpCommand.COMMAND_WORD:
+ return new HelpCommand();
- case HelpCommand.COMMAND_WORD:
- return new HelpCommand();
+ case RemarkCommand.COMMAND_WORD:
+ return new RemarkCommandParser().parse(arguments);
- case RemarkCommand.COMMAND_WORD:
- return new RemarkCommandParser().parse(arguments);
-
- default:
- throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
+ default:
+ throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
}
}
diff --git a/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
index ed2295f8543..d4a8c8f0233 100644
--- a/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/RemarkCommandParser.java
@@ -1,12 +1,13 @@
package seedu.address.logic.parser;
+import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
+
import seedu.address.commons.core.index.Index;
import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.logic.commands.RemarkCommand;
import seedu.address.logic.parser.exceptions.ParseException;
-import static java.util.Objects.requireNonNull;
-import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK;
import seedu.address.model.person.Remark;
/**
@@ -33,4 +34,4 @@ public RemarkCommand parse(String args) throws ParseException {
return new RemarkCommand(index, new Remark(remark));
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/seedu/address/model/person/Remark.java b/src/main/java/seedu/address/model/person/Remark.java
index c8fd1193895..2e5c65280b9 100644
--- a/src/main/java/seedu/address/model/person/Remark.java
+++ b/src/main/java/seedu/address/model/person/Remark.java
@@ -30,4 +30,4 @@ public boolean equals(Object other) {
public int hashCode() {
return value.hashCode();
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
index 2229179f4d7..b7d9ceccc65 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java
@@ -38,7 +38,8 @@ class JsonAdaptedPerson {
@JsonCreator
public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
@JsonProperty("email") String email, @JsonProperty("address") String address,
- @JsonProperty("remark") String remark, @JsonProperty("tagged") List tagged) {
+ @JsonProperty("remark") String remark,
+ @JsonProperty("tagged") List tagged) {
this.name = name;
this.phone = phone;
this.email = email;
From ab2b7cfc15efa199715704d92abb96194b6f8b0e Mon Sep 17 00:00:00 2001
From: zhouxinwei97 <45256284+zhouxinwei97@users.noreply.github.com>
Date: Tue, 3 Mar 2020 14:46:37 +0800
Subject: [PATCH 014/324] Edited README.adoc, AboutUs.adoc, ContactUs.adoc and
added UI.png
---
README.adoc | 9 +-
docs/AboutUs.adoc | 48 ++++----
docs/ContactUs.adoc | 4 +-
docs/LearningOutcomes.adoc | 216 -----------------------------------
docs/WireFrame.pdf | Bin 0 -> 286840 bytes
docs/images/Ui.png | Bin 14607 -> 244854 bytes
docs/images/damithc.jpg | Bin 6910 -> 0 bytes
docs/images/lejolly.jpg | Bin 26764 -> 0 bytes
docs/images/m133225.jpg | Bin 80341 -> 0 bytes
docs/images/mpang45456.jpg | Bin 0 -> 163070 bytes
docs/images/xuanxinng.jpg | Bin 0 -> 52301 bytes
docs/images/yijinl.jpg | Bin 13946 -> 0 bytes
docs/images/yl_coder.jpg | Bin 7203 -> 0 bytes
docs/images/zhouxinwei97.jpg | Bin 0 -> 113048 bytes
14 files changed, 28 insertions(+), 249 deletions(-)
delete mode 100644 docs/LearningOutcomes.adoc
create mode 100644 docs/WireFrame.pdf
delete mode 100644 docs/images/damithc.jpg
delete mode 100644 docs/images/lejolly.jpg
delete mode 100644 docs/images/m133225.jpg
create mode 100644 docs/images/mpang45456.jpg
create mode 100644 docs/images/xuanxinng.jpg
delete mode 100644 docs/images/yijinl.jpg
delete mode 100644 docs/images/yl_coder.jpg
create mode 100644 docs/images/zhouxinwei97.jpg
diff --git a/README.adoc b/README.adoc
index e36efe534bb..13426d6d954 100644
--- a/README.adoc
+++ b/README.adoc
@@ -1,7 +1,7 @@
-= Address Book (Level 3)
+= NusProductivity
ifdef::env-github,env-browser[:relfileprefix: docs/]
-https://travis-ci.org/se-edu/addressbook-level3[image:https://travis-ci.org/se-edu/addressbook-level3.svg?branch=master[Build Status]]
+https://travis-ci.org/AY1920S2-CS2103T-W16-4/main/[image:https://travis-ci.org/AY1920S2-CS2103T-W16-4/main.svg?branch=master[Build Status]]
https://ci.appveyor.com/project/damithc/addressbook-level3[image:https://ci.appveyor.com/api/projects/status/3boko2x2vr5cc3w2?svg=true[Build status]]
https://coveralls.io/github/se-edu/addressbook-level3?branch=master[image:https://coveralls.io/repos/github/se-edu/addressbook-level3/badge.svg?branch=master[Coverage Status]]
https://www.codacy.com/app/damith/addressbook-level3?utm_source=github.com&utm_medium=referral&utm_content=se-edu/addressbook-level3&utm_campaign=Badge_Grade[image:https://api.codacy.com/project/badge/Grade/fc0b7775cf7f4fdeaf08776f3d8e364a[Codacy Badge]]
@@ -16,14 +16,12 @@ image::images/Ui.png[width="600"]
endif::[]
* This is a desktop Address Book application. It has a GUI but most of the user interactions happen using a CLI (Command Line Interface).
-* It is a Java sample application intended for students learning Software Engineering while using Java as the main programming language.
-* It is *written in OOP fashion*. It provides a *reasonably well-written* code example that is *significantly bigger* (around 6 KLoC)than what students usually write in beginner-level SE modules.
+* This app is intended for NUS students to organise and plan for school related stuff, such as module and module deadlines.
== Site Map
* <>
* <>
-* <>
* <>
* <>
@@ -32,5 +30,6 @@ endif::[]
* Some parts of this sample application were inspired by the excellent http://code.makery.ch/library/javafx-8-tutorial/[Java FX tutorial] by
_Marco Jakob_.
* Libraries used: https://openjfx.io/[JavaFX], https://github.com/FasterXML/jackson[Jackson], https://github.com/junit-team/junit5[JUnit5]
+* Code modified from AddressBook-Level3 project created by SE-EDU initiative at https://se-education.org
== Licence : link:LICENSE[MIT]
diff --git a/docs/AboutUs.adoc b/docs/AboutUs.adoc
index 458e6134f45..3eee7075543 100644
--- a/docs/AboutUs.adoc
+++ b/docs/AboutUs.adoc
@@ -4,53 +4,49 @@
:imagesDir: images
:stylesDir: stylesheets
-AddressBook - Level 3 was developed by the https://se-edu.github.io/docs/Team.html[se-edu] team. +
-_{The dummy content given below serves as a placeholder to be used by future forks of the project.}_ +
+NusProductivity - developed by team W-16-4 +
+_{Work in progress}_ +
{empty} +
We are a team based in the http://www.comp.nus.edu.sg[School of Computing, National University of Singapore].
== Project Team
-=== John Doe
-image::damithc.jpg[width="150", align="left"]
-{empty}[http://www.comp.nus.edu.sg/~damithch[homepage]] [https://github.com/damithc[github]] [<>]
+=== Zhou Xinwei
+image::zhouxinwei97.jpg[width="150", align="left"]
+{empty} [https://github.com/zhouxinwei97[github]] [<>]
-Role: Project Advisor
+Role: # To be updated
'''
-=== John Roe
-image::lejolly.jpg[width="150", align="left"]
-{empty}[http://github.com/lejolly[github]] [<>]
+=== Ng Xuan Xin
+image::xuanxinng.jpg[width="150", align="left"]
+{empty}[http://github.com/xuanxinng[github]] [<>]
-Role: Team Lead +
-Responsibilities: UI
+Role: # To be updated
'''
-=== Johnny Doe
-image::yijinl.jpg[width="150", align="left"]
-{empty}[http://github.com/yijinl[github]] [<>]
+=== Max Pang
+image::mpang45456.jpg[width="150", align="left"]
+{empty}[http://github.com/mpang45456[github]] [<>]
-Role: Developer +
-Responsibilities: Data
+Role: # To be updated
'''
-=== Johnny Roe
-image::m133225.jpg[width="150", align="left"]
-{empty}[http://github.com/m133225[github]] [<>]
+=== Kang Wang Kai
+image::kangwkk.jpg[width="150", align="left"]
+{empty}[http://github.com/kangwkk[github]] [<>]
-Role: Developer +
-Responsibilities: Dev Ops + Threading
+Role: # To be updated
'''
-=== Benson Meier
-image::yl_coder.jpg[width="150", align="left"]
-{empty}[http://github.com/yl-coder[github]] [<>]
+=== Chen Jiang Wei
+image::watsheldon.jpg[width="150", align="left"]
+{empty}[http://github.com/watsheldon[github]] [<>]
-Role: Developer +
-Responsibilities: UI
+Role: # To be updated
'''
diff --git a/docs/ContactUs.adoc b/docs/ContactUs.adoc
index 81be279ef6d..a76bb32233d 100644
--- a/docs/ContactUs.adoc
+++ b/docs/ContactUs.adoc
@@ -2,6 +2,6 @@
:site-section: ContactUs
:stylesDir: stylesheets
-* *Bug reports, Suggestions* : Post in our https://github.com/se-edu/addressbook-level3/issues[issue tracker] if you noticed bugs or have suggestions on how to improve.
+* *Bug reports, Suggestions* : Post in our https://github.com/AY1920S2-CS2103T-W16-4/main/issues[issue tracker] if you noticed bugs or have suggestions on how to improve.
* *Contributing* : We welcome pull requests. Follow the process described https://github.com/oss-generic/process[here]
-* *Email us* : You can also reach us at `damith [at] comp.nus.edu.sg`
+* *Email us* : You can also reach us at `zhou.xinwei [at] u.nus.edu`
diff --git a/docs/LearningOutcomes.adoc b/docs/LearningOutcomes.adoc
deleted file mode 100644
index 436c1777617..00000000000
--- a/docs/LearningOutcomes.adoc
+++ /dev/null
@@ -1,216 +0,0 @@
-= Learning Outcomes
-:site-section: LearningOutcomes
-:toc: macro
-:toc-title:
-:toclevels: 1
-:imagesDir: images
-:stylesDir: stylesheets
-ifdef::env-github[]
-:note-caption: :information_source:
-endif::[]
-
-After studying this code and completing the corresponding exercises, you should be able to,
-
-toc::[]
-
-== Utilize User Stories `[LO-UserStories]`
-
-=== References
-
-* https://se-edu.github.io/se-book/specifyingRequirements/userStories/[se-edu/se-book: Requirements: Specifying Requirements: User Stories]
-
-=== Exercise: Add more user stories
-
-* Assume you are planing to expand the functionality of the AddressBook (but keep it as a CLI application).
-What other user stories do you think AddressBook should support? Add those user stories to the `DeveloperGuide.adoc`.
-
-== Utilize use cases `[LO-UseCases]`
-
-=== References
-
-* https://se-edu.github.io/se-book/specifyingRequirements/useCases/[se-edu/se-book: Requirements: Specifying Requirements: Use Cases]
-
-=== Exercise: Add a 'Rename tag' use case
-
-* Add a use case to the `DeveloperGuide.adoc` to cover the case of _renaming of an existing tag_.
-e.g. rename the tag `friends` to `buddies` (i.e. all persons who had the `friends` tag will now have
-a `buddies` tag instead)
-Assume that AddressBook confirms the change with the user before carrying out the operation.
-
-== Use Non Functional Requirements `[LO-NFR]`
-
-=== References
-
-* https://se-edu.github.io/se-book/requirements/nonFunctionalRequirements/[se-edu/se-book: Requirements: Non-Functional Requirements]
-
-=== Exercise: Add more NFRs
-
-* Add some more NFRs to the `DeveloperGuide.adoc`
-
-== Use Polymorphism `[LO-Polymorphism]`
-
-Note how the `Command::execute()` method shows polymorphic behavior.
-
-=== References
-
-* https://se-edu.github.io/se-book/oop/polymorphism/[se-edu/se-book: Paradigms: OOP: Polymorphism]
-* https://se-edu.github.io/se-book/cppToJava/inheritance/polymorphism/[se-edu/se-book: C++ to Java: OOP: Polymorphism]
-
-=== Exercise: Add a polymorphic `isMutating` method
-
-* Add a method `boolean isMutating()` to the `Command` class. This method will return `true` for
-command types that mutate the data. e.g. `AddCommand`
-* Currently, AddressBook data are saved to the file after every command.
-Take advantage of the the new method you added to limit file saving to only for command types that mutate data.
-i.e. `add` command should always save the data while `list` command should never save data to the file.
-
-[NOTE]
-====
-There may be better ways to limit file saving to commands that mutate data. The above approach, while not
-optimal, will give you chance to implement a polymorphic behavior.
-====
-
-== Use abstract classes/methods `[LO-Abstract]`
-
-=== References
-
-* https://se-edu.github.io/se-book/oop/inheritance/abstractClasses/[se-edu/se-book: Paradigms: OOP: Abstract Classes]
-* https://se-edu.github.io/se-book/cppToJava/inheritance/abstractClassesAndMethods/[se-edu/se-book: C++ to Java: OOP: Abstract Classes]
-
-=== Exercise: Make `Command#execute()` method abstract
-
-* Make the `Command#execute()` method abstract (hint: refer to the comment given below the method)
-
-== Use interfaces `[LO-Interfaces]`
-
-Note how the `AddressBook` class implements the `ReadOnlyAddressBook` interface so that clients who don't need write access to the `AddressBook` can access the `AddressBook` through the `ReadOnlyAddressBook` interface instead.
-
-image::ReadOnlyAddressBookUsage.png[width=500]
-
-=== References
-
-* https://se-edu.github.io/se-book/oop/inheritance/interfaces/[se-edu/se-book: Paradigms: OOP: Abstract Interfaces]
-* https://se-edu.github.io/se-book/cppToJava/inheritance/interfaces/[se-edu/se-book: C++ to Java: OOP: Abstract Interfaces]
-
-=== Exercise: Add a `Printable` interface
-
-* Add a `Printable` interface as follows.
-+
-image::PrintableInterface.png[width=400]
-* `Override` the `getPrintableString` in classes `Name`, `Phone`, `Email`, and `Address` so that each produces a printable string representation of the object. e.g. `Name: John Smith`, `Phone: 12349862`
-* Add the following method in a suitable place of some other class. Note how the method depends on the Interface.
-+
-[source,java]
-----
-/**
- * Returns a concatenated version of the printable strings of each object.
- */
-String getPrintableString(Printable... printables) {
-----
-+
-The above method can be used to get a printable string representing a bunch of person details.
-For example, you should be able to call that method like this:
-+
-[source,java]
-----
-// p is a Person object
-return getPrintableString(p.getPhone(), p.getEmail(), p.getAddress());
-----
-
-== Follow Liskov Substitution Principle `[LO-LSP]`
-
-=== References
-
-* https://se-edu.github.io/se-book/principles/liskovSubstitutionPrinciple/[se-edu/se-book: Principles: Liskov Substitution Principle]
-
-=== Exercise: Add an exception to an overridden method
-
-* Add a `throws Exception` clause to the `AddCommand::execute` method. Notice how Java compiler will not allow it,
-unless you add the same `throws` clause to the parent class method. This is because if a child class throws
-an exception that is not specified by the Parent's contract, the child class is no longer substitutable in place of
-the parent class.
-* Also note that while in the above example the compiler enforces LSP, there are other situations where it is up to
-the programmer to enforce it. For example, if the method in the parent class works for `null` input, the overridden
-method in the child class should not reject `null` inputs. This will not be enforced by the compiler.
-
-== Use Java-FX for GUI programming `[LO-JavaFx]`
-
-=== References
-
-* https://se-edu.github.io/se-book/javaTools/javaFXBasic/[se-edu/se-book: Tools: Java: JavaFX: Basic]
-
-=== Exercise: Enhance GUI
-
-* Do some enhancements to the AddressBook GUI. e.g. add an application icon, change font size/style
-
-== Analyze Coupling and Cohesion of designs `[LO-CouplingCohesion]`
-
-* Notice how having a separate `ParserUtil` class to handle user input validation, space trimming etc. of model data (an application of the Single Responsibility Principle) improves the _cohesion_ of the model component (since it does not need to be concerned with handling user input) as well as the `ParserUtil` class.
-
-=== References
-
-* https://se-edu.github.io/se-book/designFundamentals/coupling/[se-edu/se-book: Design: Design Principles: Coupling]
-* https://se-edu.github.io/se-book/designFundamentals/cohesion/[se-edu/se-book: Design: Design Principles: Cohesion]
-
-=== Exercise: Identify places to reduce coupling and increase cohesion
-
-* Where else in the design coupling can be reduced further, or cohesion can be increased further?
-
-[[apply-dependency-inversion-principle-lo-dip]]
-== Apply Dependency Inversion Principle `[LO-DIP]`
-
-* Note how the `LogicManager` class doesn't depend on `StorageManager` directly, but rather the interface `Storage`.
-This is an application of the Dependency Inversion Principle.
-+
-image::LogicStorageDIP.png[width=300]
-* Where else in the code do you notice the application of DIP?
-
-=== References
-
-* https://se-edu.github.io/se-book/principles/dependencyInversionPrinciple/[se-edu/se-book: Principles: Dependency Inversion Principle]
-
-== Use Dependency Injection `[LO-DI]`
-
-Notice how the `LogicManager` class does not depend on the `StorageManager` class, but depends on the `Storage` interface.
-This allows us to use _Dependency Injection_ to test the `LogicManager` class without getting the `StorageManager` class involved.
-
-=== References
-
-* https://se-edu.github.io/se-book/testing/dependencyInjection/[se-edu/se-book: Quality Assurance: Testing: Dependency Injection]
-
-=== Exercise: Facilitate injecting a StorageStub
-
-* Notice how `LogicManagerTest` tests `LogicManager` by constructing a `StorageManager` object.
-* Implement `StorageStub` such that calls to its `save*` methods do nothing (i.e. empty method body).
-* Update `LogicManagerTest` to work with the `StorageStub` instead of the actual `StorageManager` object.
-i.e. `LogicManagerTest` injects a `StorageStub` object when constructing a `LogicManager` before testing it.
-+
-image::DependencyInjection.png[width=600]
-* The example above uses <> as a means to achieve DI.
-Note that there is another way to inject a `StorageStub` object, as shown below.
-In this case we do not apply the DIP but we still achieve DI.
-+
-image::DependencyInjectionWithoutDIP.png[width=250]
-
-== Apply Open-Closed Principle `[LO-OCP]`
-
-=== References
-
-* https://se-edu.github.io/se-book/principles/openClosedPrinciple/[se-edu/se-book: Principles: Open-Closed Principle]
-
-=== Exercise: Analyze OCP-compliance of the `LogicManager` class
-
-* Consider adding a new command to the Address Book. e.g. an `edit` command. Notice how little you need to change in the `LogicManager` class to extend its behavior so that it can execute the new command.
-That is because `LogicManager` follows the OCP i.e. `LogicManager` is _open to be extended_ with more commands but _closed for modifications_.
-* Is it possible to make the `AddressBookParser` class more OCP-compliant in terms of extending it to handle more
-command types?
-* In terms of how it saves data, is `LogicManager` more OCP-compliant
-due to the application of DIP as given in <>?
-How can you improve ``LogicManager``'s OCP-compliance further so that it can not only work with different types
-of storages, but different number of storages (e.g. save to both a text file and a database).
-
-== Work in a 3KLoC code base `[LO-3KLoC]`
-
-=== Exercise: Enhance AddressBook
-
-* Enhance AddressBook in some way. e.g. add a new command
diff --git a/docs/WireFrame.pdf b/docs/WireFrame.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..52619bd2ce906de1133a237d84671ed29a34de76
GIT binary patch
literal 286840
zcmeFY2Ut_vwm%vRDkx|I0jbhUXi^foD7|AKp%)272-O6l6vc*gkrFy69TGYQ2neEt
z4$?a)RYi(`QY`3;`|Ptf-m~|8|9j8A=l;L<&f@#Xnsco+#vEgg@mph#IhMdh4J~mg
z2^l&W?z7z9C^Vh2vLwRa$C+F5qQhlpI_iInvzITo6!oeJour8~*4q!`=#1r-{#%Ek
zvy+>Hn)fws>$B7j7)(Jz8paJhD^LBgrIS?m_VT4Zjpdg8are1%bk1H*KY09T{>sb1
z+3T{eD>qb{dKK%7adz;eJ1Zf5misE*S#E8*D}N{XgZkgda-WqrOKtu5=jh2Tse6`N
z!=|7Q2;ddT?
zy*yGs>}8+9{nGxcB$D|PiKKow$*)ZQ2SobC<9_!csUPjXN+j7o6X|~x6{P+HEd0{`
zt3-nSnMl8@?e|H-(n;#OIbpf2f5>aX{R2BpxPN$@3HJ{>HR1kcZmB==TT)>4QDElQG>)^gE$#^
zn2hZ2aoqQ@?=yf?dRn?#fCC2rfCJP&!1qajI^fX3AIFdXhp5NlBZq$+$BrDKIYN7k
zj*j*iEiK)NlPBnoGaRR-r3cb8oIG_3c#7@>h!J#(k$QgW2ay9mo;-B;81=zZ$7zpK
zd;g2a_a*@F*ulI*L5B|T0uBNX90DHrP62TK80x`82Yw9r*W>8nW7L5iI{4!<@)Y2}
z!NUg+AEBo`a+v1u0UD}U2M-;lIdT*TI?aPW29`pY4>B_G%3pw+`Nmg0?jK-bm4=x(
z_$A~q^T}Pokz~|Rclp&FG52I|-HtV-70}44q>^Q(^820PFMJOir1rA_|KY*`An5x9
z;KU*7D1nE709C-2!QTh^ul+sfcGYY{FA(%-97fZO?q7TaXGf+)T0Als%GL_Z=cGUV
zqD4vKK|hfEx^R!Ub3p%ar9RWU4FMCpkNPcxvO$R=C0zEnFegcp(~*x?JxE2aqHi3;
zq$S~=`_?@-MOAFHyceYnwjD_9vFoUH%6-SE%O_+LIT6VtC0&f2qy@%~I1mckoZdWh
z2b+qE7bRciHsr5(c}G=>QIqKti*<%lNxTFVdW~h8=03|rbXf?$_@+L_O#hPDtl~7
zG4vR+<>Z4j4@?zQ@I{m^>ARFU
zO-Y;h(dNd+mujwRK1fb6Q&_zl*1mjp7~xonogqaOB_S6#KchUvDHG&q+16pVnOGovMPA_8Cr>n-aS~crhm;;)8CPkT{uwGe31CQz8X{*^j2dc8dJ0z>mR
zYfGZ3Wz6hn=xmE`Mmt_QuQ`But9Gw7yIx#CTfrCGp-8!Rc$#<>zKpcue6SQD(EhG@
z%{iPIMM5NEbDU}3?b5GaKhok3FJcn~^JMd?8|kkfwEE0Rx->IwGSy;zJD$fNBibZ{
z%Z0z!@otd%62Imo7%pdaf^v=>&(eTbW&jYm-{opY{PcD`t-}-
zRd)wcHxh}iKF%X$suD3Qe3PNL%j(gTab!TT+l~I~M>xfKmXs>D&AQL=mRdUJWG_r+
z`tK_96VwlS4c8ZL5lR@^eOo{aehxd*lt?Kng1$n3ZDr@Qx;Fg>bw4H
z<`#fHN>>Ut@3|Ay(p;<wLV6E)(E|*b)MPtw+8g@)Gn|B{!N;yoqsFj-xl(#+x=heGJL=J_J7sU
zt@(Fde8TXlp;BDCcVMjw;66SRr~VjY5RnHu9xTM0_Wq7V%yH(kFJrDt8w&9DHV3*0
z^dn6;T)nYeVZ_d9K|;Y)p}%~9Zc|yqX80S^mwoFJH}|2aa?fn|EB33w<=eCvY0FyF
z)z;}(D=N2bqHZ2};p1FYKJw^WIJE2b>2Z(_~nNt}2Umr`V1ybc+g9K*03;=6cmUlH=4_J%)k{~woR5q>B2{nq}ZS)krzA?+*nBDioF!#
z)av@R;KWPlbx@?b?+B`|m7p=NqgY_vpaum>fQ
zwS5E!%K;No$TB_cjr^t!a<@x%%k->E167jPI=0`h%o7NBae7X1PI`KJvFgSA!%pm~
zXAX$qR+L2wtz;6N)njuSoF_H
z=rS?C5`Zoey|g{W4McBubk5<>pk71sMH$wb42DyAN=S9-du4!O=<4qEJv)9m4hh#oMz
z8^sy1TkGogF8wsFrGYM1yWqU8uCQL%QdoI^=VGK3P?Zv~h#{2m;h=?KLyB(?4H(f}
zf1hBin7JLA>6sblBlDF#7N4pkm3ca~*dx``)yo$HX!%-kDXhw5V24_~ZDL0f+!F78pB{`H%
z+=}6T!ci%X!V0d)++mF#EOMMguL==T0hA152
zf1*Y1aRO^#KOhjA2Jy}9n8<6@sBKEv$PLli6*s*QH{QlqbtyDMbx{KMD63&u$R3MC
z4;Xztqw&y106X4&s#fXpys0~Li_2iPVMz)M@A{bhx;g<5wLrIHdcz7wC0fQ_+Qhr~
zr+&ivM72&f#uNqA))5aJcjLWgw5MWNA!_kSGNw-|vHy-ICHam;q$G1*
zmg(K%yF(VVVnz9-J>+14FV*jS4qYw_SS@W8u9Thyf#;kBuu|)ZYgw<<2*-!N+cCr{uLY=TD|zVQ?!;bQ&OTuEZGhKh%^N
z=o07eO&EM|q^I9uQeOQw3yok_7!HrC0L|qNTk~lWnp3bd7n1K0v+HFu;yDQ6nGsIJ
z#LKV011f#WPHn(SBB4`GHCdKhI?9e9Gm}S@;+z3GsKBJyYjXRlVE#0Cd}ckr3IKaK
zQ92G~zU0>{5;R$f!QGkfL^wmh7H2PCa(gPM&^J|-24_#LM|t)>m@7|RFBiRfgJ*VY
z@5-RF`1qIbQOa0XNyspzf$A
zAI_-ItPk+E>O5eqb413Ny>0}zj|^s1mXa!$*NHtfu6WYjQK*0@C{jvn(N0?w*kdz@
z2QwXib=>XCje-0DpVqz`Q6)w=)apZx9&(-Y3kxyC1|M=#nN@BLn*PQ+ZKOWzs>aqd
zM$1WeX(uQ1L0S$2I~>T?DhKUH^YZdu{tlQ(Kef-j{>f90o*d0QbN2^M?lmVGK?3o#L%S`dJPRX>#P!i9KUFgO=NKM*TEo^*L~J-x6j
zIXP^ow;FFX3KI=(HY2f4WoLH*s9=&k>6@A^yd83#q^F`rXQ;PrkOqZB5F!schgVcs
z6c(jkl`u%3j*Ro`190twj}IOn<8RpqE;7C-Xvmte-7lekS~FuKZ0$S1VFk3{ROLf?
zA6@@+EbuUyb>CeF&bK{L&2jJ&8}-n?;et^)mom|CkAHq*_r*$FUv|B&)kyXZ9Ly+~
z-~BY1aed!|)KlCE<(h@ku5aTcG@MU8p?HM9XyX-4dn`MHEKaI(7=h4sTI`ZV^fu+3
zTKyzy^c_GhvGUOA7Z4r}p9nhIiV@RRzr(qLCc}Z?ai~lOP-dN*Gw5d)oOe!&e-f?y
z4yg9DO3>+B6orOEg04Qp@M|?kb4FoENHB0*0n-DPSr?`#-Ow9+y5??{29nj)gQ9Q`
z4{W4I0{dp#0@+Ft8k#smgG~*Cug8ws|IC8s;D_eV(E7V$*y|kzFV1CMz4FvsJz~4~
z^mU>%^-T)mgPXz##K-9?qwx}IH}*Yy@RtAV9^3SD4~52s{L5!9*4MtO$!ZBSJ8^C}
z#Y6adIIyrN4T+pE!nt=OasRBli;~K!Io7p?p>k6R-Sh8QuCi}`lrKX+3!SJE4>?)E
z3kA!d3H7=!diQfZwFpE(4%gqB$vrVCnB^Ad9l7b!5P
z=DL_8TF)mtK}g|?g&x?O(+Sl@9SOR%DBkt6@QSrfZpTb8(vzjga
zbB;FuhRwdT$F7`RvF_s+OWraOtF6q1O|ifMC95~k(ty@LJTI@DS40l30F%j~Z&YBJx9*wO
zl7o7Vlojfh3#$(
z@f;{9c%-H)Od=1Z1fsOiEnc43*dCNd*wmmpR8vEK>)BT*q2C%RUsGD5~pt$p$Wi;x$?2aM5LDnIs&y
z!EJ2NW?2+8)nd`X#+R0tJB;(t+RSz$yOdu90F*N6z5`grRNtZPN$RJEzdAitEh1zN
zpSo1G5!d`JKko}dD%!qP|HJ3hqE$Fx=_UZcF7T|{MEsU(_uO3yM6tCLF#~tDG%4z6
zCpn$|7_>a`DY;nNB~`57%RLq2OgdzJp`r!{v^s5U&>+!ud-M*b(qt|vHn+1SE&8A(
zzaxn+*JJVJD1^vTLGpbJhns8qGYrN&cIQo!vTae^ORPC@b*Kp8=1-f_zJ95*$@27-
z%pI|#6`#?Ok0J;qnjOC859oDiMo+&SOBd$^KA38)tI$HYldUrDS)=wA6)WsKhl5bl
z;U|Hmsg$7rL%2ZUaFJOa1i3yndYN`v1_R$6U$$P+P8L^Z`1WfixY09m)On_S3Ve)A<_V2hEfN
zLeLm=jBb)ev^jrs-mF5!Yu+{;uMTb{0qo<)EXrL$rN_sC3v0@X+1q;8kC07j-tbDF
zxE2cxdutrF{X7U^kt)$QUXT{A{~d5i)`$I!PL&Vyn|jxgDY=WRrq^F|7>Q?7N))OP
zZ(K&Dm33Qd)I`BR-&qCVIKef)MZw+ss80=WzS$!$?~4*cN?>=NV{ZCain&q8^Tcp4
zaGCXee;ARTQ8#R8Es5VSJiwp@HKOYIq^
zp6G{X0Nldm9+n6QQzZ!Sfvu_a*RH`wuXb7kbf>KR1B5RB=CCRJ*X%
z-7bZMEaxbU$YdHb7cZ8t5oNyq#>cY4TEq<{D%`i2Rl%s2#5q{lk#bo`Xlj0Jq12!4+!^VlGYmw`aS<61&P%jlEME7(lJux%f6t4(W!vKw*;j=N
zU%!sb2s6WRs1@2;;QiVsMc8ofV{}6g5@pPsh^(}-*$PU!yqXppuu?C?y&=Qs^#cU%
zu{wdWXYWc>O>!+(a%}J{NSjXzO1FtB`m1Dt+btfnr{6x9&ArjRb?@bv!E{chrGyh`
zHn*qGokS
zIEBY?yEn<%O(!KJ)~t5RB__u38Qv1WiB204h6Fg-_|u!Spzn3C$3}_Y;$zzvdL4bO
z)6Anlw-(Kt7$e_|}g-8Rz*3rB)wdf>XL`hF*
zSTyVOq6`V-Qk^IG5Eln%kCzr{b*x_$=c%{rWc2)g^6ld9fbBMwKC7Kv`BHbTsnkUc
zq=vzV2?CoJUC*qyC9+!($2W;f6Za<{PZeO`&k^Elaq6ZC8Mj!}SqqGlG3CcaDgV0U&ZH}I4y8DI;6O2gfrMNvV*PTob&IuzXQ;Toja9W&w%FNoIab~
z-G~vm5SwGNFh@zEE+X9L&SPgGO;mZmFh^j@AcQg&TgoKiiwB+I)|Hm);%F%dJkcsm
zGQYharx`IKSCNA^{Yu!bQ3Vd(t#dVYA81UBH%_^B*kJAQ0I+dM~2YRqpkta2+
zB2ww5>&<1p_&A;unA+?RL6Y&stF?Z|?#CzG5(3E%0)esFl$)*R#I)Y#8wHTza2Dkk
z34r%3Fz6g|Rz0pp?XOU7DuD~auHvH)2G|XiPzt1T-!i0F
z_+*iLEhGo;7QTTZ$x7asqKBcfN+({Z&OII?=4SYGJWC4t%9fL*56`^>9ej|TYo?6|
zr75hC?FZY`+a?DvT2luVo+rNKpO*Sy0PhZ{XokEDBeAZ~pYb{wU^NllHw?cOK=kuQ+Qjdb}#jh*wQ
z!krgxiA_eFxF)?Bw<#6^HAqN7J-@js%w`x#+rCpVX|?0>ab12-iL1g&z$(isg`Cx6
zh-9`Mv?UoP#L)50IFF%l!VePJQ8N4;t7xV7ihx6zC9kg9wq32;D?ysMJlS1$v4xd8
zkj(h`(NYuiXc?4LC8LyF6Xp*H_@+_!93vG1AI3XqV?v`fY8Lkt|
zEoNl6Y`nggHCFNLp*llHL4Kpj4e_G17$Xzec##Sef9~P5NZ~e@v6HDp$yH<43P^=oq}Py_W~7LWIGvFTuikm5q3$P=>$6%Z?jTt+q4B_Bh6KRsma+{6
zGGIebnBuJL%HkF<B7
zq=>s6H-b%(Dg^Fl_VWUvdxrYkg^p}bqmtfiK}{#J4-8TRsd2BljQ8#X?B0VAlh~s2
zd=t!xJgpQ_Rl38znnoS8RcGh;}+R^aJ!C|Yr)@e0!BRT5H8JLAxK$Qr-HZA?6C0tph`j$
zF75RF9s;pOd9*o26>xQIcR2!BAn<0~9*>U}htE5$LJZQ0s29PX=3z{N)iT?qV_|Dl
zi}1*Vy!!a*T4f~*hb2y{Sm63H-3eHI&3C}p_64uF;E4#TRTcu?f7soM7(QY;+xR+E
ztkYIMdXb&aFd<$Co1(zUB78P2w{-AEoP_JDz<{PILz}YkJlk~>yP3pUeW(pno+vJYag`$+cCaRMEvsVmeyJ6hN5-(>aP6&1DX*_I+
z3?EBjl!vpG1Y!apo|=eWvB4%6xD@kNjb~~`hGtnSK4*BYIa&cSA_d<#U04!mQ&{R4
zuUT(ZNQ}GO?$>nmTJgM{;AozSNgn3)a7t2oH0W@`lVepys~~C9TM?g*ccaj*=Bgc`Nl619YC(4$X{mzWG*^o_BQ;$QEN054Cyl_B_LP
zfKZHli4dD?+p3b_TkHndM^}D43OBzFBQ9bTZm?dg^zuN1A&ZU_rsx385J2e
z91bN$p-{9nBbh~q--qo;cwy7)kv|T9<7BFGeveojSjEP2UM}7~^GUL%oEqgF=rmmm
zScHU|)$j||gB5EZfNq>bIo3;GxRHKt32rl$QA0-bHm7n}97?YCT8?;;oSs?(;Vfd#
z5@61dUZb?9Vm2^?F2?BW%W<9tcxAd!8IQSdyjD!fvU)Vv%blHhTcSnAo$}@>@!{Y)
zDNaddQI1`@1!Ru{xgKebM;fIARzDWoP!#z^j>%3&_e~lkW#AJB67K-JLtv{Scaec$
zn=;(g6rpGaA^pvIL+VBJBy`EYT}IkuXm?;RfvlV2`aob*UidB0L6MCd*}mnK^wRg@
zQ4y>y_)BL6+f&R?wz09cR!+78+mIGX+MSx0f<|i?#Fl7i7-`6tQ+4ylk)6YjWEU3c
z-nmdJ9nDZ=valyk(Ie6DPIk)(18{P4A89XF8S@7}b=Ir91eweOm}lSMb^oyFZ%;wy`4ozxL)`
zebNT_tNX4`UwjydjLAsG+N40lv>}k-ZKvKTa~d-*{yn4mi|HwmiRrE%jKhKByu2=N
zAcTdm@UIW%n^-xV;cq^i!@t~UMREnpEZM%7`rqq|+ah%5Qbfplk5^8w+l@V#Q@_96
z5JTPg8P@CpgJm=?NLdy4bZe%i5sg}7Sl7Zq{5tQkFSl%lUm$IUk>*h3+5f$<|B)X5
zKPC^yUH6EYl!T-Q$)!WQUAjx#Pgr_X`ev3&z539lhCR4a8-nA;ua@5Jb42^^#{PHf
z|DWt@kG^8VC>^)S2%flW>85gS^!BHMIu1@~&jdZPgIqe?g*Q?@5c_u<|NCTp;P{vH
zJ>;4xGw9OS?H+kE*VVx{V8!^_?)7sd!gm}554GRzM6}Nkr)(4e(aZtjH45Ui5R)z;1qK%_J1?ed
zkU~P6`u(;FQ(0pGn8@rB9x0#UZpCtr_mz1Iud-!rytMhjbCwT=<0@=M)v-d35{dDq
zE1TEgNIEV$_=@>?QU&CWgN}*dyC;E0(V`4Ej4V?q-JzFl*_5c#!G6P|p8Yn%@DiKK
zQGXBnh6OYRO0X_u8h_`j-IA1CFo_t~CfU;WO+}PHk~0LCVO;BFd*GNJpy{Ib+)Ey-
z0ogidx|vlsE9y3Xk+8nVK|V{63^>;J@mNDF$1uX|sqRxB@LQO~u}NQj7;e|ELFC|a
zeq)I$vogB#g}yY*jXusW$#KT@xy{oyb8=@yL{X=ovUPQ_HLR&J&C42tm8s!`euxLx
zR^$)J497mUdh3%Yi9)FqkvQ6%^QtsWWr%|nH6S6`;`@Jpl8X1B-H%q9)(0~r*<-+^MM%C}Vaf67ahP@$_QsaQ9
z*T8zKxT<^C#2pM~8%$hcKyN%2hFyw`!pdD-_?|~*w=>-D&Wu7q7P>ckkeFT>34WqP
zq}5WJm{GX^-%#$NTc6X?-aXVq@r%CA_#$}p*vnDMfQD`PRBHoV*SS92Ji1ILh8lT;
zDvC^{tj~U;i&nJC5{tD?<=1+i5(K
zeEgb>$%j*Ltd3VwMB4>3xvwRC9rc)Yx<%`g<#n$fmnv&G-y0wEsu6#;sEC(?r|L+<
zFXw25fVk4-D)}wk9*qjdKdyGpO*68aecsKVTryov;%#P=2UVLx#y_`YOxl0|1FP!9sAOd8M4GHWkJjiE43v&MVB&+ZLf}+Ml-iP
zdR`+axS(W(o2_-3X}TH9trny!;tE<@P2Lzr5#xA?6JcQy;c>)A!$F1(%P(p(%u2TX
z>gM!Yh~ELt7rZ?h55A!dOccBqu@}wpRUv)O=T=JzG@SYMEzS;RCJHn;Pq)rI4Hmcfg*dkIUfR+5Gcl-I;LVtR_0q2R*E
zjws2D$EIaPgUkusO1mY=hn6HnY&*wRR5SzP4QRj-)ruOB@q&H~9dH?+-jIhqHi>
z%9nKXAiUxVMB!j%)&p0blrJ9=a~))MZZ^y6G?2d8-bYYGULzq3`GZ8MU@w&n-uq
zYhQpZ))+FqE+~(uCWYwsJimFsuygS3f4AS*Q5!hmR-_qY@4J#iQZ9(7fX^*Ur2ry)>D`F
z-fZf=9_4YoTX*zCpD!mQs!zu_Bx`I=P8*doL0&=jz?n|0Ad{MzpFQdsV|?6_87&FM
zr|6jsaS9v}waJKH&roh{U7H}LA#I|~HdiP67zWKLlh5m!59<~8C@L#h%Ey5!pBM{{
zTe=$Cyc%iaqOm~TLkmRd%l6ArppCY-7hqp4woH&uN?4oY;0(S|j?P1*%)Ds$ET-aOjja{43I
zeJwor=1IP1%b~wFf4}G7kNjI>zuC{f4d&ne@_z|j{8F;CN-bHsp7rKhozEbHfM*1y
zyZX$ekE7ay|LXn-&O@bS4cw#PX=yX(O=gKE{unXjT)%D
zA8wI+Ch{%YV60r;z43ibv3>yhU0uP5UJ`%#fU@r$kTeOU;Qy&M{g?3xn_
z7@HAFj8}@t89L*|^za$on@p2nvOd_np?sn&Ft!BkLZC)F*P7zo9dBk@8LUBKEfxkOaEl<0c`(mzei^ligxBpu+|2BgEKe>m27IFy=xguQt&ZMkR
z?QZOxUbU#1C=X#F1}oD8MB*U%eL}wHK)a$Cvs}-2DzDg}YI&TM1LY5OGVaFm*2mTv
z-;Ork8>aJTZF^rTufFGebXd9SK=VsggnRJ4?#~6FbHA0H+g_d5WS2*HBZ1!pwyskazpPj~yuKbV7ZjFLDTVFknv}Yh)h^jO-44%MLkpnh8F_4u-^-}&D
zAbIoe0OBoyh=gPIAGrCPh^JC^syyV!1#MEueAGy9&UQ7^DUg?KF(g>~fgC2~5B7dH$~I$i?fXT~hyI(_YBgZ@fRIm4SGD
z*7H_4#x^g|Y7@!t?(5JRDC_u~TB|RL2@Kx02_JB{FFPCh-Y4zUQ#X;b+j$LsWRyb5
zm$NRD@o98@D|Q%|GT*PE-h
zOyiyA0)mT|7qedIbU#l{iW&-%FVBo|oOlv(-!S5yic6?gZPA7s^s_;po}QvJ$PRrR
z)g1i6J@#U3&$?gA<9uFZx!{)~OVg8AovuspC1UWLFFA#QU}QvnU_N0nlX71Ce3+p8
ztJ*6G)yfVON^TBJaiIo2_;}H{26Se(+!VE$P1uddD+-t}AC{t)g*Ee;C)iYli?W`1
zM4So0RNQ#OE6g$Wml!*hh@knyV;=I431_MXOsnLeltnZ3oQs!=R|X%>;X*OJM_d;*
zC)*2bb?rd%Mb!al{o}&G;6;7W%kDtSou^;r74mIT6v(Ciw=^0zj8Co)7}rQzXX~Yw
zdL_s++(@U`f8mjntN)bkWHbocC}UFf3psrwv4vNVQY%qiEZ6W9eIf^o*>o9If|a^u
zYNN~7PttqPwiLGy@FLyIaOqaVD98&V%8eKAD^(p?E`I{%F&$fFxno-|r%E^5LcCWH
z=2v)q(B2GZa?$+xgFLo|=#s@Xb6wabc-+#`lJy!U&ZIAI<^o!pL)bt|D%wax!!Rs#
z=!fbK>^JHCwtkjFWqwPmX4j*aaE0&pJwTf$Hws6-1L#w>jQE3o%QYN)yKfo}*`D2b
zYR>fZaKYzr8B~vN^UFOOldqtM@A!Kn55k|v@ABAu=rrCDL6z#sn*<*g&Ggs(wkU>d
z`a6kl5WZNe1x?Md!bXre&c~-*lq5hF56P%p<6lcd)a2lZQ%{~gx%YDREg=o7ft*am
zUp%bh#Rar5pR(EhSS{F>g&A_~)65j#Oy5%Wjt~GvD;!<)aC7M-_%ggv66~GlK
z@!Jr=7NlYN&8z1%m^<3ON+57tb{D-n`6cwkJ3l&oVBK~w64Y5-&{#=YBhYw&ug#fXOAyVJiCrQ#svp1QPgS98Sh0EvFom{2ZK^$5+$=ju_
z3wD~C>sg=wu8{xM?}1ToWwpw)+Yei>mh|%I+$kUbbDnXM?RjrcE+ia9NxcKJ
zT^BSG*CMJ&3W*%3gFAL>ddT}s&SR;N{jfVKsC+I{K=RTv1L~*uhLIH#`dOT!VkKXE
zoCkMeP4V!ll>8xSk+1A|q94kMwWIz>$#+q5I4!+yB~now^;?euQF_e!Vp@`bhCv^V
z_T7XKT!8pdni9G^YQfOGwboDJX4?(Ywy(AXvjt;9Sjd{1#VwRA%?kwi@AB+a#~DJ9t%DXrB^m|r{A`5F0r99z)28`c0pF@_Sot$AXI=eJ)5u
z$;7;}@d^Fhd6MAoawzl<&0I7oW|-~OY}L6UO3a^p>EfQxwexN+X(r)2050fZS(+U9
ziWp&k+jLJOrQ*_0_THgQXFL;v?G;g-%8U3>WA)o{D6*DXMzWUQ7~^{}7hMTgxMbMm
zVfJQT1LI*2${$iVe^^ffU{lR+ZagEwXEa&<5x;z%KrASdQXLq=5NF=ZVv$|tYO{xY
zEc#Q7+tL*?t0!}#^j4)fRdmD1`Ff>j(U~`ytz?dR7Uf8{-AFp7YsR;@*iq_X!;WJg
zdrHyNz{w7AD5j>=9k-g_Tx<>QU@K0r&*3srLRG1Ph~}u>eq6!bg${7@v(lbu({QZA
zv|i37^H-$H!f+*y)5M4Tmfq_xr->Cn@-AW?^r>x1()NT_WtP3Hjt!~aAyp>o@-z>*8bl#p&Sd_VI%Png*L)E-j|yo4={(
zzi@K2)5XQg$c}$#fg*p32Wk)E*UqtMEr1Y8DQem_v!b5bg_If}!W|Qe;v|b^U*YO^
zz@6KTG?B1{6;JQa@w$NW_^uCJ<%1{l2VzW$8}qCKAM?PA&L(;V@NMs?L_gHTNe-H2
z==!{3-%#JFEeft4%AqVivMM#x47}0p*5FPiX#)H(?vh@ybYQ`XCZ;FqwR`g@+pF3rNChmeGspA~fY@|nik*^^rd
zXAqm+T35a--#_&oV0mH7Sggrs=MQXp5wr0*$NDSm^00jD`X7HEO8*nC|D67y-EZ1t
z;aT0Ur%L@7g}x+InEyPkAFV@K_G9e#lA~E6;AQ^@kZy!8gru@8N(JWjg@|r^XXasC
zoKVZ+yhDV?=-}O
zsW5-uc3n{N<*=r}Ltgni_da#cnDJ}h5;*DZSs!hyV2t>3Dmyrm1|}rvUW2~neb~(S
zu8q5y3nw3^m{mrs^bQV&NF7ek)4qB~OIg;I#x^p0VLWqKtzNqXzD5@WAsr!#z~k8qk_{I=`#l3#5}5fdyrIw}ey
zcQ{%~o;5b-4y9piH!hb&hB_wZ`LwKN&@Apv3G7V*Sz@J;2Jr%r9(Ri&N498pQ+{fN
z)Tv{|PmlV4=~PzCSGFH!e=ceh%c_%z=`guOkZ=t@!le&1
z+jndsdIRLqg3Put??Gfr6qMKwBd7Y-mZY^kZv0D;hzHY1fSe*$IO*Cx8qNureHZ{5|KBC+_asx
zcfl{b3=PS=3GOV6D;)Ze(4CiJvQBs
zEr~hO4n>?bE37ax@{9Rm*X!g-NPzf1pTXB>V3
zbC0Zs#_*AGRRa34As=50&Q~)suJv@Ll!YrG7&N|8!rBddEy~lB>P&mh40(6-IW%6@3c5S>yTnV|rV$c3SBL
zb3W=~x$uQ=w8+CH+}}S0iDm
zohn5aVskrW;!flqX-1btV~mz=Z1o@(Z!XCP-;wveXK0a_K|08^VlV>LQY`jwCp^`)
zW&Ko7{cemm`+6JhPc(Jxh3fSy&(ACipDS8Sj+);Y<>2{NdFNfG<;~gmX9&=z%`VqX
z!_WLyo7cJc2ci4VTYzjo+4Ij)iv{TZzU(vRr;z>KFD2b965IR%L*IiGSbawJCE!K=~mO)OO_F*=2aLBZPQZ-
zDTo&!UxMsM_F&c$z5Fx7D5Z)@u@8YzMWv@phE=tQG2*mS_`FFc3Mqo9n~Jh>c1aUe
z72=ddb@g2Eu<$l!OkF_O?=^ka>1`ht;6aE~l?yI9))+Be1A_SFqp8X89lGQkcah-xa;5n(V3H!)2EytRodAd=TW;mhYpLTB__w`*!|pu;mgdxBhj
zINYAAA7|03(2s9nJ1m|-GIn=*w?3B1a^W*DNvv9?&Xz#10WdBf=Ug8=_1X-tQz{ni
z9GS%&gSb~2-}h?P+c9_m(R1!LnT~cyvRk0}i9wQ%9KJ+I1st9r^4Qxk<<4ARRCnfd
zJ*HPY4X*pyVNG%NcCn50Q`T$!S=ZU<2fn^O{i^E76|#iCQ&g9I;9jR+-(-y)uou>KOFJsxqPIYH+CwFRzk>O==outY9SRS!Imb!#h5X
z0)wU$w#RaA74d5;h_}=l_&nj3K8=Zb7Fl}`cwB@P;*l#t=bKJz=}O-ha^$eA6HJaW
zl20*SIBdUQ4U!TPNxwn~o6cf%FCn_wiU=f)MY0A5vcgt1yU-pcIj$Coo_CD&kZGRn
zCIZ!NFe?zWAFM1HJP@$AhBVFm&y41mYd^){l>O29(UX4^nV3ud0nGngg8kE;W7SVN
zn5Lg1l(_xq?(_dTRO$`#pH~~y>O?ABcR0C>3i#NUx_X{@Sh(*jEFgNlB_SaBDK2z1
z;u>E02!$>re@6kO7%5Lw(v2XH2{^geZ!KSw$pk{?VYM+pSaVz2^QHjZ`Ij7q{g0sV
zr;lZ|>H-qqZ>g}S>xgt!v=gfy5GPsu$^uNSEgmm#Lfz!P170ND9}64aP!cb(Cu2G|?)XJtEIPMXDJZmJ9fCy^PHqI+mf15|hvx}5zkS7Ad_ptpxgp8jKm15`Yr&^%-7?J9SUnFxDB9@5B}XmxIg}W?
z)xynByZ*Uok4`b#cD;wXoHU=5s4Iwkx1C$lO@C9{ImY-(-zAHxVcJ^h%0BA?W?9#;
zR;flg1srei*>f||!?n8oXl#GUSFUQvwGi`rbqszA4fh`&phkAEk9`^o6I1;`t|&of
zM?t}FJEx@>!R;YDgg*l!*+f-U#RN}i
zQ!|e5(Y$+${QoDW0@xpW|6i0-`On6FDCgC#=)JL|gqB{7%XF)v|#*le5nhX?y*=+W41HdJd6h=mCqs5nhdm4bGt~$4zE$0
zr3uHU18ovlE)@ul5XxTq^w-)Bu0Wz%h|!4&0h~A!uG9^UZjn#^ch^NR0g9lqTV-E9
zAP%7z=++uNzA&Vc+*{`#gWX
z2_wjSRCD1_j@#gGO%k}lu{e80N$6aOPwQ%J;VN-T
zYPuN+HW!PR-MIBEABGa-e$otr6fZdz`^TxUjt
z!^nJA6#wus*!RbB=N-CUIJR;;%{sgOJV`5>&W>@uEu!6LmSnfn&`w>LqX~pf9{yT+
zz44VIO0~}%-h@K;0VY<$z?J?)V6s}Q^V@3lSi^vu^X%FGhrRCrYjWAz4WLL7G*qcd
z?;xQgph5^FG=T&NO=$r_uhMKt?*T#wrIXNmw^1Y%X`zFP6s02wDxluD&-wSi_t}5D
z_dn
zsB@|fbn>FAh|p?PGL
zEUr7hY&j)6EKy#w{g~?8?T3hJ`eKIV7waoJ=Ufu4gdhb^MYIQ+`D2C4r(Z8T)s(&Q
z%u@5ExRiBI3=6IMx~!V{H~fSzN?{9<;;%z!L}bc=cGGsx7}k8WJ0~q^Q9qNen{xsw
z@pABO=N!Dqox^H>xHXf948ZEo8+go9cIm2T!5WRC)@a7LN@;3gF+Xjz!*)Kk|;3IpQQzgW}dWzw*M2W>nu=9|$!D~&A?dhnFc7(CO5Ir*q*1dpV5UX2C?}9N|o4e8T
z>LR#%cEMTJtL$4V5qWfFXM&%8OrgI_h#F{GO@E-oDA{H3Fvq#2|EVU&>CAR_=VUyu
z+lsR2>yS%cT7rw;@+qI?_bgY;$7!eRIL?L(W)_;Joal~*IQrIj>d@6JY$&)})I2hd
z!hdLlPKgh0no5aQIIb=azlbNWcHgeyPkT=}AZS!Fko7IM>`gO;|KY)1DO4m~pm(^`
zcMgtPkfxSHT94S}#jb~RBrCSU4#+;)2!a%N^9nsU_p1d>QT22!hNXUkZT
zya!+)Jp;qxr%h3A`58YQ`a9d&t~qh9XNm`}e9sw_CCCh@;MssX{^KqPGS0o(g*(5lW{L1`A%!l0t0--$2b3(
z&!<)1AAlL^*3LIWj8Yf4DxO!GIyJ2*OIW`xhmPCd67&)jBn3sw{{Sc`8B*=pTFcws
z+pZ}+H#SuSo=!hKIbrwuO(UgYYipp4)-Rwj#Ep@J2h07$gR?{biU*ti1`qxLfUOC>
zz9zjI0Dfh)4-_HAkP@qfH@&;=n8=vGQpjF2n~eflcuQWdlx42e!oMm|NL6U|J92w*
z+ulVSo6I+3$Kb>t09~!p9Xr8^6*&B38ty;9mg!kYBn=(zjNg+qs^bUxSB~fLrLun*
zUvkHw-Jq`67xxZBP1J4YTFl!#%i$LW1mvf_m5NpX@-$&P~6+B`u=3Shh#SU%7S)Jr9vDv9)T%koFz06D@H|sZyMamqBOYva#!FgTj-ki(&17R)U
z$51F~)@@V{0L@8mv|Fpv6T!wAIgsvzZodLG>{Q$*v3sm;{dwFbwznl<<-SFBSGuN4
zW^>~S1C74Mj>0ULLmUKGgnrT}hSW3vhDPzI@Awar_+7<6AwK`R{{8ZTf<51`bjK;CD{1*-et%vrj!TBjh
zERsI{dT4!$rX@N`nq^*><14`lwz<8c3l$FV%{7am9V4*)&AbNVP@Xvk-9%Y>V3
zvFhSbB?^LJz*z-1yqm;-H1YQ5JG^}dbIjg;wJ%=y@gHUJFEwNjkp+fTq9Nvbcdqo(sF%h2RVhYbEZO1dCO`er+7dz;xE?_?OB_R9Zw*w4Ectt;mZf$3k
zrv(GgCEJC6i=;}P-iZXR@Xypv3A82TmWtkKN%{fk3C(83GMjc=48JQ-Vy*(itzu#q
zDZ(3eEMP|^#n!_u_UOIXG%o==zE8{{=RCw%x4n6DW<=W+70sAuljqZh-Dhqy+}6We
zjJ6wYTi<-G;os^=pmc|~R8oI=NIrks^)>w$A2gidT^UTzij@(|#ZZ4U
zu0BO{hr_o$?HAy;JrG_>cA<3FJ*E29i>f87CHPbP<%JnGG0^r@iB9|XoC>*75+MU?
zXviolMqGDOP86WYh9;#Yr`}&6xly~>^qjIEC(pl`+@pBPEGL
z2gC-DYyCo&5hamju9p&BIUXEefpyZ>UXOaBXnb+8v)xz#;U2iDUQZ*gI5NY27SbIF
zEL&AA&r)JVi;8;ZzqB;zY`txKQ>#tbTMjAw2zF|ovd8_dtd?NUM^QI*Jyw9E4vSdn
zE-TQ{ZPHn6@*%>9M3-Q7?``a_ewY_*IpMuYK1-D_EWsjFpR
zWGfYKNi=;vtQzmFP4M(f`B!H@R?Wi!Qdm2%uHvcfE1sU^KY+(O@wIITF2Y5=io`!J5_n@*ynEDl^Rxh
zLA25EbUN3as^pU9Z#Sk}HRE!!*`sjp)RIrQ-dA7PUC-FL2lt>F@&-EyS`7$5L(5tV
z_%8&Clae{Nd6(Q}x&bQB5pZicplaG?8W9bMw1{YvjMVZt;Uwj3>dE%@mv84w5JpH36Pl@!
zo*FuRW9}r22p-;%dA9B^_$w0w`jd&l|Kj&d46d3#>iU0Ba}{W#o=ClGr{SvYMM?m}
znb|mG6%!NNAC|TFb_xZ-b+^{+6&lsJ?9A4u3g^b0MGPm4H-GVPpO}uCKM^$rkhmCg
zId@;InAl3BQyvwluT;*7kL1{?5s`8O&_F~mw;ovE_{p?lSEOPl^*wvZKxbSD@1gUB
z%;(vmxc-FDle|n(QOD$xSBNW_Bh{PqUAmB%l!KpSiV6~$qTykhxj$nHhQORDR=3O7
zfKj=2dj!nz@P!Pm%$?So*zR>EiH@6QL9mJZT9vbzM?h2Ct-A~D=U2BRfz$VH;slz#
z#kaD(guIUsU1u73#agf41}=1sBINB`tA_3)$WAmh!Enn_gWpmBe-YL{DUNehnis^#
z#UeJ_E6x1MC!HUxk3jH$7NQp8g%us6ds548rqlZShm*59+RJ_HNhEo416c*F#u8wms@P&5QWV*a|+m;$5DunQH+Q;2F5aTK
zw4G?x;CYpD;}+Y)vD(0Ux2f;>cWW-|VvYF;uoj9hla28Z=`xc42?i5@=l(EO|ABV@
z>n(bQ%{mE=?W~5_7Yj+{{gOfAS)qw0qF>B*ih7P`%Sz=*4239LN{;u^4-_%n*81F&
zbGO;syz_8}Jm4Py78+N5-KpNv$v<*tW`E0>$sI^R1tVw;KW38{6FT63WlR+QD`VnZ
zICrB~i}Nm?$X-zlfhjwZlB3Jmb_Lyeg~p3yX^C;Ne}I4e&`f#W604$8(Y>A9<3660
zuye*CHRw=5NU(cUFDK$+e}v3psK2;n*PB^(UDa66*?6-yiDScJu9UgArb?}H^2;$K
z8^^q-hxQD^a`0V38$aI7#c-5I<8E94^m~gwVRL1-fUD?V`7sAoW;l9as49`ATVQO;Zf*VXDJT5Z(LzRxO~
zS#?$4nqhN>265HDcT<1GH)j6AgNowfVkankkj8LWg5ZsH(bZyJw>>@2E?S3CykfSU7Rpx}%*P->!7NI2V1`<-!PD
zR%|!*u7N5Ao+fl
zAxf~2luAx0-f{(eO@@pmZ;|6zPk|-=!KAAGQI1_Z$2uMQ7gWJV8VH>6UM9|^^{9!3
zwj@T2rYJ5&1KZUFrz}jy+KjXWegOE*21qd{%^2_H>Bm0J_oxO{n$~aD`zqF_`*m;5
z(PKQGZ?()?=FVl$O9K%yLp}z;=U!K-HjS;6S5U^ZAAtUcxzcM2rcph+YF9@>JF<}r
zf<(Bee0a2@ne1}WOw)WguLUZ_;c=lA(D=pYZ$j0tR}e~Xl~0F1FmsOdp*1eNVdP$O
zFcxcy10!)C5_Vf{pMJo9@de^ObDjKUF#ZmIrP024D|d(ls9q2IC?z3F+F|uplekc6
z^pLlx)c56xdk@1nyuBqnPI;IYN2`4H*CMEU4;ig;eQ$M&A?*~UxmiV(C$ro?rLmID
z=s6R7lcQ!<92TM)>pe%c)~fPk-ih|OPoy4Q9q!L_qkd;Y>bwX6UN4EH>39Mys{3eo
z^W0U6>CW+AeABN|9g4~}6T?Q|3X61xX44sce3g5ive_@K1-zd8d~V24W~j9~9#BTk
z(;LEnxz-o`sa3`BvHB0dSNLI*el=b6qVL6gHtzwuE5)<;QumtLB|2$(2WNQJyS_=Y
zHlWjiwu^}B&!DN=r)!eLBbsIMP?7-uS(t-3-JWQ2b8#oob|M1@=jsdF0%hI;RJ^8D
zX0_nL{X6=#A+`>Y5o4To!Bz~iW#|cCMX#GVPOW#M^oDkR0N%yu?UVdaTrGc1)dSX-
zsRy=VSHI^!AG(^7{V0;J-t6R}=W9al(nP6N_0)XXmqz@uLvBv+_c5j83r~X$S$8NZ
zszjIQ1xsz8&tEZ@6D0+vR5h5L^)Wpeaj?jKQ!nR|-nu+=exP{QwQ!>J@%)9Cz6fc`
zYC7NP{)eO-e-uyGVA8%o`Kp(w*mvrEfG<#Og0TaSwsFy0*uXXSFyYHQg*>&SeKUF9
zdwkn}2d(}6BPhz=Wavd^WJ)G^Trt-V5@QrLc6$9%=1fmMTc&Ee|4N>Pd_ist**RU6
zm%38c0}%=vQZ%wsh1c7x%emr@FFSH1zfaSSI?0O4W5hh(#Wq?PMY_H7V=0bod|4HH
z%Oo?k0x{FXG$v#h?Eg(*RQ-w9!Q9<&pK;sKZDo~QeTc$%Itje3nc5-r;qqRSsPmvx
z-PC1gGqLfcki<%@x}PxaYBg^`Nsq<{@RDaB9%=XvzRPi5lqGw9C2C#vUB#B5D1H?;
z{U|$M^sihAjYgZ!shCFg)QQ%Z3&G?mGD2j$UFGAbF*&u{ZD2w?X}iXM!ip8uD)jIc
zm&gBIcDDjeM*PDEeqTPyHt^_hw6)s&Bi0-ozCDRAd(QBC;Rc8nN)gDQcanPBqt~mnZ
zHD_^)!_EzWe@Iw4U_GNSsv%CK7Jqxl{jAyEr$adoau##1g3dnDRzaYQPm0_wDegl&
zUjOzFK-rx@OZ?#FB*^<(mXZUw!TafF3(uTcUtRR{wKI5au>SJb(zAt;KkG>n`BM&m
z(TqRk@TVO9i|d2S(=)GG88U`^!S$ktctf=Q{jbqlFS0gA3JXD|(mrT0OVasnq;R%9
z*I`@0KO_?5d>;F^ory%1et`Q_6btf<3qm^SblGc|9xIbcF-636
z$~tEdB(U{a;SW{kI8+Le#2-aTQQ4phF%d6
zpMg4mzf^j-Nu`H+XqckbHl+FslSz!$y(@kBM-+CCKfGC9Zlp^=`;4zxYRn1(I`a#YkH?L4=HJT+vGmj!?
z7{pllgS-VNbcwl7!&oHLIEz^3>vnClufAmPwVt=mD;4Sz3x=lFJst76c@#VY&m&K>s&fixC-`cbI<;D^)=Mzyrl->P
zJZ}o*cNZHgm`&Z{xio_{!zt*a+iXqwBicMMw$g~972VehWw~SCITP_p;GQ^Wqw7F6
z!_M666geffec9s&iD{t=Y)<&8+Rfa!w!jh#U^}ya718Wlage2n%BLa7T=oM>@#P{Y
zb;Ka_Sym*wwV=7@0=*3POWqG9f%!xIb^;&u%U}rH&3e+o9T#F*tWoMy#r-{Y*edkr
z8>C%@m?+=<3X8E3db?&Ox!Fs(ngeU8@U6|}%}-~wGFT0(
z)43rTu3gfb5lt;Z%tTc*I|iwNx*ndZX`D46rElzuZWh14mC+MPKuzt}I4tc=yIbNLJo$uWIK$(L6-W0{k8GvZKr7P7g?
zoyKwmOI%jT_``~Y^wZCEiwxHf=!Zqr@2{DMsCD-qUeNbXZk8_)YuXy>$5T!&F-P0=
zmRq&Nd-oJVqQ%&;&=d!+2})>}7EB|mmU}ix+##scn>Yq3nLt=Y`Qoz0PH{L{vF2uL
zVOk!OcCj!?$d-c(-g{OxlSNK}&d*|*EBuoiUyWK~WrhV_!B5<~`}QY9!&ZW<{U)Mr
zTpGTXQ{1mRpes*r6$?A1tsh>rz(kl;wouX)T@`=FJfM#^a!Kcew!*px*>HXO52%5o
zJPHu*1U=0NQn-knta#~(biTY?`)Z?D=9=xtW6Nhzt!j$@!
z1Xb(Gyr>gz!J6cJufM@^N>Vhw=^pdqurV_Kl#_;9+X|4Tt7vlgTmYJ%XM;$8X!;M{*|lS$QD
z`engD;+{Txhh3s(`o-m(Q@ejw{wa_@mEr%HiEzgIx2uqLz{OkKf^%khbMLmBO3G4?
z?27{2puHc!i7b4+z)D9+?HGKORW?w5)qVHxmEy>?0S#i(=P-LfS*t*!Hxa{`+~`+{~aALzVT>MS!&eETc
z`%`v*D$4(*SwXM%Zv}>x*wS^W7fnxmJ;K`RTU#^BJ3>G5$uYVr@Cr#zAf}_T5vKe?
zoM($s0xfD58`7tDk7b>wE5>viGU}y4HFFNJi7e=+>?}Mf;#Ly@ACMC=kH2LgSLMO{MeiZNWwp?ZamXdR=Ps~p^3=Zh
z>c^X5)0ZiqpyeK@OtyBIF0%jm=0BzJr*8Z?Q+~e`Tw87d-V!e&ie#i_HH_P|a@N=p
zZ$3WhpdTf8e}{#?%GFOQ($*Qnd3!qWukgs9r8;jGZ!heon>AVB3I=QZ*W$r{v%LLx
ziyIS!tb&OvFi6pwwrf(X?24-(Y3r!9>=Bez(uh!4qcmiP*zuOD)SW)Eyv`_|l{@v|DyHfT>Wn^YOG_^$*3=Q@r_sog`FLg-@B83p>QwHFmH$vJdXMiA@U^I;jhFXYMAW3e
z?6$F;+VI|VHpQju5tSy_?GW)J=t4t~N3_~jbj=Y!O|?{Hj;ndLCRh#WZ*^+?2Vf`l
zKZ!^BulDVK>wRZ_%+NTv+xz%>JJ`7WEP2?XX+VmXE?@dtP*IVB2YNbOk}@-}MLXE}
z(nuNm+4}xc19h`;bfA$kb+-3)x}>NCqLI>eaCUU^y(F)oKqIB$;p*XS>}g|1Y72Jo
zceZmd(o(09Qg`dr6T-3gYbQ>)=g#n+6>0VCP{^dZ@00yCdnT
zvPvL%B{emgzjp4&^pCfI^Dqb$0w5zJvEfMn06*pc8UPCNpV!a76r}4E<*A<+6(!|q
zN@^+^8fq$PYMQg>&eG7*(^6B@0qN+^oj(sePji-mk>NZeseJzDL&$!%q&P)IYIvTO
znwC`izj^(51^`l#7gK~#knsY@fn*dwvLD?5E>b7SDac6IucLB?>J%mQX$tb6w{M*%
zo!U<7_L*~(RA(v4NId|MkyD&HO?d`L#lUkx`Z_!XJIct+$_r9ZG&C{w^{XEnXJV6A
zFK(bVGPd!@)IH~uL3nxlJO~R
zS%H7JK?Y>_F$*|LLFzG(0tmQD0%d>g^gmI7>d8ir=vI9^%eUlZ#WQa3xBM&p#x7qq
z7+(AJF6BLWk}qE@ub0Vwc1XXlNxbfIDnK)~NBOvA`}M`{cpWioRY~)bK`${SRWGLu
z&yjEj0=1ijHl)c}MozpAGy%G*{~)d*XbX}zkT!HTQ>Tgz%h0IQvK9^px#{0KUAC9!
zAwN=FTHZ8S%j%Lr4LGHAg?)9hJWWS_<*BE!(-hsaj5tIwB(4k_@JJwO@j$|qWdkbX
zMkAmcp$E3AvJduGF=~nx)&7-of=U}~O`4gl
z7+_u(*(E^uT1H_25uHk-GUGd(s@3_ZY26zafA6EH1aHp%(NJ-hc@`lk+6ao4t!xxB
z8<1{G6JTV0$bv-?T5uA>e$$_3E1qKToS!Y++(qb8j9B*088(*1PiFJ+PNOJ%$k;8+
zHXyBe`D#O%zUqaR2~0tLXgeSVIHO#y_Sjix{f_8&I(r>s@N8Tx!ZFkF+e^_&5%aXv
zDB7}eyh>TZ+!UFw6_@Fu
zov>_=5%Fl5bK?ja=0C`TogEe@20a$M#4VBUZ(OY`Z6Y!Vi!VE_weLxr;rUX>j?C}P
z;gylFFN>>(W*OKN4aUWNd;CABy}-t=;q^Pp-)svqM+;??=iD>t=7}DVJR(+Y;46A1
znUzS?$_p$FfLM5nQg(HIM3W<HMYa5&DWH@r(?qHG5WGb?Rf<=8Uyn
z1gE*YR`*420W;5vO!*g;u&@DGy6OE-ta(AFp!Y
zh*DzB5jW-O_O`if#y_rA86zDC<2ebD3&vHKa$x7vsYamuB7!J;6sqcM)AQ_F+4%j~
zL-4u#?6v`rg*WqRi<}yl1l^{yAYXfqdCxqf`?Ykw50Kex>&)?BeanLaU)}h^nKyDn<4Do{5(#*ltKc5PYXY{M6q>=22v}{p$+HiyCKqA;0~7@iWys
zHUOEUtV4axYAID$d
zRwy`xRz(1}u6x{%zK;x{e?H}!V_!Bm{XnC6V^ffbH4SZSh#s*oZIEApw0WyB%z}dr
zUN(!J+7^WuRSt||uj>jut`r%fT_>nbd7L@7k0P%Iq?wPtdTaH_
z;7RdKmT)z!nMQ1B$P#RRO3Rt1*naaHxxa6%27`h*cTp$(oFr8p})6y1Q0yXPI2c
zR8sj8zlsn5mYQM8v}Ii~Spr?|M_hyY_mWxptU$}7upI9z4geB(2XOXA00sCAkxUSx$Af(FYhnd9$ayDB?*
zzDx+k4e+fiXPbL82>=;%;|6TQpiyR~J~u?py3@o2=&Te)OzGwfJrL-z@It5L;N_3&L=0b>M~gb#(Ty%0;FI&f
z09i)2Y*}KH@>(U1gXy+|-9RgIdPJ^B-jHzZv^^-=YnjyuL`2$aZ|gLu^tGrr1Li~&
zovq8wCQhy^UCtldTB8Hs0i`vx?Qe5~=b-#-?6Dx3N!ewH+~t3$m6tLK;=9AHho=xdHvG+bz!CVM`bl;jaxvET8m!f
zxP8y_ILzy8bhfSm)m-~=fa8>Ly#BQ|$|fO?|{^e427!M`XFuh<;XywZ)B^{;qURZnwWxNjcGU8fr>GdPSI
zV`c)Fw{9U@60cD29Dan16!tVZ@3NJ5mBGh|y_N~@;6?cd0zvnMw4-+-D;;gk-^JQ|MO>Z@nPAYF0_|iB$*rV*oAIWxnN#1H-|adw@6ck8zq8^WR3W+#7hX&(daXZBIxjfCM8Y|p2`QS?}S__TIyuyttC$s
zO#99yIKR>5o!ruwit1=97yxN`BR3qfYbZHI2NNvu{J6{>o9i^D=`>U0F5
z0$kFmSYd2M@*F-`Q4v-Tp!IMwbjNOAJAb
zkl71Q$qx$4K{XWjbL3;
zE%zH0s)rVhi|pNcnG^oX!7U}?qvCV_K4?BFXEtI5;;(V&>(
zXOHa3_Nd$7jke`Ldi}gQBSO)7)2wz>a+r|J1QZAaIvx!MT>D3^ArvzWP7U}iuMD}l
z2vvrh)XFtuZfM2G7%dVU#xlhT5>E~tkYjV>9UKTUkuP~9&9X%^Z(sAZWCA$g53Bzg
z3D#a1Pq;S$W~e#*08Nx-MeulV{TR
z?=
zb}O%ZUu|@*Qdx${*}AEQcN8cv%}G^K%dr80<@{-ZK$ehG6gU6y5daQKZj0Tjf$uYo
zXnmD=*pMx=>OozB5X0PXK8vX2p-h;BG!*^8Pt
zc74*oPqYU^Dw2`QVC3$3x{yD9gf?s5#nH-n!LICWrp(wftA*QNecUSr2kr?Zr)95$
zp?u&sSR(8c%f{l
z6d98`Z03$b2l>_Cw*`=0vJSWhY4*&f_h>OfN#@`7d$Tgs){rf6k_I#PzybM5dqTZuAPQlRd7@PyG=nUt+3AJryV7A($uU2X-kMtP=pb4&QU4*(0Ad+3g?E
z=O<41B0oin_*D5`bFcJXkeT8|)9E#Ny#u|7KWKy0$@ndqtDur!?@78|ecqw)KsVj2
zHUqDj9;{oSivbl&G)j{-Un%kvx{>Q!bX*L?V7MJJSFfAh*UcD@Xqsf2+ccceRS=ti
ztz2IfkXU(SSPXhn@&c+nTUvFeskUg?W@~_l?mkIgnGM~$@$FAr?z~Wp01uT2g}E(!
z>)HmA3@Or0@sflaIOaI6&dS+Ekf9jXNw)JgL&~~=%3PF#L*5G`EBV31-fLoJv>2yF
zS4fR&0Mr!bJOOJ|j~A^wI-iH1A!OM{3?8mJJJ$__)LVz}=`_`ppZ#dk=wl%}VCbJ!
z=@LVy%E&u>=d(bMzj}tbwGgpE;PnU*dnp-N&IiS~(M*!}S&qAfzm?=Qk_Z+l4~#*~
zu}kXdBz;v(_d9ug3JppZK***_g^shF0lU#~OTl(xme^aJqrHme^Lwh~ehd{x+h
zFn+@AIqRjhv=tSL`hH7ngw~C|TC2Maa;dv12jfGqqM0k!&*{>no}C{{ZfM!lBd%hF
zQ&Slegh0f>zP`x3fU6OW=AsVTja&VG5V|=?Y2QPQYP~$y-sC+CfAQuV!-i7rcqCpq
zmQSiY4Z>`H>L6+o!mVoahPmB+2>np);a!QyXgHN90Q>F?L%jCb@YX+AI4`~X04_kvud%byB-J<@|8kKdPl
zMry&L1DQ^kW{JzWku<^ix(YsB(4z?}rKiy+XVJ-OsM0ADK$(|K=sRY5I5dPd-LGx-
z2by0n(Cw5Q2%SQ$fOTS2*mX@EI=XE`kDzpxGjOM|^OX^UGN|j1I=C
zNBLXYZQ2c-QQ7EQXvVR4kvjdy|DWPS&lMbzo+e_MWQoYciv2`YpW;t;Gd78fbNd
zSs|N%#hPRxhs}2{Armn|TXmd8El0OYNv+6{-i<=Tazi6{S-Bh3#7%s;#l8s0mTv{E
z6R%fkI!_ZoKA;*F;30Zkd8^0;**CUkvIu8yO|V!`+H7cuOl_2PS*LsvZ69x>4o6;e
z%Nu*v>iM1y*&?+mU5ea@mF#ck#P?P+eV!78M{u~g`=L?`9dWG_AYOF_=e|Ul;ajHn
zSyFUpA+v>|xFC%}-d1=e(JWFv=#g)BezxZf@m99_7-S<_wi@}u2zrI8epYmvB|5Fz3b1A_2KB<9_#fz2d
zMHJg&eSnJ@R$bFSZ^fioK4-1&(@eDIn3G@ka&d8;N_4%d^_(*x^uB)TtftXHxg~4k
z*RaVg>6aH`jt^*v1bC3HkC$LUQrVV>RG;6T8h{WAov+5kAX%0cgEI0oldU93_
zTP%oBLKbV^Aw=sJmVx-DoWZcc0eI7egUSxB7xP+o8oC>vE>5nccVyA7(1%1KJ<@G&QdfK
zH=+2B#hITcsP(g;Gn8%FeBqJfTY>!m^Hisyk=MC``Es~V{Y){>A$Nfqfs+fyDK{d|
zuXCz1CNtR=sO-JD#Qf|`u_tkDA}Bk>*<@Li(*el9)9v^9e6l2?@wNo2aB(g@Dk|_X
zDM10M=i(W0Qj)0FyWby>oC2m0&KiyHE5}EqO-a%vsK>b4uGdpgRu?AH*ANs-fDOoI
z7KgI|)2Uq$2G?PNEJjA9em+J|!(mzL_EtDH5hcufTjtzI
zI=Ey7tnKX_|EIamBOOVoL-1sS|+yG}J
z?rT^Diy@tPp?LeWiJ#PpXM8HVS?E_rx0G*4)a>0G$Z}JaI+bo}&oPG)mqr@#_26Cm
z>#57P`PAN7dZobP8cBG700em(4Ay#LarO-9u!VnDLZr>QpAs6R$-GgzSRxE7e*JVe
zCsj^sqTCOucW`#4EUvL2-#x7sl{X=@;MP}v`FsYgfroC_iS|SC`403NiKAcZVIsz`
zUZo@#?;zlYi|XAknvXQfnaXPdgDYZt%};2roL%DPfZ%NgonO5(F89~LIO<(D=CBAG
zaO;6~R18ttzf1kt{>T*xv^gW5RxP!qp%}Sb%pcb`pfVUY
zY($a^qrC7JrCX8T20nkHve%t1e7h2Q@w3#M5uPN{O#lnaQKX%Ap$%iYM32=23Hf=D
zbD6A(LsP?ngFV`OMb=s63$@VF@cq+4WNx+QgxY)WvX6mPbp?HX3QWqf{u}PZ?5Hs{
z^#ME*t4iZLZ^(`Ji%YW5-B*eFCPp*(!X;}yXsX%TyBS5S4pSmRjo4)G9oeRp7&WH2
z
zS$SpM5u6>zH)L_alI-mR-FViAd$QN_PsiB6Z#@s^wiPOo0Hx4Vh$Y1}a(cCF@knNQ
zi#HOGbk_jdm21?omHpmc3ldiZd^pQ^-s3zMyj3C@pcZi=ZfrFuF!Dgc=#A>W%vH(u
z=w`%Wnux+g@A{gfp?A^8-jbJ78m~6}i216zsi>Rq$<+7n*gXNSrDM;JM=Lxqu|26?
zK7XsX5|H>TcOzSn>3we=TR21K73}r*J`){edJbc?5qSLy>1gji$*6N=tQ!Mkk
z5V16t1lA6mx}eUo5j`QEN;-88!yOne4Deu;mwSg;)WEu#ZqzQ6yh_eYHbZ4HTr~+v
zRKqvQj=_r`(ZubmX1>SJ`OQ^5`Bv4Fw)qV$i;T@9x)+5`+<{IQ9qdi1k@D>Y-nCi2
zPZu-ZeWkzG);HLwX+?=y;4)5dP7kLeZ(22)oSGuLT-k|B3sFj%wqN=#28$_!wb;~i
z`OM%&%7{+l0>g?ciE0<%>LbmvS7uZWhx#SpXco&3W{ai>
zvy#R}2|%-!>NQqTW=D9&&h=e`KO+TaQJDqxA;oaR`kB+)dGv
z?mML{y;hp9ik2X=mJrS4v1HTt>;S;$^4kkjUJL6_T@c18))t$j6g>_NnJuIINtIyI
zzDZKv*+hxfE$#&i_K);+G5I=WMp^z%{Yyj#jmP8fps8bn@lF<-b?JJdAPL*axwQG-
zIDi7wj1bM}_E`d_z}=yh&zrRo4h&7(1dGYmw1N|=N}~3+=ukOL4r$N7;g;kDOoa94
z8aa{{q6KAcEVme50OO=*ze|)B6`$HKlj<=aj7SB@ALU8fGCNhBns7gtTJS-T20w?n
zAgktDEaD8#)iaq)hH0mU!kRqdul*c=|81+2!=XLqc4xJ=-cwy1I4FyloIwKhLE?uQ
zAyET(*-VKRy>jPOr@rAZ^eu|pvGD=f?0zPXw}$pUyBH|&qS2m9ubf|UsLUBE@X)H$
zQQoP-vEYEDH6IK@XB@{irug~M5>{G{F|ZE`3A8SLEUz{6+YeHTgKNh+f<|6CE9l_?KO%u;s|Pcbj@5A60&LYo+HI9ZDYkO
zj+it%jh}M;kAF7EHfBFNJV(JN%$o2Q`O=!WV%+`sm9q8u#~POFK(i2sJY+gxu)tPg
z!+lQfigN7DAPMfO4G-Oz)Jp{SOMPPvWqrhO7QBB^-!SiRfXjV~fQlt+!Ks2&7LErm<#XPAs4AL_^f)zB|Fnwl)Je9sg?mfQ@rn5(+-RfJVBJB|_4(!CPm%og#}gxC
zoA@w|>fZd*d)IzhSaAle8>x5!^Z5r?aK`0f&kY=LJXU6z*6nv{F*qeL546K0dV7@`
zvP}yGzaB^JOwswW5X@|tkn2p`kHD%_Sx=~z%=2IDJ6mrho$;=qPPx%JcGpJD@N0#N*TQaVjC@=2j
zG}uxkCt*HDHRL2?SZU#7n3+zNG_d(5I>z{oNVQhRV1^-X2a>5nnu&2*Dl-C?H(;*B
zhp&;P7W?r`fS`1_(VHFR=S;WFQ&LLRpaO~oFzw`If(XnAoXQ_n$6pi`)f^RgizJkP
z*DCwPZl#zlw>A~xhwDr^HdYLiel3S(WMl>hdoKX`Hn3WWgcZaX*Ix$#qWC{nH<)N%(VawW
z!8%tw=^tBimp>Y75Kjad=_Z0epuxCMO?17aM%~IpNyqVkaf0H~hS6lb$`DLOWpI%6
zeJ<7mZFl9xuw!PXm{|BQ|$k+
z=Y9Wa*8>0kQ|&+O(Ql@>>TzhNpsbU(i_bzLRhnUzB^Gy&~Q(NC7yb)DI6