historia 0.5.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. historia-0.5.8/.github/.codecov.yml +20 -0
  2. historia-0.5.8/.github/CODE_OF_CONDUCT.md +46 -0
  3. historia-0.5.8/.github/workflows/build_and_upload_docker_image_dev.yml +47 -0
  4. historia-0.5.8/.github/workflows/build_and_upload_docker_image_latest.yml +63 -0
  5. historia-0.5.8/.github/workflows/daily_link_checker.yml +44 -0
  6. historia-0.5.8/.github/workflows/daily_tests.yml +29 -0
  7. historia-0.5.8/.github/workflows/release_pypi.yml +33 -0
  8. historia-0.5.8/.github/workflows/testing.yml +36 -0
  9. historia-0.5.8/.gitignore +9 -0
  10. historia-0.5.8/.pre-commit-config.yaml +35 -0
  11. historia-0.5.8/AGENTS.md +16 -0
  12. historia-0.5.8/CHANGELOG.md +50 -0
  13. historia-0.5.8/LICENSE.txt +21 -0
  14. historia-0.5.8/PKG-INFO +71 -0
  15. historia-0.5.8/README.md +20 -0
  16. historia-0.5.8/containers/Dockerfile.dev +10 -0
  17. historia-0.5.8/containers/Dockerfile.latest +9 -0
  18. historia-0.5.8/docs/.readthedocs.yaml +14 -0
  19. historia-0.5.8/docs/README.md +17 -0
  20. historia-0.5.8/docs/_static/custom.css +20 -0
  21. historia-0.5.8/docs/api/index.rst +8 -0
  22. historia-0.5.8/docs/assets/historia-logo.png +0 -0
  23. historia-0.5.8/docs/conf.py +57 -0
  24. historia-0.5.8/docs/development/index.md +168 -0
  25. historia-0.5.8/docs/index.rst +19 -0
  26. historia-0.5.8/docs/installation/index.md +7 -0
  27. historia-0.5.8/docs/tutorial/index.md +205 -0
  28. historia-0.5.8/pyproject.toml +138 -0
  29. historia-0.5.8/src/historia/__init__.py +8 -0
  30. historia-0.5.8/src/historia/_add_to_project.py +1152 -0
  31. historia-0.5.8/src/historia/_cli.py +220 -0
  32. historia-0.5.8/src/historia/_create_project.py +139 -0
  33. historia-0.5.8/src/historia/_globals.py +10 -0
  34. historia-0.5.8/src/historia/_minify.py +24 -0
  35. historia-0.5.8/src/historia/data/__init__.py +4 -0
  36. historia-0.5.8/src/historia/data/github/__init__.py +5 -0
  37. historia-0.5.8/src/historia/data/github/_dump.py +110 -0
  38. historia-0.5.8/src/historia/data/github/_fetch_info.py +159 -0
  39. historia-0.5.8/src/historia/data/github/_update.py +26 -0
  40. historia-0.5.8/src/historia/project/__init__.py +10 -0
  41. historia-0.5.8/tests/test_add_to_project.py +1780 -0
  42. historia-0.5.8/tests/test_api_fetch.py +85 -0
  43. historia-0.5.8/tests/test_api_submodules.py +50 -0
  44. historia-0.5.8/tests/test_cli.py +328 -0
  45. historia-0.5.8/tests/test_collect_unique_urls.py +27 -0
  46. historia-0.5.8/tests/test_dump/expected_dumps/version-0+1/username-codycbakerphd/request-graphql/year-2026/month-01/day-05/info-issues+opened_date-2026+01+05.json +3 -0
  47. historia-0.5.8/tests/test_dump/expected_dumps/version-0+1/username-codycbakerphd/request-graphql/year-2026/month-01/day-05/info-prs+opened_date-2026+01+05.json +5 -0
  48. historia-0.5.8/tests/test_dump/expected_dumps/version-0+1/username-codycbakerphd/request-rest/year-2026/month-01/day-05/info-issues+opened_date-2026+01+05.json +110 -0
  49. historia-0.5.8/tests/test_dump/expected_dumps/version-0+1/username-codycbakerphd/request-rest/year-2026/month-01/day-05/info-prs+opened_date-2026+01+05.json +430 -0
  50. historia-0.5.8/tests/test_dump/test_graphql_api_dump.py +62 -0
