5 Commits
1.0.2 ... 1.0.7

4 changed files with 35 additions and 29 deletions

View File

@ -2,7 +2,7 @@
## ===================================
import asyncdispatch, base64, bcrypt, cliutils, docopt, jester, json, logging,
ospaths, sequtils, strutils, os, tables, times, uuids
sequtils, strutils, os, tables, times, uuids
import nre except toSeq
@ -39,7 +39,7 @@ proc loadApiConfig*(json: JsonNode): PtkApiCfg =
template halt(code: HttpCode,
headers: RawHeaders,
content: string): typed =
content: string) =
## Immediately replies with the specified request. This means any further
## code will not be executed after calling this template in the current
## route.

View File

@ -1 +1 @@
const PTK_VERSION* = "1.0.2"
const PTK_VERSION* = "1.0.7"

50
ptk.nim
View File

@ -3,10 +3,10 @@
##
## Simple time keeping CLI
import algorithm, docopt, json, langutils, logging, os, nre, sequtils,
sets, strutils, tempfile, terminal, times, uuids
import algorithm, docopt, json, langutils, logging, os, nre, std/wordwrap,
sequtils, sets, strutils, tempfile, terminal, times, uuids
import timeutils except `-`;
import timeutils except `-`
import private/util
import private/api
@ -98,7 +98,7 @@ proc writeMarks(timeline: Timeline, indices: seq[int], includeNotes = false): vo
if includeNotes and len(w.mark.notes.strip) > 0:
writeLine(stdout, "")
let wrappedNotes = wordWrap(s = w.mark.notes,
let wrappedNotes = wrapWords(s = w.mark.notes,
maxLineWidth = colWidth)
for line in splitLines(wrappedNotes):
writeLine(stdout, spaces(notesPrefixLen) & line)
@ -123,10 +123,12 @@ proc doInit(timelineLocation: string): void =
type ExpectedMarkPart = enum Time, Summary, Tags, Notes
proc edit(mark: var Mark): void =
proc edit(mark: Mark): Mark =
## Interactively edit a mark using the editor named in the environment
## variable "EDITOR"
result = mark
var
tempFile: File
tempFileName: string
@ -142,22 +144,26 @@ proc edit(mark: var Mark): void =
tempFile.writeLine(
"""# Everything from the line below to the end of the file will be considered
# notes for this timeline mark.""")
tempFile.write(mark.notes)
close(tempFile)
tempFile = nil
discard os.execShellCmd "$EDITOR " & tempFileName & " </dev/tty >/dev/tty"
var markPart = Time
var notes: seq[string] = @[]
for line in lines tempFileName:
if strip(line)[0] == '#': continue
elif markPart == Time: mark.time = parseTime(line); markPart = Summary
elif markPart == Summary: mark.summary = line; markPart = Tags
if strip(line).len > 0 and strip(line)[0] == '#': continue
elif markPart == Time: result.time = parseTime(line); markPart = Summary
elif markPart == Summary: result.summary = line; markPart = Tags
elif markPart == Tags:
mark.tags = line.split({',', ';'});
result.tags = line.split({',', ';'});
markPart = Notes
else: mark.notes &= line & "\x0D\x0A"
else: notes.add(line)
result.notes = notes.join("\n")
finally: close(tempFile)
proc filterMarkIndices(timeline: Timeline, args: Table[string, Value]): seq[int] =
@ -166,15 +172,15 @@ proc filterMarkIndices(timeline: Timeline, args: Table[string, Value]): seq[int]
let marks = timeline.marks
let now = getTime().local
let allIndices = sequtils.toSeq(0..<marks.len).filterIt(marks[it].summary != STOP_MSG).toSet
let allIndices = sequtils.toSeq(0..<marks.len).filterIt(marks[it].summary != STOP_MSG).toHashSet
let union = args["--or"]
var selected =
if union: initSet[int]()
if union: initHashSet[int]()
else: allIndices
template filterMarks(curSet: HashSet[int], pred: untyped): untyped =
var res: HashSet[int] = initSet[int]()
var res: HashSet[int] = initHashSet[int]()
if union:
for mIdx {.inject.} in allIndices:
if pred: res.incl(mIdx)
@ -305,11 +311,11 @@ Options:
".ptkrc", $getEnv("PTKRC"), $getEnv("HOME") & "/.ptkrc"]
var ptkrcFilename: string =
foldl(ptkrcLocations, if len(a) > 0: a elif existsFile(b): b else: "")
foldl(ptkrcLocations, if len(a) > 0: a elif fileExists(b): b else: "")
var cfg: JsonNode
var cfgFile: File
if not existsFile(ptkrcFilename):
if not fileExists(ptkrcFilename):
warn "ptk: could not find .ptkrc file."
ptkrcFilename = $getEnv("HOME") & "/.ptkrc"
try:
@ -331,7 +337,7 @@ Options:
"ptk.log.json"]
var timelineLocation =
foldl(timelineLocations, if len(a) > 0: a elif existsFile(b): b else: "")
foldl(timelineLocations, if len(a) > 0: a elif fileExists(b): b else: "")
# Execute commands
if args["init"]:
@ -342,7 +348,7 @@ Options:
let filesToMerge = args["<timeline>"]
let timelines = filesToMerge.mapIt(loadTimeline(it))
let names = timelines.mapIt(it.name).toSet
let names = timelines.mapIt(it.name).toHashSet
let mergedName = sequtils.toSeq(names.items).foldl(a & " + " & b)
var merged: Timeline = (
name: mergedName,
@ -380,7 +386,7 @@ Options:
time: if args["--time"]: parseTime($args["--time"]) else: now,
summary: STOP_MSG,
notes: args["--notes"] ?: "",
tags: (args["--tags"] ?: "").split({',', ';'}).filterIt(not it.isNilOrWhitespace))
tags: (args["--tags"] ?: "").split({',', ';'}).filterIt(not it.isEmptyOrWhitespace))
timeline.marks.add(newMark)
@ -422,9 +428,9 @@ Options:
time: if args["--time"]: parseTime($args["--time"]) else: now,
summary: args["<summary>"] ?: "",
notes: args["--notes"] ?: "",
tags: (args["--tags"] ?: "").split({',', ';'}).filterIt(not it.isNilOrWhitespace))
tags: (args["--tags"] ?: "").split({',', ';'}).filterIt(not it.isEmptyOrWhitespace))
if args["--edit"]: edit(newMark)
if args["--edit"]: newMark = edit(newMark)
let prevLastIdx = timeline.marks.getLastIndex()
timeline.marks.add(newMark)
@ -454,7 +460,7 @@ Options:
notes: markToResume.notes,
tags: markToResume.tags)
if args["--edit"]: edit(newMark)
if args["--edit"]: newMark = edit(newMark)
timeline.marks.add(newMark)
timeline.writeMarks(
@ -491,7 +497,7 @@ Options:
except: raise newException(ValueError,
"invalid value for --time: " & getCurrentExceptionMsg())
if args["--edit"]: edit(mark)
if args["--edit"]: mark = edit(mark)
timeline.marks.delete(markIdx)
timeline.marks.insert(mark, markIdx)

View File

@ -1,6 +1,6 @@
# Package
version = "1.0.2"
version = "1.0.7"
author = "Jonathan Bernard"
description = "Personal Time Keeper"
license = "MIT"
@ -15,9 +15,9 @@ requires @[
"tempfile",
"isaac >= 0.1.3",
"bcrypt",
"jester 0.4.1",
"jester 0.5.0",
"https://git.jdb-labs.com/jdb/nim-lang-utils.git",
"https://git.jdb-labs.com/jdb/nim-cli-utils.git",
"https://git.jdb-labs.com/jdb/nim-cli-utils.git >= 0.6.5",
"https://git.jdb-labs.com/jdb/nim-time-utils.git >= 0.5.2",
"https://git.jdb-labs.com/jdb/update-nim-package-version"
]