A CLI for working with Advent of Code (AOC) problems
Project description
Automating your Advent of Code (AOC) Workflow: aoctools
Introduction
aoctools is a command line interface (cli) that helps you automate
Advent of Code (AOC) boilerplate, e.g., downloading
the day's problem input and writing python boilerplate.
Workflow
Step 0: Install
pip3 install aoctools
Step 1: Initialize a project
usage: aoctools init [-h] root_path year
positional arguments:
root_path the root project directory
year
The init command will create an aoctools project at the path that you
specify.
Step 2: Bootstrap the boilerplate for a new day
Make sure that you set an environment variable named AOC_SESSION_COOKIE to the
session cookie of your AOC login; in Chrome, you can obtain this cookie by
opening Developer Tools (View > Developer > Developer Tools), opening the
Application tab, and looking for the value that appears next to session.
As an alternative to setting this variable every time that you run the tool, aoctools supports .env files. You can create a .env file under your
project directory and run aoctools from said directory for an even more
ergonomic workflow. NB: .env files are loaded relative to the working
directory (where you run aoctools from) - not the project directory.
usage: aoctools init_day [-h] [--root-path [ROOT_PATH]] [--year YEAR]
[--skip-bootstrap] [--skip-download]
[--session-cookie SESSION_COOKIE]
day
positional arguments:
day aoc challenge day
optional arguments:
-h, --help show this help message and exit
--root-path [ROOT_PATH]
the root project directory; defaults to the current
working directory
--year YEAR aoc challenge year; defaults to the project year
--skip-bootstrap don't generate python boilerplate
--skip-download don't download the challenge input data
--session-cookie SESSION_COOKIE
an AOC login session cookie; defaults to the
environment variable AOC_SESSION_COOKIE
If you want to generate boilerplate for the challenge day without downloading
the day's input file, pass --skip-download to the aoctools init_day
command; you can download the day's input file later by passing
--skip-bootstrap; NB: the init_day command will not clobber existing
python files, so running it twice without passing --skip-bootstrap will fail.
Step 3: Hack
Bootstrapping will generate a new module under the root aoc module named after
the freshly bootstrapped day. For example, running aoctools init_day 1 will
create a file named aoc/d01/main.py containing:
from typing import IO
def p_1(input_file: IO,
debug=False): # pylint: disable=unused-argument
pass
def p_2(input_file: IO,
debug=False): # pylint: disable=unused-argument
pass
Filling in p_1 and p_2 is where you come in; aoctools requires that
you return a (stringifiable) value if you want to use the built-in solution
printer and regression test framework, but there are no restrictions beyond
that.
Running your solution with aoctools will result in p_1 or p_2 being
called with a reference to the input file; semantically, it's the same as if
you had written:
import aoc.d01
if __name__ == '__main__':
with open('data/d01/input.txt', 'r', encoding='utf8') as input_file:
aoc.d01.p_1(input_file, False) # or True
and run the file from the root of your project directory. The debug variable
is set via the cli and makes it easy to control print output:
def p_1(input_file: IO, debug=False):
v_1 = 1
v_2 = 2
if debug:
print(f"v_1 + v_2 = {v_1} + {v_2} = {v_1 + v_2}")
return v_1 + v_2
Step 4: Test the example inputs
Create a new example by running the init_example command:
usage: aoctools init_example [-h] [--root-path [ROOT_PATH]]
day {1,2} expected [example_number]
positional arguments:
day aoc challenge day
{1,2} the challenge part for the example
expected the expected example value
example_number aoc challenge day; optional (autoincrement)
optional arguments:
-h, --help show this help message and exit
--root-path [ROOT_PATH]
the root project directory; defaults to the current
working directory
Examples are created in data/day/example_n.txt. By default, your examples will
be numbered sequentially; you can specify a number explicitly by passing an
additional [example_number] argument.
Example files take the form:
part: 1
expected: 2
1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc
The first line must be part: (1|2) corresponding to the part of the AOC
problem that the example pertains to. The second line must be an expected
value: expected: (.+). The third line must be blank line. The rest of the file
should contain the example text.
Run examples via the run_examples command:
usage: aoctools run_examples [-h] [--root-path [ROOT_PATH]] [--debug]
day [example_number]
positional arguments:
day aoc challenge day
example_number the example to run; defaults to all examples
optional arguments:
-h, --help show this help message and exit
--root-path [ROOT_PATH]
the root project directory
--debug print debug info
You must specify a day. You can optionally specify a specific example to run; by default, all examples for the given day will run.
Step 5: Run your solution
usage: aoctools run [-h] [--root-path [ROOT_PATH]] [--debug] day {1,2}
positional arguments:
day aoc challenge day
{1,2} the challenge part to run
optional arguments:
-h, --help show this help message and exit
--root-path [ROOT_PATH]
the root project directory
--debug print debug info
As an example, you can run Day 1, Pt 1 from your root project directory by invoking:
aoctools run 1 1
solution to day 1, part 1: xxxx
Step 6 (Optional): Regression tests & Code Quality
Once you identify a solution you can populate the automatically generated
regression tests under tests/aoc/test_d*:
import aoc.d01
from tests.aoc.test_base import BaseTestCase
class TestAll(BaseTestCase):
def test_part_one(self):
self.run_aoc_part(1, CHANGEME, aoc.d01.p_1)
def test_part_two(self):
self.run_aoc_part(1, CHANGEME, aoc.d01.p_2)
Running make test from the root project directory will run all regression
tests.
Similarly, running make lint will type lint and type check your code and
tests with both pylint and mypy.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file aoctools-0.2.0.tar.gz.
File metadata
- Download URL: aoctools-0.2.0.tar.gz
- Upload date:
- Size: 10.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/3.9.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91a5ef3afa0691c1688797fef962672a0bd5961ffcbd398f6be3c3912dd40d71
|
|
| MD5 |
7ed424802c53536d0e6a5e1a92cd0886
|
|
| BLAKE2b-256 |
d1a471d6056c1c1c25c001b625ad8e4b62152bbe6b21d5ca7668c33bf97d58c4
|