3 Commits

Author SHA1 Message Date
69177ffa17 Log locations when unable to load config.
When we can't find a config file, log all the locations we looked and
don't create a new file in $HOME/.ptkrc.

There is currently an intermittent bug in the config loading logic that
is leading to the default config file in $HOME/.ptkrc not being found
and then being overwritten with the default config. This is step one in
fixing it.
2022-03-19 08:49:26 -05:00
8b6405441a Support additional date and time formats (particularly YYYY-MM-DD). 2022-01-03 08:57:43 -06:00
aff927b4f4 Fix for Nim 1.6.2 2021-12-20 17:42:55 -06:00
5 changed files with 23 additions and 13 deletions

View File

@ -1,7 +1,7 @@
## Personal Time Keeping API Interface ## Personal Time Keeping API Interface
## =================================== ## ===================================
import asyncdispatch, base64, bcrypt, cliutils, docopt, jester, json, logging, import asyncdispatch, base64, bcrypt, cliutils, docopt, httpcore, jester, json, logging,
sequtils, strutils, os, tables, times, uuids sequtils, strutils, os, tables, times, uuids
import nre except toSeq import nre except toSeq
@ -61,10 +61,10 @@ template checkAuth(cfg: PtkApiCfg) =
var user {.inject.}: PtkUser = PtkUser() var user {.inject.}: PtkUser = PtkUser()
try: try:
if not request.headers.hasKey("Authorization"): if not headers(request).hasKey("Authorization"):
raiseEx "No auth token." raiseEx "No auth token."
let headerVal = request.headers["Authorization"] let headerVal = headers(request)["Authorization"]
if not headerVal.startsWith("Basic "): if not headerVal.startsWith("Basic "):
raiseEx "Invalid Authorization type (only 'Basic' is supported)." raiseEx "Invalid Authorization type (only 'Basic' is supported)."

View File

@ -22,10 +22,18 @@ const ISO_TIME_FORMAT* = "yyyy-MM-dd'T'HH:mm:ss"
## The canonical time format used by PTK. ## The canonical time format used by PTK.
const TIME_FORMATS* = @[ const TIME_FORMATS* = @[
(fmtStr: "yyyy-MM-dd'T'HH:mm:sszzz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd HH:mm:sszzz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd'T'HH:mm:sszz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd HH:mm:sszz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd'T'HH:mm:ssz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd HH:mm:ssz", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd'T'HH:mm:ss", offsetFrom: OffsetFrom.None), (fmtStr: "yyyy-MM-dd'T'HH:mm:ss", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd HH:mm:ss", offsetFrom: OffsetFrom.None), (fmtStr: "yyyy-MM-dd HH:mm:ss", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd'T'HH:mm", offsetFrom: OffsetFrom.None), (fmtStr: "yyyy-MM-dd'T'HH:mm", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd HH:mm", offsetFrom: OffsetFrom.None), (fmtStr: "yyyy-MM-dd HH:mm", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM-dd", offsetFrom: OffsetFrom.None),
(fmtStr: "yyyy-MM", offsetFrom: OffsetFrom.None),
(fmtStr: "MM-dd'T'HH:mm:ss", offsetFrom: OffsetFrom.Year), (fmtStr: "MM-dd'T'HH:mm:ss", offsetFrom: OffsetFrom.Year),
(fmtStr: "MM-dd HH:mm:ss", offsetFrom: OffsetFrom.Year), (fmtStr: "MM-dd HH:mm:ss", offsetFrom: OffsetFrom.Year),
(fmtStr: "MM-dd'T'HH:mm", offsetFrom: OffsetFrom.Year), (fmtStr: "MM-dd'T'HH:mm", offsetFrom: OffsetFrom.Year),
@ -48,15 +56,16 @@ proc getIfExists*(n: JsonNode, key: string): JsonNode =
proc parseTime*(timeStr: string): DateTime = proc parseTime*(timeStr: string): DateTime =
## Helper to parse time strings trying multiple known formats. ## Helper to parse time strings trying multiple known formats.
let now = now()
for fmt in TIME_FORMATS: for fmt in TIME_FORMATS:
try: try:
let now = now()
let parsed = parse(timeStr, fmt.fmtStr) let parsed = parse(timeStr, fmt.fmtStr)
case fmt.offsetFrom: case fmt.offsetFrom:
of OffsetFrom.None: of OffsetFrom.None:
return parsed return parsed
of OffsetFrom.Year: of OffsetFrom.Year:
return initDateTime(parsed.monthday, parsed.month, now.year, return dateTime(now.year, parsed.month, parsed.monthday,
parsed.hour, parsed.minute, parsed.second, parsed.nanosecond, parsed.hour, parsed.minute, parsed.second, parsed.nanosecond,
now.timezone) now.timezone)
of OffsetFrom.Month: of OffsetFrom.Month:

View File

@ -1 +1 @@
const PTK_VERSION* = "1.0.10" const PTK_VERSION* = "1.0.13"

13
ptk.nim
View File

@ -318,12 +318,13 @@ Options:
var cfgFile: File var cfgFile: File
if not fileExists(ptkrcFilename): if not fileExists(ptkrcFilename):
warn "ptk: could not find .ptkrc file." warn "ptk: could not find .ptkrc file."
ptkrcFilename = $getEnv("HOME") & "/.ptkrc" debug "ptk: considered the following locations:\n\t" & ptkrcLocations.join("\n\t")
try: #ptkrcFilename = $getEnv("HOME") & "/.ptkrc"
cfgFile = open(ptkrcFilename, fmWrite) #try:
cfgFile.write("{\"timelineLogFile\": \"timeline.log.json\"}") # cfgFile = open(ptkrcFilename, fmWrite)
except: warn "ptk: could not write default .ptkrc to " & ptkrcFilename # cfgFile.write("{\"timelineLogFile\": \"timeline.log.json\"}")
finally: close(cfgFile) #except: warn "ptk: could not write default .ptkrc to " & ptkrcFilename
#finally: close(cfgFile)
try: cfg = parseFile(ptkrcFilename) try: cfg = parseFile(ptkrcFilename)
except: raise newException(IOError, except: raise newException(IOError,

View File

@ -1,6 +1,6 @@
# Package # Package
version = "1.0.10" version = "1.0.13"
author = "Jonathan Bernard" author = "Jonathan Bernard"
description = "Personal Time Keeper" description = "Personal Time Keeper"
license = "MIT" license = "MIT"