Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[vivienherq] iP #529

Open
wants to merge 72 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
28ad2b8
Add Gradle support
May 24, 2020
ed6d4d2
Bump gradle and lib version
Eclipse-Dominator Aug 5, 2023
4b12bd6
rename
vivienherq Aug 23, 2023
a6f13d3
greet & exit
vivienherq Aug 23, 2023
6ae3cc1
echo
vivienherq Aug 23, 2023
cfc7c19
store & list
vivienherq Aug 23, 2023
ae180ce
task class
vivienherq Aug 23, 2023
07d666a
mark & unmark
vivienherq Aug 23, 2023
4cec3c5
lvl4 todo, event & deadline classes
vivienherq Aug 23, 2023
a056e50
lvl4 todo
vivienherq Aug 23, 2023
acbfead
lvl4 create todos, events, deadlines
vivienherq Aug 23, 2023
0dadc72
lvl 5 handle errors
vivienherq Sep 1, 2023
91b96cf
lvl 6 delete
vivienherq Sep 1, 2023
2445b29
add text ui testing
vivienherq Sep 6, 2023
8f55d5e
add save tasks and load task
vivienherq Sep 6, 2023
4fc7fc4
implement datetime recognition for deadline
vivienherq Sep 6, 2023
725c47e
Refactor code into Ui, Storage, Parser, TaskList, Command classes
vivienherq Sep 11, 2023
34281a2
Revert latest commit to push to A-MoreOOP Branch
vivienherq Sep 11, 2023
6bcc6ec
Refactor code into Ui, Storage, Parser, TaskList, Command classes
vivienherq Sep 11, 2023
85e358c
Organise classes into packages
vivienherq Sep 11, 2023
8144a1c
Merge branch 'A-Packages'
vivienherq Sep 11, 2023
89204e3
Merge pull request #1 from vivienherq/add-gradle-support
vivienherq Sep 13, 2023
23714e1
Add Gradle support
vivienherq Sep 13, 2023
88e778a
Add JUnit tests
vivienherq Sep 13, 2023
9b188fa
Merge pull request #2 from vivienherq/A-JUnit
vivienherq Sep 13, 2023
1fef7f7
Modify build.gradle for JAR creation
vivienherq Sep 13, 2023
0314cf6
Implement find feature to search for tasks
vivienherq Sep 13, 2023
1e5aa08
Add JavaDocs to methods and classes
vivienherq Sep 13, 2023
9dcbe69
Modify code to apply coding standards
vivienherq Sep 13, 2023
b4f582c
Merge pull request #3 from vivienherq/branch-Level-9
vivienherq Sep 13, 2023
fbeeb36
Merge pull request #4 from vivienherq/branch-A-CodingStandard
vivienherq Sep 13, 2023
5e0e18e
Merge branch 'master' into branch-A-JavaDoc
vivienherq Sep 13, 2023
69be13d
Merge pull request #5 from vivienherq/branch-A-JavaDoc
vivienherq Sep 13, 2023
c6507ac
Fix coding style violations
vivienherq Sep 13, 2023
6fbf6bd
Create GUI for Dude
vivienherq Sep 14, 2023
1f85905
Add functionality to GUI for dude
vivienherq Sep 14, 2023
0e72557
Add user interaction functionality to GUI for Dude
vivienherq Sep 14, 2023
904825f
Merge pull request #6 from vivienherq/branch-Level-10
vivienherq Sep 14, 2023
e0f8bf4
Add assertions
vivienherq Sep 14, 2023
b9eff0b
Improve code quality
vivienherq Sep 14, 2023
b57f610
Merge pull request #7 from vivienherq/branch-A-Assertions
vivienherq Sep 14, 2023
46ac71c
Merge pull request #8 from vivienherq/branch-A-CodeQuality
vivienherq Sep 14, 2023
cc740a9
Set up CI
vivienherq Sep 14, 2023
2a9f2ab
Merge pull request #9 from vivienherq/branch-A-CI
vivienherq Sep 14, 2023
5f3101e
Add Note and NoteList classes
vivienherq Sep 15, 2023
bd2e27d
Add and modify methods to support Notes
vivienherq Sep 15, 2023
1130fc3
Fix Checkstyle violations
vivienherq Sep 15, 2023
35e7c49
Merge pull request #10 from vivienherq/branch-D-Notes
vivienherq Sep 15, 2023
19c71fe
Reorganise project structure and add packages
vivienherq Sep 15, 2023
ffb7e1f
Fix Checkstyle violations
vivienherq Sep 15, 2023
44cfd21
Storage: prevent null values from being returned
vivienherq Sep 15, 2023
c963ac1
Find command: make matching case-insensitive
vivienherq Sep 15, 2023
af043e0
Configure dimension and layout of GUI
vivienherq Sep 15, 2023
d2a8732
Improve GUI
vivienherq Sep 17, 2023
999bd2d
Merge pull request #12 from vivienherq/branch-A-BetterGui
vivienherq Sep 17, 2023
1c87ec3
Add delete note command
vivienherq Sep 22, 2023
2a15d2d
Add additional checks for error handling
vivienherq Sep 22, 2023
94c8ed9
Add exceptions to Parser class
vivienherq Sep 22, 2023
fa95713
Add exceptions to Storage class
vivienherq Sep 22, 2023
c40cdf4
Improve error checking and exception handling for date and time
vivienherq Sep 22, 2023
e3b47f8
Merge pull request #13 from vivienherq/branch-A-MoreErrorHandling
vivienherq Sep 22, 2023
a527597
Add delay before exiting and closing GUI
vivienherq Sep 22, 2023
3a58feb
Add personality for Dude
vivienherq Sep 22, 2023
7197092
Merge pull request #14 from vivienherq/branch-A-Personality
vivienherq Sep 22, 2023
8abaff7
Improve exception handling for parser
vivienherq Sep 22, 2023
14375d2
Upload image of UI
vivienherq Sep 22, 2023
1c14b2f
Improve code quality
vivienherq Sep 22, 2023
fbe3510
Update README.md
vivienherq Sep 23, 2023
4044a2c
Find command: support searching notes
vivienherq Sep 23, 2023
224d2a7
Update README.md
vivienherq Sep 23, 2023
8ec8d9e
Refactor classes into packages
vivienherq Sep 23, 2023
ddb13e1
Configure build.gradle to create fat JAR file
vivienherq Sep 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions data/dude.txt

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file can be excluded from commits!

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
T | 0 | borrow book
D | 0 | return book | 2023-09-06T14:30
E | 0 | project meeting | Mon 2pm | 4pm
33 changes: 33 additions & 0 deletions src/main/java/Deadline.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Deadline extends Task {
LocalDateTime by;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variables should be non-public.

Suggested change
LocalDateTime by;
private LocalDateTime by;

Deadline(String description, LocalDateTime by) {
super(description);
this.by = by;
}
@Override
public String getType() {
return "deadline";
}
@Override
public String saveTask() {
String data = "D | ";
if (this.isDone()) {
data += "1 | ";
} else {
data += "0 | ";
}
data += this.getDescription();
data = data + " | " + this.by + "\n"; // ISO-8601 e.g. 2023-09-06T14:30
return data;
}
@Override
public String toString() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy hh:mm a", Locale.ENGLISH);
String formattedDateTime = by.format(formatter);
return "[D]" + super.toString() + " (by: " + formattedDateTime + ")";
}
}
213 changes: 213 additions & 0 deletions src/main/java/Dude.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
import java.io.*;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Imported classes should be listed explicitly 😁

