Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
68c58c1
Add Gradle support
May 24, 2020
03523ec
Bump gradle and lib version
Eclipse-Dominator Aug 5, 2023
81a9c53
build.gradle: Prevent generating a second JAR file
aureliony Jul 16, 2024
1422d2f
Rename Duke
WFYishere Sep 17, 2025
79a382e
Add support for echo
WFYishere Sep 17, 2025
b9739fc
Add support for storing tasks
WFYishere Sep 17, 2025
5b28cd4
Add support for marking tasks done/undone
WFYishere Sep 17, 2025
902ce1e
Add the three subclasses
WFYishere Sep 17, 2025
898b5b8
A-TextUiTesting
WFYishere Sep 17, 2025
319bf9b
A-TextUiTesting
WFYishere Sep 17, 2025
96053d4
Add error handling for invalid commands
WFYishere Sep 17, 2025
14bb0d2
Add support for deleting tasks from the list.
WFYishere Sep 17, 2025
6cb99d6
Introduce TaskType enum and refactor tasks to use it
WFYishere Sep 17, 2025
85274b1
Persist tasks to ./data/duke.txt; load on startup; autosave on add/de…
WFYishere Sep 18, 2025
74c9f8e
Use LocalDate for Deadline and Event; format nicely for display
WFYishere Sep 18, 2025
1f0060f
Merge branch 'branch-Level-8'
WFYishere Sep 18, 2025
0283999
Robust loading — flexible separators and tolerant ISO-first date parsing
WFYishere Sep 18, 2025
3ff516b
Merge branch 'branch-Level-8'
WFYishere Sep 18, 2025
8cffddf
Refactor Quokka to use Ui, Parser, TaskList; persist via Storage
WFYishere Sep 18, 2025
bd12253
Merge branch 'branch-A-MoreOOP'
WFYishere Sep 18, 2025
2122ba3
branch-A-Packages
WFYishere Sep 18, 2025
32f8f24
Merge branch 'branch-A-Packages'
WFYishere Sep 18, 2025
e067b00
Merge branch 'master' into branch-A-Gradle
WFYishere Sep 18, 2025
95ed097
Sync feature branch with master; set application.mainClass
WFYishere Sep 18, 2025
37d5f00
Merge branch 'branch-A-Gradle'
WFYishere Sep 18, 2025
8bf8076
Make date parsing drop trailing time tokens; tests pass
WFYishere Sep 20, 2025
d64cc82
Merge branch 'branch-A-JUnit'
WFYishere Sep 20, 2025
474c051
Configure Shadow to produce runnable Duke.jar with Main-Class
WFYishere Sep 20, 2025
f124809
Merge branch 'branch-A-Jar'
WFYishere Sep 20, 2025
5acbfa7
Add 'find' command with TaskList.find() and UI results view
WFYishere Sep 20, 2025
0cf0cd0
Merge branch 'branch-Level-9'
WFYishere Sep 20, 2025
6ae7ab2
Add class and method JavaDocs to core components
WFYishere Sep 20, 2025
a3c4f69
Merge branch 'branch-A-JavaDoc'
WFYishere Sep 20, 2025
529d9f0
Apply project code style, optimize imports, add .editorconfig
WFYishere Sep 20, 2025
55413c3
Merge branch 'branch-A-CodingStandard'
WFYishere Sep 20, 2025
f2836a9
Update README.md
WFYishere Sep 20, 2025
b0bca05
Update README.md
WFYishere Sep 20, 2025
40cf4c7
Update README.md
WFYishere Sep 20, 2025
08291a8
Checkstyle completed (finally)
WFYishere Sep 20, 2025
c27d7f3
Merge branch 'branch-A-CheckStyle'
WFYishere Sep 20, 2025
390431c
Add JavaFX (Main, Launcher); Gradle deps per tutorial; switch mainCla…
WFYishere Sep 20, 2025
cd06b61
Merge branch 'branch-Level-10'
WFYishere Sep 20, 2025
c6168a3
Make TaskList.add(...) and Ui.showError(...) accept varargs (backward…
WFYishere Sep 20, 2025
50b3dd2
Produce JavaFX fat JAR via Shadow (bundles OpenJFX); Main-Class=quokk…
WFYishere Sep 20, 2025
68ed0b4
A-Varargs: Accept varargs in TaskList.add and Ui.showError
WFYishere Sep 20, 2025
61bc924
A-Assertions: Guard parser outputs and event date order; enable -ea
WFYishere Sep 20, 2025
bd616aa
Merge pull request #2 from WFYishere/branch-A-Assertions
WFYishere Sep 20, 2025
1b95a6a
A-CodeQuality: centralize date parsing; remove magic strings; guard c…
WFYishere Sep 20, 2025
3037df8
Merge branch 'master' into branch-A-Streams
WFYishere Sep 20, 2025
65f4c8a
add StreamsHelper utility using Java Streams and Optional
WFYishere Sep 20, 2025
bd1f033
Merge branch 'branch-A-Streams'
WFYishere Sep 20, 2025
9bfb6fe
C-Sort command to sort tasks alphabetically
WFYishere Sep 20, 2025
98ad92e
add AI.md and annotate AI-assisted change in Quokka
WFYishere Sep 20, 2025
b05a8be
Improve the GUI to make it more polished.
WFYishere Sep 20, 2025
433b869
Personality Given v1
WFYishere Sep 20, 2025
5530cb0
Improve the code to handle all errors you anticipate the product will…
WFYishere Sep 20, 2025
c475b9c
Finalize the features
WFYishere Sep 20, 2025
d452986
Enable GitHub Pages
WFYishere Sep 20, 2025
cdaa537
Release v0.2
WFYishere Sep 20, 2025
e255cb7
Final release
WFYishere Sep 20, 2025
415ffd0
Update README.md
WFYishere Sep 20, 2025
426cc41
test(dates): add fmt() formatting test
WFYishere Sep 23, 2025
41d7cd9
merge: integrate remote master
WFYishere Sep 23, 2025
d76316d
refactor(event): use imported Dates methods
WFYishere Sep 23, 2025
0519afb
docs(tasklist): document duplicate check logic
WFYishere Sep 23, 2025
e77ae37
test(dates): add fmt() formatting test
WFYishere Sep 23, 2025
0c61331
docs(dates): add Javadoc for parseStrictDate
WFYishere Sep 23, 2025
e34cfb5
docs(reply): document factory methods
WFYishere Sep 23, 2025
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
9 changes: 9 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
max_line_length = 120
27 changes: 11 additions & 16 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
# IDEA files
/.idea/
/out/
/*.iml

# Gradle build files
/.gradle/
/build/
src/main/resources/docs/

# MacOS custom attributes files created by Finder
.DS_Store
# Java/Gradle
.gradle/
build/
out/
target/
**/*.class
# IntelliJ
.idea/
*.iml
bin/

/text-ui-test/ACTUAL.TXT
text-ui-test/EXPECTED-UNIX.TXT
# OS
.DS_Store
Thumbs.db
17 changes: 17 additions & 0 deletions AI.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# AI-Assisted Development Log

This project uses AI tools to increase productivity while meeting iP requirements.

## Tools Used
- ChatGPT (OpenAI): prompt-driven code assistance and review suggestions.

## Usage Records

### 2025-09-20 — C-Sort (Category C Extension)
- **What AI did:** Suggested a minimal insertion for a `sort` command inside the existing command switch in `src/main/java/quokka/Quokka.java`, keeping the codebase structure unchanged (no new classes).
- **Why helpful:** Reduced implementation time and ensured zero behavior drift elsewhere.
- **Developer review:** Verified that the change compiles and that the command behaves as intended (alphabetical, case-insensitive).

## Notes
- AI suggestions are treated as drafts; final decisions and verifications are done by the developer.
- This file will be updated if/when more AI-assisted changes are adopted.
60 changes: 34 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,34 @@
# Duke project template

This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it.

## Setting up in Intellij

Prerequisites: JDK 17, update Intellij to the most recent version.

1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first)
1. Open the project into Intellij as follows:
1. Click `Open`.
1. Select the project directory, and click `OK`.
1. If there are any further prompts, accept the defaults.
1. Configure the project to use **JDK 17** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).<br>
In the same dialog, set the **Project language level** field to the `SDK default` option.
1. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output:
```
Hello from
____ _
| _ \ _ _| | _____
| | | | | | | |/ / _ \
| |_| | |_| | < __/
|____/ \__,_|_|\_\___|
```

