From 47ce56b6abdc96727dcd979c6f8f7910241bf8ad Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Fri, 23 Oct 2020 16:40:01 +0200 Subject: [PATCH 1/3] cli: add `--track-dir` option With this commit, we can now establish a beginning state by specifying: - a track directory - a problem-specifications directory - the offline mode This allows us to do black-box testing of the release binary, running something like: configlet -t /tmp/python -p /tmp/my_prob_specs --offline and then asserting that the changes made are as expected. Closes: #50 --- README.md | 1 + src/cli.nim | 6 ++++++ src/sync/tracks.nim | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 121fa261..7e19daac 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Options for uuid: Global options: -h, --help Show this help message and exit --version Show this tool's version information and exit + -t, --track-dir Specify a track directory to use instead of the current directory -v, --verbosity The verbosity of output. Allowed values: q[uiet], n[ormal], d[etailed] ``` diff --git a/src/cli.nim b/src/cli.nim index ea3acb27..4576acc6 100644 --- a/src/cli.nim +++ b/src/cli.nim @@ -35,11 +35,13 @@ type Conf* = object action*: Action + trackDir*: string verbosity*: Verbosity Opt = enum optHelp = "help" optVersion = "version" + optTrackDir = "trackDir" optVerbosity = "verbosity" optSyncExercise = "exercise" optSyncCheck = "check" @@ -110,6 +112,7 @@ func genHelpText: string = for opt in Opt: let paramName = case opt + of optTrackDir: "dir" of optVerbosity: "verbosity" of optSyncExercise: "slug" of optSyncMode: "mode" @@ -127,6 +130,7 @@ func genHelpText: string = const descriptions: array[Opt, string] = [ optHelp: "Show this help message and exit", optVersion: "Show this tool's version information and exit", + optTrackDir: "Specify a track directory to use instead of the current directory", optVerbosity: &"The verbosity of output. {allowedValues(Verbosity)}", optSyncExercise: "Only sync this exercise", optSyncCheck: "Terminates with a non-zero exit code if one or more tests " & @@ -310,6 +314,8 @@ proc handleOption(conf: var Conf; kind: CmdLineKind; key, val: string) = showHelp() of optVersion: showVersion() + of optTrackDir: + setGlobalOpt(trackDir, val) of optVerbosity: setGlobalOpt(verbosity, parseVal[Verbosity](kind, key, val)) else: diff --git a/src/sync/tracks.nim b/src/sync/tracks.nim index 77e90e95..93e28930 100644 --- a/src/sync/tracks.nim +++ b/src/sync/tracks.nim @@ -83,5 +83,9 @@ proc findTrackExercises(repo: TrackRepo, conf: Conf): seq[TrackExercise] = result.add(newTrackExercise(repoExercise)) proc findTrackExercises*(conf: Conf): seq[TrackExercise] = - let trackRepo = newTrackRepo() + let trackRepo = + if conf.trackDir.len > 0: + TrackRepo(dir: conf.trackDir) + else: + newTrackRepo() trackRepo.findTrackExercises(conf) From 4f3ff45e887a04ee44234bf5d5e13c22984b3abb Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Mon, 25 Jan 2021 20:07:49 +0100 Subject: [PATCH 2/3] sync: support `--track-dir` Previously the test file path was always derived from the working directory. --- src/sync/exercises.nim | 8 ++++---- src/sync/sync.nim | 11 ++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/sync/exercises.nim b/src/sync/exercises.nim index 2d1aad61..595f5cb8 100644 --- a/src/sync/exercises.nim +++ b/src/sync/exercises.nim @@ -75,8 +75,8 @@ proc status*(exercise: Exercise): ExerciseStatus = proc hasCanonicalData*(exercise: Exercise): bool = exercise.testCases.len > 0 -proc testsFile(exercise: Exercise): string = - getCurrentDir() / "exercises" / exercise.slug / ".meta" / "tests.toml" +proc testsFile(exercise: Exercise, trackDir: string): string = + trackDir / "exercises" / exercise.slug / ".meta" / "tests.toml" proc toToml(exercise: Exercise): string = result.add("[canonical-tests]\n") @@ -89,8 +89,8 @@ proc toToml(exercise: Exercise): string = result.add(&"\n# {testCase.description}") result.add(&"\n\"{testCase.uuid}\" = {isIncluded}\n") -proc writeTestsToml*(exercise: Exercise) = - let testsPath = testsFile(exercise) +proc writeTestsToml*(exercise: Exercise, trackDir: string) = + let testsPath = testsFile(exercise, trackDir) createDir(testsPath.parentDir()) let contents = toToml(exercise) diff --git a/src/sync/sync.nim b/src/sync/sync.nim index 7ba14ecf..7dbd2923 100644 --- a/src/sync/sync.nim +++ b/src/sync/sync.nim @@ -64,9 +64,10 @@ proc syncDecision(testCase: ExerciseTestCase, mode: Mode): SyncDecision = of modeChoose: chooseSyncDecision(testCase) -proc sync(exercise: Exercise, mode: Mode): Exercise = +proc sync(exercise: Exercise, conf: Conf): Exercise = result = exercise + let mode = conf.action.mode case mode of modeInclude: logNormal(&"[info] {exercise.slug}: included {exercise.tests.missing.len} missing test cases") @@ -100,13 +101,13 @@ proc sync(exercise: Exercise, mode: Mode): Exercise = result.tests = initExerciseTests(included, excluded, missing) - writeTestsToml(result) + writeTestsToml(result, conf.trackDir) -proc sync(exercises: seq[Exercise], mode: Mode): seq[Exercise] = +proc sync(exercises: seq[Exercise], conf: Conf): seq[Exercise] = for exercise in exercises: case exercise.status of exOutOfSync: - result.add(sync(exercise, mode)) + result.add(sync(exercise, conf)) of exInSync: logDetailed(&"[skip] {exercise.slug} is up-to-date") of exNoCanonicalData: @@ -116,7 +117,7 @@ proc sync*(conf: Conf) = logNormal("Syncing exercises...") let exercises = findExercises(conf) - let syncedExercises = sync(exercises, conf.action.mode) + let syncedExercises = sync(exercises, conf) if syncedExercises.anyIt(it.status == exOutOfSync): logNormal("[warn] some exercises are still missing test cases") From 0a06da65a121f343899ee9ed9f3e554552d14a68 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Tue, 26 Jan 2021 15:30:01 +0100 Subject: [PATCH 3/3] cli: set `conf.trackDir` explicitly to current directory Previously `conf.trackDir` was the empty string when `--track-dir` was not provided. That worked previously because code like let myPath = "" / "foo" resolves to "foo" in the current directory, but setting it explicitly is more obvious. --- src/cli.nim | 6 ++++-- src/sync/tracks.nim | 9 +-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/cli.nim b/src/cli.nim index 4576acc6..e9819fc0 100644 --- a/src/cli.nim +++ b/src/cli.nim @@ -217,9 +217,11 @@ func initAction*(actionKind: ActionKind, probSpecsDir = ""): Action = of actUuid: Action(kind: actionKind, num: 1) -func initConf*(action = initAction(actNil), verbosity = verNormal): Conf = +func initConf*(action = initAction(actNil), trackDir = getCurrentDir(), + verbosity = verNormal): Conf = result = Conf( action: action, + trackDir: trackDir, verbosity: verbosity, ) @@ -289,7 +291,7 @@ proc handleArgument(conf: var Conf; kind: CmdLineKind; key: string) = if conf.action.kind == actNil: let actionKind = parseActionKind(key) let action = initAction(actionKind) - conf = initConf(action, conf.verbosity) + conf = initConf(action, conf.trackDir, conf.verbosity) else: showError(&"invalid argument for command '{conf.action.kind}': '{key}'") diff --git a/src/sync/tracks.nim b/src/sync/tracks.nim index 93e28930..76429769 100644 --- a/src/sync/tracks.nim +++ b/src/sync/tracks.nim @@ -24,9 +24,6 @@ type tests*: TrackExerciseTests repoExercise: TrackRepoExercise -proc newTrackRepo: TrackRepo = - result.dir = getCurrentDir() - proc configJsonFile(repo: TrackRepo): string = repo.dir / "config.json" @@ -83,9 +80,5 @@ proc findTrackExercises(repo: TrackRepo, conf: Conf): seq[TrackExercise] = result.add(newTrackExercise(repoExercise)) proc findTrackExercises*(conf: Conf): seq[TrackExercise] = - let trackRepo = - if conf.trackDir.len > 0: - TrackRepo(dir: conf.trackDir) - else: - newTrackRepo() + let trackRepo = TrackRepo(dir: conf.trackDir) trackRepo.findTrackExercises(conf)