Metadata-Version: 2.1
Name: pytest-aoc
Version: 1.22.0rc0
Summary: Downloads puzzle inputs for Advent of Code and synthesizes PyTest fixtures
Author-email: Joost Molenaar <jjm@j0057.nl>
License: Copyright 2018 Joost Molenaar
        
        Permission is hereby granted, free of charge, to any person obtaining a copy of
        this software and associated documentation files (the "Software"), to deal in
        the Software without restriction, including without limitation the rights to
        use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
        of the Software, and to permit persons to whom the Software is furnished to do
        so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
        
Project-URL: Homepage, https://github.com/j0057/pytest-aoc
Project-URL: Source, https://github.com/j0057/pytest-aoc
Project-URL: Tracker, https://github.com/j0057/pytest-aoc/issues
Classifier: Framework :: Pytest
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: requests
Provides-Extra: dev
Requires-Dist: pip ; extra == 'dev'
Requires-Dist: setuptools ; extra == 'dev'
Requires-Dist: setuptools-scm ; extra == 'dev'
Requires-Dist: build ; extra == 'dev'
Requires-Dist: wheel ; extra == 'dev'
Requires-Dist: twine ; extra == 'dev'
Requires-Dist: tox ; extra == 'dev'
Requires-Dist: tox-venv ; extra == 'dev'
Provides-Extra: test
Requires-Dist: pytest ; extra == 'test'
Requires-Dist: pytest-cov ; extra == 'test'
Requires-Dist: pytest-freezegun ; extra == 'test'
Requires-Dist: pytest-responses ; extra == 'test'
Requires-Dist: pytest-mock ; extra == 'test'

# pytest-aoc

This pytest plugin downloads puzzle inputs for [Advent of Code][] and
synthesizes fixtures that you can use in your tests.

[![PyPI](https://img.shields.io/pypi/v/pytest-aoc?style=flat-square)][pypi]
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pytest-aoc?style=flat-square)][pypi]
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/pytest-aoc?style=flat-square)][pypi]

[![GitHub issues](https://img.shields.io/github/issues/j0057/pytest-aoc?style=flat-square)][issues]

[![PyPI - License](https://img.shields.io/pypi/l/pytest-aoc?style=flat-square)][license]

[Advent of Code]: https://adventofcode.com/

[pypi]: https://pypi.org/project/pytest-aoc
[issues]: https://github.com/j0057/pytest-aoc/issues
[license]: ./LICENSE

## Installing and configuring

Installing is easy: `python -m pip install pytest-aoc`. Next you will need to configure
_two_ things: for which event (year) the plugin should download inputs, and a
valid session cookie. These are normally valid for about a month or so.

To set the year, put it in `setup.cfg`:

    [tool:pytest]
    aoc_year = 2018

Then, put a valid session ID in a file named `.cookie` and also name this file
in your `.gitignore`.

With these two things in place, when running pytest, this plugin will download
any missing inputs, and generate pytest fixtures that you can use in your test
functions, see 'Using' and 'Fixtures', below.

## Using

With this plugin properly configured, you can write tests like this:

    def test_01a(day01_numbers):
        assert sum(day01_numbers) == 123

Here, the parameter `day01_numbers` is a fixture that contains the numbers on
each line in the file `input/day01.txt`.

## Fixtures

These fixtures are synthesized for each available day. They're not executed
until you ask for them in a test.

- `dayNN_text`: The text in the input file, but stripped of any leading and trailing whitespace.
  ~ `"spam"`

- `dayNN_raw`: The raw text in the input file.
  ~ `"eggs\n"`

- `dayNN_lines`: A list of stripped lines.
  ~ `["spam", "eggs", "albatross"]`

- `dayNN_numbers`: A list of numbers.
  ~ `[1, 1, 2, 3, 5, 8]`

- `dayNN_number`: A single number.
  ~ `5`

- `dayNN_grid`: A list of lists, representing a grid of textual values.
  ~ `[["spam", "eggs"], ["ham", "albatross"]]`

- `dayNN_number_grid`: A list of lists, representing a grid of numbers.
  ~ `[[8, 1, 6], [3, 5, 7], [4, 9, 2]]`

## Command-line and configuration options

You can pass the options from the command line or set them in setup.cfg. The
command line takes precedence.

- `--aoc-year`/`aoc_year`: The year for which to download puzzle inputs.
  (Mandatory)
- `--aoc-session-id`: The session ID to use for requesting puzzle inputs. This
  one has no equivalent setup.cfg key; that's a security feature. (Optional)
- `--aoc-session-file`/`aoc_session_file`: The file from which to read the
  session ID. (Optional; default `.cookie`)
- `--aoc-input-dir`/`aoc_input_dir`: The directory in which inputs are stored.
  Will be created if it doesn't exist. (Optional; default `input`)

## Developing / testing

Set environment variables using `. .envrc` or by automatically loading them
using `direnv allow`.

Create a virtualenv named `env` and install an editable version of this package
with all extra development dependencies:

    python -m venv env
    python -m pip install -U -e .[dev,test]

Run tests directly, to test against the current Python, or via tox to test
against multiple Python versions:

    python -m pytest
    python -m tox

## Releasing

This package uses [setuptools-scm][] to derive the version from tags in the
Git history. I use [twine][] to upload the distribution files to PyPI and
[github-cli][] to create releases on GitHub.

The procedure goes like this:

(Optional) Tag the release version (or it will be a dev release on the next version as
derived by `setuptools-scm`) where `x.y.z` is the version:

    git tag -a x.y.z

Check that the version is actually sane:

    python -m setuptools_scm

Bake an sdist and a wheel into a clean `dist` directory:

    rm -f dist/*
    python -m build

Upload the goods to PyPI:

    python -m twine upload dist/*

Upload the goods to Github, where again `x.y.z` is the version:

    git push github master --tags
    gh release create --prerelease x.y.z dist/*

(Leave out the `--prerelease` flag as necessary.)

[setuptools-scm]: https://pypi.org/project/setuptools-scm/
[twine]: https://pypi.org/project/twine/
[github-cli]: https://cli.github.com/