Suggested change
import java.io.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.Scanner;
import java.util.ArrayList;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Dude {

static ArrayList<Task> taskList = new ArrayList<Task>();
static int nTasks = 0;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of having an nTasks to keep track of the number of tasks in taskList why not use taskList.size()?


private static final String FILE_PATH = "./data/dude.txt";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This constant doesn't seem to be used. Did you forget to replace your instances of "./data/dude.txt" with FILE_PATH?


public static void addTodo(String task) {
ToDo newTask = new ToDo(task);
// taskList[nTasks] = newTask;
taskList.add(newTask);
System.out.printf("Got it. I've added this task:\n%s\n", newTask.toString());
nTasks += 1;
System.out.printf("Now you have %d tasks in the list. \n", nTasks);
}
public static void addDeadline(String task, LocalDateTime by) {
Deadline newTask = new Deadline(task, by);
// taskList[nTasks] = newTask;
taskList.add(newTask);
System.out.printf("Got it. I've added this task:\n%s\n", newTask.toString());
nTasks += 1;
System.out.printf("Now you have %d tasks in the list. \n", nTasks);
}
public static void addEvent(String task, String from, String to) {
Event newTask = new Event(task, from, to);
// taskList[nTasks] = newTask;
taskList.add(newTask);
System.out.printf("Got it. I've added this task:\n%s\n", newTask.toString());
nTasks += 1;
System.out.printf("Now you have %d tasks in the list. \n", nTasks);
}

public static void delete(int n) {
Task removedTask = taskList.get(n-1);
taskList.remove(n-1);
nTasks -= 1;
System.out.println("Noted. I've removed this task:");
System.out.println(removedTask.toString());
System.out.printf("Now you have %d tasks in the list.\n", nTasks);

}

public static void list() {
for (int i = 0; i < nTasks; i++) {
Task task = taskList.get(i);
// Task task = taskList[i];

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are using comments to temporarily remove code, however comments should be used to describe the code to the reader. They should also be indented to the relative position to your code i.e. the // needs to be on the same line as Task on line 47

System.out.printf("%d. %s\n", i+1, task.toString());
}
}

public static void mark(int n) {
taskList.get(n-1).setDone(true);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For clarity, perhaps you can split this line up into

selectedTask = taskList.get(n-1);
selectedTask.setDone(true);

System.out.println("Nice! I've marked this task as done:");
System.out.printf("%d. %s\n", n, taskList.get(n-1).toString());
}

public static void unmark(int n) throws IOException {
taskList.get(n-1).setDone(false);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Operators should be surrounded by a space character.

Suggested change
taskList.get(n-1).setDone(false);
taskList.get(n - 1).setDone(false);

System.out.println("OK, I've marked this task as not done yet:");
System.out.printf("%d. %s\n", n, taskList.get(n-1).toString());
}

public static void bye() {
String greeting = "Bye. Hope to see you again soon!";
System.out.println(greeting);
}

public static void saveTasksToDisk() throws IOException {
String directoryPath = "./data";
String filePath = "./data/dude.txt";

File directory = new File(directoryPath);
if (!directory.exists()) {
if (directory.mkdirs()) {
System.out.println("Directory created at: " + directoryPath);
} else {
System.err.println("Failed to create directory.");
return;
}
}

File file = new File(filePath);
if (!file.exists()) {
try {
if (file.createNewFile()) {
System.out.println("File created at: " + filePath);
} else {
System.err.println("Failed to create the file.");
}
} catch (IOException e) {
System.err.println("An error occurred while creating the file: " + e.getMessage());
}
}

String data = "";
for (int i = 0; i < nTasks; i++) {
Task task = taskList.get(i);
data += task.saveTask();
}
try {
FileWriter fw = new FileWriter(file);
fw.write(data);
fw.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}

public static void loadTasksFromDisk() throws FileNotFoundException {
String filePath = "./data/dude.txt";

try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
//System.out.println(line);
String[] taskInfo = line.split("\\s+\\|\\s+");

Task task;

if (taskInfo[0].equals("T")) {
task = new ToDo(taskInfo[2]);
task.setDone(taskInfo[1] == "1");
taskList.add(task);
nTasks += 1;
} else if (taskInfo[0].equals("D")) {
String byInput = taskInfo[3]; // ISO-8601 e.g. 2023-09-06T14:30
LocalDateTime by = LocalDateTime.parse(byInput);
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
// LocalDateTime by = LocalDateTime.parse(byInput, formatter);
task = new Deadline(taskInfo[2], by);
task.setDone(taskInfo[1] == "1");
taskList.add(task);
nTasks += 1;
} else if (taskInfo[0].equals("E")) {
task = new Event(taskInfo[2], taskInfo[3], taskInfo[4]);
task.setDone(taskInfo[1] == "1");
taskList.add(task);
nTasks += 1;
}
}
} catch (IOException e) {
System.err.println("An error occurred while reading the file: " + e.getMessage());
}
}

public static void main(String[] args) throws IOException {
String greeting = "Hello, I'm Dude!\n" +
"What can I do for you?";
System.out.println(greeting);

loadTasksFromDisk();
System.out.printf("You have %d saved tasks:\n", nTasks);
list();
while (true) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] words = input.split(" ");

if (words[0].equals("list")) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps you can use switch statements for the control flow instead of if-else statements

list();
} else if (words[0].equals("bye")) {
bye();
break;
} else if (words[0].equals("mark")) {
mark(Integer.valueOf(words[1]));
saveTasksToDisk();
} else if (words[0].equals("unmark")) {
unmark(Integer.valueOf(words[1]));
saveTasksToDisk();
} else if (words[0].equals("todo")) {
if (words.length > 1) {
addTodo(input.substring(5));
saveTasksToDisk();
} else {
System.out.println("OOPS!!! The description of a todo cannot be empty.");
}
} else if (words[0].equals("deadline")) {
if (words.length == 1) {
System.out.println("OOPS!!! The description of a deadline cannot be empty.");
}

String[] taskWords = input.substring(9).split(" /by ");
String byInput = taskWords[1]; //dd/mm/yyyy hh:mm format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime by = LocalDateTime.parse(byInput, formatter);
addDeadline(taskWords[0], by);
saveTasksToDisk();
} else if (words[0].equals("event")) {
if (words.length == 1) {
System.out.println("OOPS!!! The description of an event cannot be empty.");
}
String[] taskWords = input.substring(6).split(" /");
String from = taskWords[1].substring(5);
String to = taskWords[2].substring(3);
addEvent(taskWords[0], from, to);
saveTasksToDisk();
} else if (words[0].equals("delete")) {
delete(Integer.valueOf(words[1]));
} else {
System.out.println(" OOPS!!! I'm sorry, but I don't know what that means :-(");
}



}
}
}
10 changes: 0 additions & 10 deletions src/main/java/Duke.java

