Skip to content

Commit d8ec6b5

Browse files
authored
Merge pull request #16 from Task-Tracker-Systems/activities
Add Activities to Usecases and CLI
2 parents 1e84095 + 92ec5df commit d8ec6b5

File tree

13 files changed

+211
-19
lines changed

13 files changed

+211
-19
lines changed

Task-Tracker-CLI/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ repositories {
1515
dependencies {
1616
testImplementation(kotlin("test"))
1717
implementation("com.github.kotlin-inquirer:kotlin-inquirer:0.1.0")
18+
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
1819
implementation("com.garbereder.tasktracker.usecases:Task-Tracker-Usecases:1.0-SNAPSHOT")
1920
implementation("com.garbereder.tasktracker.entities:Task-Tracker-Entities:1.0-SNAPSHOT")
2021
implementation("com.garbereder.tasktracker.entities-impl:Task-Tracker-Entities-Impl:1.0-SNAPSHOT")
Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
2-
import com.garbereder.tasktracker.entities.TaskCollection
3-
import com.garbereder.tasktracker.entities.TaskCollectionImpl
4-
import com.garbereder.tasktracker.usecases.tasks.AddTask
5-
import com.garbereder.tasktracker.usecases.tasks.ListTasks
6-
import com.garbereder.tasktracker.usecases.tasks.LoadTasks
7-
import com.garbereder.tasktracker.usecases.tasks.TaskCollectionReader
1+
import com.garbereder.tasktracker.entities.*
2+
import com.garbereder.tasktracker.usecases.tasks.*
83
import com.github.kinquirer.KInquirer
4+
import com.github.kinquirer.components.promptConfirm
95
import com.github.kinquirer.components.promptInput
106
import com.github.kinquirer.components.promptList
117
import kotlin.system.exitProcess
@@ -17,27 +13,53 @@ fun main() {
1713
return TaskCollectionImpl()
1814
}
1915
}).invoke()
20-
val addTask : (tasks: TaskCollection) -> Unit = {
16+
17+
val activities: ActivityCollection = ActivityCollectionImpl()
18+
19+
val addTask: () -> Unit = {
2120
val taskName = KInquirer.promptInput("Task name:")
2221
AddTask(tasks, taskName).invoke()
2322
}
24-
val listTasks : (tasks: TaskCollection) -> Unit = {
25-
val taskIterator = ListTasks(tasks).invoke()
26-
while(taskIterator.hasNext()) {
27-
println(taskIterator.next().name)
28-
}
23+
24+
val listTasks: () -> Unit = {
25+
val taskIterator = ListTasks(tasks).invoke()
26+
val taskList = mutableMapOf<String, Task>()
27+
while (taskIterator.hasNext()) {
28+
val task = taskIterator.next()
29+
taskList[task.name] = task
30+
}
31+
val selection: String = KInquirer.promptList("What do you want to start?", taskList.keys.toList())
32+
val activity = StartActivity(taskList[selection]!!).invoke()
33+
activities.add(activity)
34+
val stop = KInquirer.promptConfirm("${activity.task} started at ${activity.start}. Finish now?")
35+
if (stop) {
36+
val stoppedActivity = StopActivity(activity).invoke()
37+
activities.add(stoppedActivity)
38+
activities.remove(activity)
39+
println("${stoppedActivity.task} started at ${stoppedActivity.start} and finished at ${stoppedActivity.end}")
40+
}
2941
}
30-
val quit : (tasks: TaskCollection) -> Unit = {
31-
exitProcess(0)
42+
43+
val listActivities: () -> Unit = {
44+
val actIt = activities.iterator()
45+
while (actIt.hasNext()) {
46+
println(actIt.next())
3247
}
48+
}
49+
50+
val quit: () -> Unit = {
51+
exitProcess(0)
52+
}
53+
3354
val choices = mapOf(
3455
"AddTask" to addTask,
3556
"ListTask" to listTasks,
57+
"ListActivities" to listActivities,
3658
"Quit" to quit
3759
)
38-
while(true) {
60+
while (true) {
3961
val selection: String = KInquirer.promptList("What do you want to do?", choices.keys.toList())
40-
choices[selection]!!.invoke(tasks)
62+
choices[selection]!!.invoke()
4163
}
4264

4365
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.garbereder.tasktracker.entities
2+
3+
class ActivityCollectionImpl : ActivityCollection {
4+
5+
private val list = mutableListOf<Activity>()
6+
override fun add(activity: Activity) {
7+
list.add(activity)
8+
}
9+
10+
override fun iterator(): Iterator<Activity> = list.iterator()
11+
12+
override fun remove(activity: Activity) {
13+
if (!list.contains(activity))
14+
throw ActivityNotFoundException(activity)
15+
list.remove(activity)
16+
}
17+
18+
}

Task-Tracker-Entities/src/commonMain/kotlin/com/garbereder/tasktracker/entities/Activity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import kotlinx.datetime.LocalDateTime
44

55
data class Activity(
66
val id: String,
7-
val startUTC: LocalDateTime,
8-
val endUTC: LocalDateTime,
7+
val start: LocalDateTime,
8+
val end: LocalDateTime?,
99
val task: Task
1010
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.garbereder.tasktracker.entities
2+
3+
class ActivityNotFoundException(activity: Activity): Exception("Could not find activity: $activity") {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.garbereder.tasktracker.entities
2+
3+
import kotlinx.datetime.Clock
4+
import kotlinx.datetime.TimeZone
5+
import kotlinx.datetime.toLocalDateTime
6+
import kotlin.test.Test
7+
import kotlin.test.assertEquals
8+
9+
class ActivityNotFoundExceptionTests {
10+
11+
@Test
12+
fun testMessage() {
13+
val task = Task("TaskId", "TaskName")
14+
val start = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
15+
val end = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
16+
val activity = Activity("1", start, end, task )
17+
val ex = ActivityNotFoundException(activity)
18+
assertEquals("Could not find activity: Activity(id=1, start=${start}, end=${end}, task=${task})", ex.message)
19+
}
20+
21+
}

Task-Tracker-Usecases/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ kotlin {
1616
sourceSets {
1717
val commonMain by getting {
1818
dependencies {
19+
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
1920
implementation("com.garbereder.tasktracker.entities:Task-Tracker-Entities:1.0-SNAPSHOT")
2021
}
2122
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.garbereder.tasktracker.usecases.tasks
2+
3+
import com.garbereder.tasktracker.entities.Activity
4+
import com.garbereder.tasktracker.entities.ActivityCollection
5+
import com.garbereder.tasktracker.entities.Task
6+
import com.garbereder.tasktracker.usecases.UseCase
7+
import kotlinx.datetime.Clock
8+
9+
import kotlinx.datetime.TimeZone
10+
import kotlinx.datetime.toLocalDateTime
11+
12+
class AddActivity(private val collection: ActivityCollection, private val activity: Activity): UseCase<Unit> {
13+
override fun invoke(): Unit = collection.add(activity)
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.garbereder.tasktracker.usecases.tasks
2+
3+
import com.garbereder.tasktracker.entities.Activity
4+
import com.garbereder.tasktracker.entities.Task
5+
import com.garbereder.tasktracker.usecases.UseCase
6+
import kotlinx.datetime.Clock
7+
8+
import kotlinx.datetime.TimeZone
9+
import kotlinx.datetime.toLocalDateTime
10+
11+
class StartActivity(private val task: Task): UseCase<Activity> {
12+
override fun invoke(): Activity = Activity("1", Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()), null, task)
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.garbereder.tasktracker.usecases.tasks
2+
3+
import com.garbereder.tasktracker.entities.Activity
4+
import com.garbereder.tasktracker.entities.Task
5+
import com.garbereder.tasktracker.usecases.UseCase
6+
import kotlinx.datetime.Clock
7+
8+
import kotlinx.datetime.TimeZone
9+
import kotlinx.datetime.toLocalDateTime
10+
11+
class StopActivity(private val activity: Activity): UseCase<Activity> {
12+
override fun invoke(): Activity = activity.copy(end = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()))
13+
}

0 commit comments

Comments
 (0)