@@ -0,0 +1,20 @@
1
+ # Allowed placement and naming from https://docs.codecov.com/docs/codecov-yaml#can-i-name-the-file-codecovyml
2
+ comment:
3
+ layout: "reach, diff, flags, files"
4
+ behavior: once
5
+ require_changes: true # if true: only post the comment if coverage changes
6
+ require_base: no # [yes :: must have a base report to post]
7
+ require_head: yes # [yes :: must have a head report to post]
8
+
9
+ codecov:
10
+ notify:
11
+ require_ci_to_pass: yes
12
+
13
+ coverage:
14
+ status:
15
+ project: off
16
+ patch: off
17
+
18
+ ignore:
19
+ - "./tests/"
20
+ - "./pyproject.toml"
@@ -0,0 +1,46 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ ## Our Standards
8
+
9
+ Examples of behavior that contributes to creating a positive environment include:
10
+
11
+ * Using welcoming and inclusive language
12
+ * Being respectful of differing viewpoints and experiences
13
+ * Gracefully accepting constructive criticism
14
+ * Focusing on what is best for the community
15
+ * Showing empathy towards other community members
16
+
17
+ Examples of unacceptable behavior by participants include:
18
+
19
+ * The use of sexualized language or imagery and unwelcome sexual attention or advances
20
+ * Trolling, insulting/derogatory comments, and personal or political attacks
21
+ * Public or private harassment
22
+ * Publishing others’ private information, such as a physical or electronic address, without explicit permission
23
+ * Other conduct which could reasonably be considered inappropriate in a professional setting
24
+
25
+ ## Our Responsibilities
26
+
27
+ Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28
+
29
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+ ## Scope
32
+
33
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34
+
35
+ ## Enforcement
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38
+
39
+ Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership.
40
+
41
+ ## Attribution
42
+
43
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44
+
45
+ [homepage]: http://contributor-covenant.org
46
+ [version]: http://contributor-covenant.org/version/1/4/
@@ -0,0 +1,47 @@
1
+ name: Test dev container (and push on merge)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ pull_request:
6
+ push:
7
+ branches:
8
+ - main
9
+
10
+ jobs:
11
+ build-test-push:
12
+ name: Build and test dev image
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: read
16
+ packages: write
17
+
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Set up QEMU
23
+ uses: docker/setup-qemu-action@v3
24
+
25
+ - name: Set up Docker Buildx
26
+ uses: docker/setup-buildx-action@v3
27
+
28
+ - name: Build image
29
+ uses: docker/build-push-action@v6
30
+ with:
31
+ context: .
32
+ file: containers/Dockerfile.dev
33
+ load: true
34
+ push: false
35
+ tags: ghcr.io/codycbakerphd/historia:dev
36
+
37
+ - name: Login to GitHub Container Registry
38
+ if: github.event_name != 'pull_request'
39
+ uses: docker/login-action@v3
40
+ with:
41
+ registry: ghcr.io
42
+ username: ${{ github.repository_owner }}
43
+ password: ${{ secrets._GITHUB_API_KEY }}
44
+
45
+ - name: Push to GHCR
46
+ if: github.event_name != 'pull_request'
47
+ run: docker push ghcr.io/codycbakerphd/historia:dev
@@ -0,0 +1,63 @@
1
+ name: Build and upload latest release Docker image to GHCR
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ workflow_run:
6
+ workflows: [Release to PyPI]
7
+ types: [completed]
8
+
9
+ jobs:
10
+ release-image:
11
+ name: Build and upload release image
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ packages: write
16
+
17
+ steps:
18
+ - name: Checkout release tag
19
+ uses: actions/checkout@v4
20
+ with:
21
+ ref: ${{ github.event.release.tag_name }}
22
+
23
+ - name: Derive image tags
24
+ id: image_tags
25
+ env:
26
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
27
+ run: |
28
+ version_tag="${RELEASE_TAG#v}"
29
+ echo "latest=ghcr.io/${GITHUB_REPOSITORY,,}:latest" >> "$GITHUB_OUTPUT"
30
+ echo "versioned=ghcr.io/${GITHUB_REPOSITORY,,}:${version_tag}" >> "$GITHUB_OUTPUT"
31
+
32
+ - name: Set up QEMU
33
+ uses: docker/setup-qemu-action@v3
34
+
35
+ - name: Set up Docker Buildx
36
+ uses: docker/setup-buildx-action@v3
37
+
38
+ - name: Login to GitHub Container Registry
39
+ uses: docker/login-action@v3
40
+ with:
41
+ registry: ghcr.io
42
+ username: ${{ github.repository_owner }}
43
+ password: ${{ secrets._GITHUB_API_KEY }}
44
+
45
+ - name: Build image
46
+ uses: docker/build-push-action@v6
47
+ with:
48
+ context: .
49
+ file: containers/Dockerfile.latest
50
+ load: true
51
+ push: false
52
+ tags: ${{ steps.image_tags.outputs.latest }}
53
+
54
+ - name: Add version tag
55
+ run: docker tag "${{ steps.image_tags.outputs.latest }}" "${{ steps.image_tags.outputs.versioned }}"
56
+
57
+ - name: Smoke test image
58
+ run: docker run --rm "${{ steps.image_tags.outputs.latest }}"
59
+
60
+ - name: Push to GHCR
61
+ run: |
62
+ docker push "${{ steps.image_tags.outputs.latest }}"
63
+ docker push "${{ steps.image_tags.outputs.versioned }}"
@@ -0,0 +1,44 @@
1
+ name: Daily link checker
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 12 * * *"
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ LinkChecker:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Check links
18
+ uses: lycheeverse/lychee-action@v2
19
+ with:
20
+ args: >
21
+ --verbose
22
+ --no-progress
23
+ '**/*.md'
24
+ '**/*.rst'
25
+ '**/*.py'
26
+ fail: true
27
+ env:
28
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
+
30
+ NotifyOnFailure:
31
+ runs-on: ubuntu-latest
32
+ needs: [LinkChecker]
33
+ if: ${{ always() && needs.LinkChecker.result == 'failure' }}
34
+ steps:
35
+ - uses: dawidd6/action-send-mail@v3
36
+ with:
37
+ server_address: smtp.gmail.com
38
+ server_port: 465
39
+ username: ${{ secrets.MAIL_USERNAME }}
40
+ password: ${{ secrets.MAIL_PASSWORD }}
41
+ subject: "CI Failure: Historia Daily Link Checker"
42
+ to: cody.c.baker.phd@gmail.com
43
+ from: Historia
44
+ body: "The daily link checker workflow failed, please check status at https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_link_checker.yml"
@@ -0,0 +1,29 @@
1
+ name: Daily tests
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 12 * * *"
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ DailyTests:
10
+ permissions:
11
+ contents: read
12
+ uses: ./.github/workflows/testing.yml
13
+ secrets: inherit
14
+
15
+ NotifyOnFailure:
16
+ runs-on: ubuntu-latest
17
+ needs: [DailyTests]
18
+ if: ${{ always() && needs.DailyTests.result == 'failure' }}
19
+ steps:
20
+ - uses: dawidd6/action-send-mail@v3
21
+ with:
22
+ server_address: smtp.gmail.com
23
+ server_port: 465
24
+ username: ${{ secrets.MAIL_USERNAME }}
25
+ password: ${{ secrets.MAIL_PASSWORD }}
26
+ subject: "CI Failure: Historia Daily Tests"
27
+ to: cody.c.baker.phd@gmail.com
28
+ from: Historia
29
+ body: "The daily test workflow failed, please check status at https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_tests.yml"
@@ -0,0 +1,33 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ release:
8
+ types:
9
+ - published
10
+
11
+ jobs:
12
+ publish:
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: read
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Setup Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.13"
24
+
25
+ - name: Build package
26
+ run: |
27
+ python -m pip install --upgrade pip build
28
+ python -m build
29
+
30
+ - name: Publish package to PyPI
31
+ uses: pypa/gh-action-pypi-publish@release/v1
32
+ with:
33
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,36 @@
1
+ name: Testing
2
+
3
+ on:
4
+ pull_request:
5
+ workflow_call:
6
+
7
+ env:
8
+ GITHUB_TOKEN: ${{ secrets._GITHUB_API_KEY }}
9
+
10
+ jobs:
11
+ Testing:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Setup Python
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: 3.13
24
+
25
+ - name: Install
26
+ run: pip install -e . pytest-cov
27
+
28
+ - name: Run tests
29
+ run: pytest --cov=src/historia --cov-report=xml
30
+
31
+ - name: Upload coverage to Codecov
32
+ uses: codecov/codecov-action@v5
33
+ with:
34
+ token: ${{ secrets.CODECOV_TOKEN }}
35
+ files: ./coverage.xml
36
+ fail_ci_if_error: true
@@ -0,0 +1,9 @@
1
+ *.idea
2
+ /**/__pycache__/
3
+ uv*
4
+ .DS_Store
5
+ *.DS_Store
6
+ coverage.xml
7
+ .coverage
8
+ docs/_build/
9
+ docs/api/generated/
@@ -0,0 +1,35 @@
1
+ default_install_hook_types:
2
+ - pre-commit
3
+
4
+ repos:
5
+ - repo: https://github.com/pre-commit/pre-commit-hooks
6
+ rev: v6.0.0
7
+ hooks:
8
+ - id: check-yaml
9
+ - id: end-of-file-fixer
10
+ - id: trailing-whitespace
11
+
12
+ - repo: https://github.com/psf/black
13
+ rev: 25.1.0
14
+ hooks:
15
+ - id: black
16
+
17
+ - repo: https://github.com/astral-sh/ruff-pre-commit
18
+ rev: v0.13.0
19
+ hooks:
20
+ - id: ruff
21
+ args: [ --fix ]
22
+
23
+ - repo: https://github.com/codespell-project/codespell
24
+ rev: v2.4.1
25
+ hooks:
26
+ - id: codespell
27
+ additional_dependencies:
28
+ - tomli
29
+
30
+ - repo: https://github.com/pre-commit/mirrors-mypy
31
+ rev: v2.0.0
32
+ hooks:
33
+ - id: mypy
34
+ additional_dependencies:
35
+ - types-requests
@@ -0,0 +1,16 @@
1
+ # Agent instructions
2
+
3
+ - Always run `pre-commit` before committing and pushing changes
4
+ - To the best of your ability, ensure tests are passing
5
+ - Follow assertion style (actual on left, expected on right)
6
+ - Always mark AI-generated tests with `ai_generated` Pytest marker
7
+ - Attempt to utilize `pytest.mark.parametrize` wherever appropriate to reduce duplication in test cases
8
+ - Avoid importing private-marked API functions (those with leading underscores) and always favor importing what is publicly exposed through `__init__.py` files
9
+ - Always bump the version in `pyproject.toml` appropriately when any file under `src/` (except `tests/` or `docs/`), only once per pull request; do NOT bump the version for changes that are purely CI/workflow, documentation, or configuration (e.g. adding a GitHub Actions workflow, updating `AGENTS.md`, or editing `README.md` badges)
10
+ - Leave a short description of the change or addition in the top `## Upcoming` section of the `CHANGELOG.md` under the appropriate subsection (`### 🚀 Enhancement`, `### 🐛 Bug Fix`, `### 📝 Documentation`, `### 🔩 Dependency Updates`, or `### 🏠 Internal`); create the subsection if it does not yet exist; include the GitHub PR link at the end of each entry in the format `([#N](https://github.com/stamped-principles/stamped-checklist/pull/N))`- `### 🚀 Enhancement` — new features
11
+ - PR titles should be human-readable and in the past tense; they should NOT use conventional commit style
12
+ - Always add new imports to the top of the file rather than locally scoped inside a function; the only exception is if it is needed to avoid a circular dependency
13
+ - Never include code other than imports, `__all__`, simple import errors, or magic `__dir__` overrides in any `__init__.py` file
14
+ - For external dependencies, always avoid specific import style (e.g., using `import abc from xyz` keyword) in favor of the generic full import (e.g., `import xyz; xyz.abc`)
15
+ - For internal imports, always use the relative import style (e.g., `from .foo import bar`); when monkeypatching such imports in tests, target the importing module's binding, not the original definition module (e.g., `foo.baz`, instead of `foo._bar.baz`)
16
+ - Every commit you author MUST include a `Co-Authored-By` trailer identifying both your tool name + version and your underlying model + version. Format (replace all `<…>` placeholders with actual values): `Co-Authored-By: <Tool> <tool-version> / <Model> <model-version> <noreply@<vendor-domain>>
@@ -0,0 +1,50 @@
1
+ # Changelog
2
+
3
+ ## Upcoming
4
+
5
+ ### 🏠 Internal
6
+
7
+ - Updated the PyPI release workflow to also trigger on `v*` tag pushes so PyPI uploads occur when a tag is cut, in addition to GitHub release publication. ([#57](https://github.com/CodyCBakerPhD/historia/pull/57))
8
+
9
+ ## v0.5.8
10
+
11
+ ### 📝 Documentation
12
+
13
+ - Added tutorial to the docs showing step-by-step usage of the CLI and Python API for data collection, minification, project creation, population, date updates, and status transitions. ([#50](https://github.com/CodyCBakerPhD/historia/pull/50))
14
+ - Added AI usage addendum to the developer guide covering commit co-authorship requirements when AI tools contribute to commits, and updated `AGENTS.md` with the co-authorship rule. ([#48](https://github.com/CodyCBakerPhD/historia/pull/48))
15
+ - Added the Historia logo to the README and documentation landing page, and configured docs rendering so the landing-page logo remains non-clickable without the dark-mode background wrapper. ([#39](https://github.com/CodyCBakerPhD/historia/pull/39))
16
+ - Added a centered README badge block for PyPI version, supported Python versions, CI workflows, coverage, and license status. ([#37](https://github.com/CodyCBakerPhD/historia/pull/37))
17
+ - Added basic developer documentation page that embeds `AGENTS.md` content via MyST include directive. ([#44](https://github.com/CodyCBakerPhD/historia/pull/44))
18
+ - Added Sphinx documentation scaffolding with the PyData theme, API autodocs, and Read the Docs configuration for hosted docs builds. ([#19](https://github.com/CodyCBakerPhD/historia/pull/19))
19
+ - Added a GitHub icon link to the docs navbar for quick navigation back to the repository, and removed the "Show Source" page links that exposed raw HTML output. ([#42](https://github.com/CodyCBakerPhD/historia/pull/42))
20
+ - Set Sphinx Python signature rendering options to use Black-style wrapping behavior in API docs output. ([#19](https://github.com/CodyCBakerPhD/historia/pull/19))
21
+
22
+ ### 🚀 Enhancement
23
+
24
+ - Generalized project status transitions so `historia project transition` can move items from any source status to any destination status via `--status` and `--new`. ([#47](https://github.com/CodyCBakerPhD/historia/pull/47))
25
+ - Simplified CLI option names to dash-free forms (for example `--url` and `--placeholder`) while preserving snake_case keyword routing in command handlers. ([#46](https://github.com/CodyCBakerPhD/historia/pull/46))
26
+ - Added data-update routing at `historia data update github ...`, with GitHub-specific data APIs nested under `historia.data.github` (including `historia.data.github.update(...)`), and exposed `historia._cli.historia_data_update_cli` for plugin-oriented extension. ([#38](https://github.com/CodyCBakerPhD/historia/pull/38))
27
+ - Removed REST request modes and related logic so data collection now consistently uses GitHub GraphQL APIs. ([#6](https://github.com/CodyCBakerPhD/historia/pull/6))
28
+ - Reorganized the CLI into nested `data` and `project` command groups, including `historia project update dates`, so operations were grouped by type and better mirrored API structure. ([#12](https://github.com/CodyCBakerPhD/historia/pull/12))
29
+ - Added mirrored API submodule groupings at `historia.data` and `historia.project` (including `historia.project.update`) to align import paths with the CLI domain structure. ([#12](https://github.com/CodyCBakerPhD/historia/pull/12))
30
+ - Limited top-level `historia` exports to submodules (`historia.data`, `historia.project`) so package imports consistently follow domain-grouped API paths. ([#12](https://github.com/CodyCBakerPhD/historia/pull/12))
31
+ - Renamed the root CLI function to `historia_cli` and exposed it for plugin integrations as both `historia._cli.historia_cli` and `historia.historia_cli`, while preserving private aliases. ([#12](https://github.com/CodyCBakerPhD/historia/pull/12))
32
+ - Unpacked project date updates to `historia.project.update_project_item_dates` and removed the `historia.project.update` submodule layer entirely. ([#34](https://github.com/CodyCBakerPhD/historia/pull/34))
33
+
34
+ ### 🐛 Bug Fix
35
+
36
+ - Fixed GraphQL rate-limit handling to return an empty result set without raising key errors, and updated tests to be deterministic/offline-compatible. ([#6](https://github.com/CodyCBakerPhD/historia/pull/6))
37
+ - Fixed Sphinx API reference pages to render autodoc content for documented module members instead of appearing empty under the toctree. ([#19](https://github.com/CodyCBakerPhD/historia/pull/19))
38
+
39
+ ### 🏠 Internal
40
+
41
+ - Expanded ruff lint rules to `select = ["ALL"]` and resolved all newly enabled violations, including adding request timeouts, fixing exception chaining, converting to absolute imports, and collapsing implicit string concatenations. ([#48](https://github.com/CodyCBakerPhD/historia/pull/48))
42
+ - Added mypy via pre-commit mirror for static type checking, with all pre-existing type errors resolved. ([#45](https://github.com/CodyCBakerPhD/historia/pull/45))
43
+ - Added a scheduled daily link checker workflow using `lycheeverse/lychee-action` that scans all Markdown, RST, and Python files for broken links, with a separate email notification track to distinguish failures from daily test failures. ([#51](https://github.com/CodyCBakerPhD/historia/pull/51))
44
+ - Added GHCR Dockerfiles and GitHub Actions workflows to publish `dev` and release-tagged `latest` container images. ([#36](https://github.com/CodyCBakerPhD/historia/pull/36))
45
+ - Added a GitHub Actions release workflow to automatically build and publish packages to PyPI when a release is published. ([#32](https://github.com/CodyCBakerPhD/historia/pull/32))
46
+ - Enhanced CLI tests to cover all commands (`data minify`, `project populate`, `project transition`), failure/error paths, and subgroup help output, using parametrize for exception-type variants. ([#33](https://github.com/CodyCBakerPhD/historia/pull/33))
47
+ - Rewrote repetitive API export tests to use pytest parametrization and reduce duplication. ([#17](https://github.com/CodyCBakerPhD/historia/pull/17))
48
+ - Added Codecov integration to track test coverage on every pull request. ([#18](https://github.com/CodyCBakerPhD/historia/pull/18))
49
+ - Added a scheduled daily testing workflow that reuses the shared testing workflow via `workflow_call` to avoid duplicate CI configuration. ([#29](https://github.com/CodyCBakerPhD/historia/pull/29))
50
+ - Added email notification to the daily tests workflow to alert on failures via `dawidd6/action-send-mail`. ([#40](https://github.com/CodyCBakerPhD/historia/pull/40))
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Historia
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,71 @@
1
+ Metadata-Version: 2.4
2
+ Name: historia
3
+ Version: 0.5.8
4
+ Summary: Collects GitHub activity for use in project dashboards.
5
+ Author-email: Cody Baker <cody.c.baker.phd@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Historia
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+ License-File: LICENSE.txt
28
+ Keywords: GitHub,data collection,project management,work history
29
+ Classifier: Development Status :: 4 - Beta
30
+ Classifier: Intended Audience :: Developers
31
+ Classifier: Intended Audience :: Science/Research
32
+ Classifier: License :: OSI Approved :: MIT License
33
+ Classifier: Operating System :: MacOS
34
+ Classifier: Operating System :: Microsoft :: Windows
35
+ Classifier: Operating System :: Unix
36
+ Classifier: Programming Language :: Python
37
+ Classifier: Programming Language :: Python :: 3.10
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Classifier: Programming Language :: Python :: 3.14
42
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
43
+ Requires-Python: >=3.10
44
+ Requires-Dist: ipython
45
+ Requires-Dist: pre-commit
46
+ Requires-Dist: pytest
47
+ Requires-Dist: requests
48
+ Requires-Dist: rich-click
49
+ Requires-Dist: tqdm
50
+ Description-Content-Type: text/markdown
51
+
52
+ # Historia
53
+
54
+ <p align="center">
55
+ <img alt="Historia logo" src="https://raw.githubusercontent.com/CodyCBakerPhD/historia/main/docs/assets/historia-logo.png" width="320">
56
+ </p>
57
+
58
+ <p align="center">
59
+ <a href="https://pypi.org/project/historia/"><img alt="PyPI latest release version" src="https://badge.fury.io/py/historia.svg"></a>
60
+ <a href="https://pypi.org/project/historia/"><img alt="Supported Python versions" src="https://img.shields.io/pypi/pyversions/historia.svg"></a>
61
+ <a href="https://codecov.io/gh/CodyCBakerPhD/historia"><img alt="codecov" src="https://codecov.io/gh/CodyCBakerPhD/historia/branch/main/graph/badge.svg"></a>
62
+ </p>
63
+ <p align="center">
64
+ <a href="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_tests.yml"><img alt="Daily tests" src="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_tests.yml/badge.svg"></a>
65
+ <a href="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_link_checker.yml"><img alt="Daily link checker" src="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_link_checker.yml/badge.svg"></a>
66
+ <a href="https://github.com/CodyCBakerPhD/historia/blob/main/LICENSE.txt"><img alt="License" src="https://img.shields.io/pypi/l/historia.svg"></a>
67
+ </p>
68
+
69
+ A command-line tool for backing up records of GitHub activity for use in creating dashboard reports of work history.
70
+
71
+ For full documentation, visit [historia.readthedocs.io](https://historia.readthedocs.io).
@@ -0,0 +1,20 @@
1
+ # Historia
2
+
3
+ <p align="center">
4
+ <img alt="Historia logo" src="https://raw.githubusercontent.com/CodyCBakerPhD/historia/main/docs/assets/historia-logo.png" width="320">
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://pypi.org/project/historia/"><img alt="PyPI latest release version" src="https://badge.fury.io/py/historia.svg"></a>
9
+ <a href="https://pypi.org/project/historia/"><img alt="Supported Python versions" src="https://img.shields.io/pypi/pyversions/historia.svg"></a>
10
+ <a href="https://codecov.io/gh/CodyCBakerPhD/historia"><img alt="codecov" src="https://codecov.io/gh/CodyCBakerPhD/historia/branch/main/graph/badge.svg"></a>
11
+ </p>
12
+ <p align="center">
13
+ <a href="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_tests.yml"><img alt="Daily tests" src="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_tests.yml/badge.svg"></a>
14
+ <a href="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_link_checker.yml"><img alt="Daily link checker" src="https://github.com/CodyCBakerPhD/historia/actions/workflows/daily_link_checker.yml/badge.svg"></a>
15
+ <a href="https://github.com/CodyCBakerPhD/historia/blob/main/LICENSE.txt"><img alt="License" src="https://img.shields.io/pypi/l/historia.svg"></a>
16
+ </p>
17
+
18
+ A command-line tool for backing up records of GitHub activity for use in creating dashboard reports of work history.
19
+
20
+ For full documentation, visit [historia.readthedocs.io](https://historia.readthedocs.io).
@@ -0,0 +1,10 @@
1
+ FROM python:3.13-slim
2
+
3
+ LABEL org.opencontainers.image.source="https://github.com/CodyCBakerPhD/historia"
4
+ LABEL org.opencontainers.image.description="A Docker image of the latest development version of Historia."
5
+
6
+ ADD ./ historia
7
+ RUN cd historia && python -m pip install --no-cache-dir .
8
+
9
+ ENTRYPOINT ["historia"]
10
+ CMD ["--help"]
@@ -0,0 +1,9 @@
1
+ FROM python:3.13-slim
2
+
3
+ LABEL org.opencontainers.image.source="https://github.com/CodyCBakerPhD/historia"
4
+ LABEL org.opencontainers.image.description="A Docker image of the latest released version of Historia."
5
+
6
+ RUN pip install --no-cache-dir nwb2bids
7
+
8
+ ENTRYPOINT ["historia"]
9
+ CMD ["--help"]
@@ -0,0 +1,14 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-24.04
5
+ tools:
6
+ python: "3.13"
7
+ jobs:
8
+ install:
9
+ - pip install --upgrade pip
10
+ - pip install . --group docs
11
+
12
+ sphinx:
13
+ configuration: docs/conf.py
14
+ fail_on_warning: true
@@ -0,0 +1,17 @@
1
+ Project documentation is built with [Sphinx](https://www.sphinx-doc.org/) using the [PyData Sphinx Theme](https://pydata-sphinx-theme.readthedocs.io/).
2
+
3
+ ### Building Locally
4
+
5
+ Install the docs dependencies:
6
+
7
+ ```bash
8
+ pip install -e . --group docs
9
+ ```
10
+
11
+ Build the HTML output:
12
+
13
+ ```bash
14
+ python -m sphinx -b html docs docs/_build/html
15
+ ```
16
+
17
+ Open `docs/_build/html/index.html` in your browser to preview the result.
@@ -0,0 +1,20 @@
1
+ /* Make sphinx-tabs follow the pydata-sphinx-theme background
2
+ in both light and dark mode, instead of using prefers-color-scheme. */
3
+ .sphinx-tabs-panel,
4
+ .sphinx-tabs-tab {
5
+ background-color: var(--pst-color-background) !important;
6
+ color: var(--pst-color-text-base) !important;
7
+ }
8
+
9
+ .sphinx-tabs-tab[aria-selected="true"] {
10
+ background-color: var(--pst-color-on-background) !important;
11
+ border-bottom-color: var(--pst-color-on-background) !important;
12
+ }
13
+
14
+ .sphinx-tabs-panel {
15
+ border-color: var(--pst-color-border) !important;
16
+ }
17
+
18
+ .sphinx-tabs-tab {
19
+ border-color: var(--pst-color-border) !important;
20
+ }
@@ -0,0 +1,8 @@
1
+ API reference
2
+ =============
3
+
4
+ .. autosummary::
5
+ :toctree: generated
6
+
7
+ historia.data
8
+ historia.project