**Warning:** Keep the `src\main\java` folder as the root folder for Java files (i.e., don't rename those folders or move Java files to another folder outside of this folder path), as this is the default location some tools (e.g., Gradle) expect to find Java files.
# Quokka iP

> “Your mind is for having ideas, not holding them.” — David Allen
> _(via_ [Getting Things Done](https://gettingthingsdone.com) _)_

Quokka is a text-based task manager that’s *simple*, **fast**, and ~~bug-prone~~ **robust** 😉.

## Highlights
- Text UI you can use from any terminal
- Tasks: **Todo**, **Deadline**, **Event**
- Dates parsed as `yyyy-MM-dd` and displayed as `MMM d yyyy`
- Persistent storage in a human-editable file

## Quick Start
1. Download the latest JAR from the **Releases** page.
2. Open a terminal in the folder containing the JAR.
3. Run: `java -jar "Duke.jar"`.
4. Add tasks, `list` them, then `bye`.

## Sample Session
```java
// Commands you can try
todo read book
deadline return book /by 2019-10-15
event project /from 2019-12-01 /to 2019-12-02
list
bye
````

More info:

* Main class: `quokka.Quokka`
* Releases: [Download Quokka.jar](https://github.com/WFYishere/ip/releases)

101 changes: 101 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
plugins {
id 'java'
id 'application'
id 'com.github.johnrengelman.shadow' version '7.1.2'
id 'checkstyle'
}

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0'

String javaFxVersion = '17.0.7'

implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac'
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux'

implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac'
implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux'

implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac'
implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux'

implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac'
implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux'
}


checkstyle {
toolVersion = '10.12.4'
maxWarnings = 0
config = resources.text.fromString(
'''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="TreeWalker">
<module name="NeedBraces"/>
</module>
</module>'''
)
}


tasks.withType(Checkstyle).configureEach {
reports {
xml.required.set(false)
html.required.set(true)
}
}

test {
useJUnitPlatform()
jvmArgs '-ea'

testLogging {
events "passed", "skipped", "failed"

showExceptions true
exceptionFormat "full"
showCauses true
showStackTraces true
showStandardStreams = false
}
}

application {
mainClass.set('quokka.Launcher')
applicationDefaultJvmArgs = ['-ea']
}

jar {
manifest {
attributes('Main-Class': application.mainClass.get())
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

shadowJar {
archiveFileName = 'Quokka.jar'
archiveClassifier = null
manifest { attributes('Main-Class': application.mainClass.get()) }
mergeServiceFiles()
exclude 'module-info.class'
}

run{
standardInput = System.in
}
48 changes: 48 additions & 0 deletions config/checkstyle/checkstyle.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>

<module name="SuppressionFilter">
<property name="file" value="config/checkstyle/suppressions.xml"/>
<property name="optional" value="true"/>
</module>

<module name="NewlineAtEndOfFile"/>
<module name="FileTabCharacter"/>
<module name="OuterTypeFilename"/>
<module name="LineLength">
<property name="max" value="120"/>
<property name="ignorePattern" value="^package .*|^import .*"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="message" value="Trailing spaces are not allowed."/>
</module>

<module name="TreeWalker">
<module name="NeedBraces"/>
<module name="WhitespaceAround"/>
<module name="WhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="NoWhitespaceAfter"/>
<module name="EmptyBlock"/>

<module name="MissingJavadocType">
<property name="scope" value="public"/>
<property name="violateExecutionOnNonTightHtml" value="false"/>
</module>
<module name="MissingJavadocMethod">
<property name="scope" value="public"/>
<property name="allowMissingPropertyJavadoc" value="true"/>
<property name="minLineCount" value="2"/>
</module>

<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="caseIndent" value="4"/>
<property name="lineWrappingIndentation" value="8"/>
<property name="throwsIndent" value="4"/>
</module>
</module>
</module>
5 changes: 5 additions & 0 deletions config/checkstyle/suppressions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppressions>
<!-- Don’t require JavaDoc in tests -->
<suppress files="src[\\/]test[\\/]java[\\/].*" checks="MissingJavadoc.*"/>
</suppressions>
4 changes: 4 additions & 0 deletions data/tasks.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
T | 0 | book
T | 0 | buy milk
D | 0 | submit assignment | 2025-09-30
E | 0 | hackathon | 2025-09-10 | 2025-09-12
Loading