This file was deleted.

29 changes: 29 additions & 0 deletions src/main/java/Event.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
public class Event extends Task {
private String from;
private String to;
Event(String description, String from, String to) {
super(description);
this.from = from;
this.to = to;
}
@Override
public String getType() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps you can add a @Override above your getType() method to specify that you wish to override this method from Task

return "event";
}
@Override
public String saveTask() {
String data = "E | ";
if (this.isDone()) {
data += "1 | ";
} else {
data += "0 | ";
}
data += this.getDescription();
data = data + " | " + this.from + " | " + this.to + "\n";
return data;
}
@Override
public String toString() {
return "[E]" + super.toString() + " (from: " + from + " to: " + to + ")";
}
}
35 changes: 35 additions & 0 deletions src/main/java/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
public class Task {
private String description;
private boolean done;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

booleans variables should be named to sound like booleans

Suggested change
private boolean done;
private boolean isDone;


Task(String description) {
this.description = description;
this.done = false;
}

public boolean isDone() {
return this.done;
}

public String getDescription() {
return this.description;
}

public void setDone(boolean done) {
this.done = done;
}

public String getType() {
return "task";
}
public String saveTask () {return this.description; }

@Override
public String toString() {
String doneStatus = "[ ]";
if (this.isDone()) {
doneStatus = "[X]";
}
return doneStatus + " " + this.description;
}
}
24 changes: 24 additions & 0 deletions src/main/java/ToDo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
public class ToDo extends Task {
ToDo(String description) {
super(description);
}
@Override
public String getType() {
return "todo";
}
@Override
public String saveTask() {
String data = "T | ";
if (this.isDone()) {
data += "1 | ";
} else {
data += "0 | ";
}
data = data + this.getDescription() + "\n";
return data;
}
@Override
public String toString() {
return "[T]" + super.toString();
}
}
9 changes: 2 additions & 7 deletions text-ui-test/EXPECTED.TXT
Original file line number Diff line number Diff line change
@@ -1,7 +1,2 @@
Hello from
____ _
| _ \ _ _| | _____
| | | | | | | |/ / _ \
| |_| | |_| | < __/
|____/ \__,_|_|\_\___|

Hello, I'm Dude!
What can I do for you?
2 changes: 1 addition & 1 deletion text-ui-test/runtest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ then
fi

# run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT
java -classpath ../bin Duke < input.txt > ACTUAL.TXT
java -classpath ../bin Dude < input.txt > ACTUAL.TXT

# convert to UNIX format
cp EXPECTED.TXT EXPECTED-UNIX.TXT
Expand Down