Skip to content

[yu-sutong] iP#644

Open
yu-sutong wants to merge 45 commits intonus-cs2103-AY2425S1:masterfrom
yu-sutong:master
Open

[yu-sutong] iP#644
yu-sutong wants to merge 45 commits intonus-cs2103-AY2425S1:masterfrom
yu-sutong:master

Conversation

@yu-sutong
Copy link
Copy Markdown

@yu-sutong yu-sutong commented Sep 4, 2024

MySutong frees your mind of having to remember things you need to do. It's,

  • text-based
  • easy to learn
  • SUPER FAST to use

All you need to do is,

  1. download it from here.
  2. double-click it.
  3. add your tasks.
  4. let it manage your tasks for you 😉

And it is FREE!

Features:

  • Managing tasks
  • Managing deadlines (coming soon)
  • Reminders (coming soon)

Copy link
Copy Markdown

@kevin-pek kevin-pek left a comment

Choose a reason for hiding this comment

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

LGTM, just have some nitpicks with regards to the coding standards. Have highlighted them for your consideration. Thanks!

Comment thread src/main/java/mysutong/Parser.java Outdated
Comment on lines +15 to +87
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;

case "list":
ui.showTaskList(tasks);
break;

case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;

case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;

case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;

case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;

default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Suggested change
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;
case "list":
ui.showTaskList(tasks);
break;
case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;
default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}
switch (command) {
case "bye":
ui.showGoodbye();
System.exit(0);
break;
case "list":
ui.showTaskList(tasks);
break;
case "mark":
int markIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(markIndex).markAsDone();
ui.showLine();
ui.showMessage("Nice! I've marked this task as done:");
ui.showMessage(tasks.getTask(markIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "unmark":
int unmarkIndex = Integer.parseInt(inputs[1]) - 1;
tasks.getTask(unmarkIndex).unmark();
ui.showLine();
ui.showMessage("OK, I've marked this task as not done yet:");
ui.showMessage(tasks.getTask(unmarkIndex).toString());
ui.showLine();
storage.save(tasks);
break;
case "todo":
tasks.addTask(new Todo(inputs[1]));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "deadline":
String[] deadlineDetails = inputs[1].split("/by");
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
ui.showLine();
ui.showMessage("Got it. I've added this task:");
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString());
ui.showLine();
storage.save(tasks);
break;
case "delete":
int deleteIndex = Integer.parseInt(inputs[1]) - 1;
Task removedTask = tasks.getTask(deleteIndex);
tasks.removeTask(deleteIndex);
ui.showLine();
ui.showMessage("Noted. I've removed this task:");
ui.showMessage(removedTask.toString());
ui.showLine();
storage.save(tasks);
break;
default:
throw new UnknownCommandException("I'm sorry, but I don't know what that means.");
}

The coding standard mentions that switch statements should not have indentation for case clauses. Default formatting for your IDE may have conflicted with this.

Comment thread src/main/java/mysutong/Storage.java Outdated
Comment on lines +32 to +47
switch (taskType) {
case "T":
task = new Todo(description);
break;
case "D":
LocalDateTime deadlineDate = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
task = new Deadline(description, deadlineDate);
break;
case "E":
LocalDateTime eventStart = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
LocalDateTime eventEnd = LocalDateTime.parse(parts[4], DateTimeFormatter.ofPattern("d/M/yyyy HHmm"));
task = new Event(description, eventStart, eventEnd);
break;
default:
throw new IllegalStateException("Unknown task type: " + taskType);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Same issue with switch formatting.

Comment thread src/main/java/mysutong/Storage.java Outdated
import mysutong.Deadline;
import mysutong.Event;

import java.io.*;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Imports should be made explicit according to the coding standard.

Suggested change
import java.io.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.BufferedWriter;
import java.io.IOException;

Comment thread src/main/java/mysutong/Parser.java Outdated

case "event":
String[] eventDetails = inputs[1].split("/from|/to");
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This line is past the 120 character line limit for the coding standards. It would be good to consider doing line wrapping. Alternatively you might want to separate the logic into multiple lines instead.

Suggested change
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));
tasks.addTask(new Event(eventDetails[0].trim(),
LocalDateTime.parse(eventDetails[1].trim(),
DateTimeFormatter.ofPattern("d/M/yyyy HHmm")),
LocalDateTime.parse(eventDetails[2].trim(),
DateTimeFormatter.ofPattern("d/M/yyyy HHmm"))));

# Conflicts:
#	src/main/java/mysutong/Storage.java
# Conflicts:
#	src/main/java/mysutong/Parser.java
#	src/main/java/mysutong/Ui.java
The executeCommand method in Parser handles user commands by splitting the input string into two parts: the command itself and any additional arguments.

Currently, the split operation does not validate that the input string contains at least one element, which could potentially lead to unexpected behaviour or bugs if empty input is passed.

To mitigate this, let's add an assert statement to ensure that the inputs array has at least one element. This ensures that the code always receives a valid command to process. In situations where assertions are enabled, this will help catch empty or invalid commands during development and testing.

While this doesn't address user input validation directly (since assert can be disabled in production), it adds an extra layer of safety during development.

This change also avoids unnecessary array access errors and improves the stability of the command handling logic.
This commit refactors the code to conform to the Checkstyle configuration, ensuring consistency and compliance with coding standards.

Changes made:
- Replaced wildcard imports (e.g., import static org.junit.jupiter.api.Assertions.*) with explicit imports for better clarity and to avoid unnecessary imports.
- Corrected import order to follow the standard conventions, ensuring that java.* imports are grouped together and listed alphabetically.
- Fixed spacing issues, such as ensuring a single space between comments and code, and after operators (e.g., =, +).
- Improved overall code readability and conformance to Checkstyle rules by addressing minor formatting inconsistencies.

These changes are intended to improve the maintainability of the codebase by ensuring that it follows consistent styling rules as enforced by Checkstyle. By doing this, we minimize the chances of formatting-related errors and enhance code readability across the project.

All changes are purely stylistic and do not alter the functionality of the code.
Add assertion to ensure valid command input
Refactor code style to adhere to Checkstyle guidelines
@yu-sutong yu-sutong changed the title Yu Sutong iP [yu-sutong] iP Sep 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants