From 1971a5e4debd34fcb7ffb764f4c9dc2d2e5516d2 Mon Sep 17 00:00:00 2001 From: bakebot Date: Fri, 9 Jan 2026 22:30:07 +0000 Subject: [PATCH 1/8] Cookie updated targeting develop by NetworkToCode Cookie Drift Manager Tool Template: ``` { "template": "https://github.com/networktocode-llc/cookiecutter-ntc.git", "dir": "python", "ref": "main", "path": "/__w/cookiecutter-nautobot-app-drift-manager/cookiecutter-nautobot-app-drift-manager/cookiecutter-ntc/python" } ``` Cookie: ``` { "remote": "https://github.com/networktocode/jdiff.git", "path": "/tmp/tmpgxrdsm7e/jdiff", "repository_path": "/tmp/tmpgxrdsm7e/jdiff", "dir": "", "branch_prefix": "drift-manager/develop", "context": { "codeowner_github_usernames": "@lvrfrc87 @scetron @grelleum @jeffkala @pszulczewski", "full_name": "Network to Code, LLC", "email": "info@networktocode.com", "github_org": "networktocode", "description": "Python library for examining structured data.", "project_name": "jdiff", "project_slug": "jdiff", "repo_url": "https://github.com/networktocode/jdiff", "base_url": "jdiff", "project_python_name": "jdiff", "project_python_base_version": "3.10", "project_with_config_settings": "no", "generate_docs": "yes", "version": "1.0.1", "original_publish_year": "2022", "_template": "/__w/cookiecutter-nautobot-app-drift-manager/cookiecutter-nautobot-app-drift-manager/cookiecutter-ntc/python", "_output_dir": "/tmp/tmpgxrdsm7e", "_repo_dir": "/__w/cookiecutter-nautobot-app-drift-manager/cookiecutter-nautobot-app-drift-manager/cookiecutter-ntc/python", "_checkout": null }, "drift_managed_branch": "develop", "remote_name": "origin", "pull_request_strategy": "PullRequestStrategy.UPDATE_OR_CREATE", "post_actions": [], "baked_commit_ref": "", "draft": false } ``` CLI Arguments: ``` { "cookie_dir": "", "input": false, "json_filename": "", "output_dir": "", "push": true, "template": "./cookiecutter-ntc", "template_dir": "python", "template_ref": "main", "pull_request": "update-or-create", "post_action": [], "disable_post_actions": true, "draft": null, "drift_managed_branch": "develop" } ``` --- .cookiecutter.json | 15 + .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/ci.yml | 157 +- .github/workflows/release.yml | 106 ++ .gitignore | 2 + .readthedocs.yml | 25 +- Dockerfile | 6 +- LICENSE | 184 +-- README.md | 34 +- changes/+dne.documentation | 1 - changes/+main.housekeeping | 1 + changes/.gitignore | 1 + changes/.gitkeep | 0 changes/133.fixed | 1 - changes/134.added | 1 - changes/136.fixed | 1 - changes/140.fixed | 1 - changes/141.fixed | 1 - changes/141.housekeeping | 1 - docs/admin/release_notes/version_0.0.md | 34 - docs/admin/release_notes/version_1.0.md | 37 +- docs/admin/uninstall.md | 4 +- docs/admin/upgrade.md | 2 +- docs/assets/overrides/partials/copyright.html | 1 + docs/code-reference/jdiff/__init__.md | 1 - docs/code-reference/jdiff/check_types.md | 1 - docs/code-reference/jdiff/evaluators.md | 1 - docs/code-reference/jdiff/extract_data.md | 1 - docs/code-reference/jdiff/operator.md | 1 - docs/code-reference/jdiff/utils/__init__.md | 1 - .../jdiff/utils/data_normalization.md | 1 - .../jdiff/utils/diff_helpers.md | 1 - .../jdiff/utils/jmespath_parsers.md | 1 - docs/dev/contributing.md | 4 +- docs/dev/dev_environment.md | 6 +- docs/dev/release_checklist.md | 4 - docs/images/hld-architecture.png | Bin 69702 -> 0 bytes docs/images/hld.png | Bin 103309 -> 0 bytes docs/images/jdiff-workflow.png | Bin 43644 -> 0 bytes docs/images/jdiff_logo.png | Bin 16485 -> 0 bytes .../{assets => images}/networktocode_logo.svg | 0 docs/images/workflow.png | Bin 111146 -> 0 bytes docs/requirements.txt | 13 - docs/user/architecture.md | 126 -- docs/user/lib_getting_started.md | 75 +- docs/user/lib_overview.md | 15 +- docs/user/lib_use_cases.md | 12 + docs/user/usage.md | 727 --------- example.invoke.yml | 6 +- jdiff/__init__.py | 7 +- jdiff/api.py | 3 + jdiff/check_types.py | 263 ---- jdiff/cli.py | 27 + jdiff/evaluators.py | 117 -- jdiff/extract_data.py | 100 -- jdiff/log.py | 74 + jdiff/operator.py | 131 -- jdiff/utils/__init__.py | 1 - jdiff/utils/data_normalization.py | 83 - jdiff/utils/diff_helpers.py | 192 --- jdiff/utils/jmespath_parsers.py | 168 -- mkdocs.yml | 42 +- poetry.lock | 1373 ----------------- pyproject.toml | 48 +- tasks.py | 87 +- tests/__init__.py | 0 tests/integration/__init__.py | 1 + tests/mock/api/post.json | 468 ------ tests/mock/api/pre.json | 468 ------ tests/mock/exact_match_nested/post.json | 91 -- tests/mock/exact_match_nested/pre.json | 91 -- .../napalm_get_bgp_neighbors/multi_vrf.json | 138 -- tests/mock/napalm_get_bgp_neighbors/post.json | 91 -- tests/mock/napalm_get_bgp_neighbors/pre.json | 91 -- .../mock/napalm_get_lldp_neighbors/post.json | 34 - tests/mock/napalm_get_lldp_neighbors/pre.json | 30 - .../napalm_getter_additional_peer/post.json | 112 -- .../napalm_getter_additional_peer/pre.json | 91 -- .../mock/napalm_getter_changed_peer/post.json | 91 -- .../mock/napalm_getter_changed_peer/pre.json | 91 -- .../mock/napalm_getter_missing_peer/post.json | 70 - .../mock/napalm_getter_missing_peer/pre.json | 91 -- .../napalm_getter_peer_state_change/post.json | 91 -- .../napalm_getter_peer_state_change/pre.json | 91 -- tests/mock/parameter_match/napalm_facts.json | 12 - tests/mock/parameter_match/pre.json | 468 ------ tests/mock/raw_novalue_exclude/post.json | 83 - tests/mock/raw_novalue_exclude/pre.json | 83 - tests/mock/raw_novalue_noexclude/post.json | 83 - tests/mock/raw_novalue_noexclude/pre.json | 83 - tests/mock/raw_value_exclude/post.json | 83 - tests/mock/raw_value_exclude/pre.json | 83 - .../sw_upgrade/arista_eos_show_interface.json | 72 - .../arista_eos_show_ip_bgp_summary.json | 47 - .../arista_eos_show_ip_ospf_neighbors.json | 20 - .../sw_upgrade/arista_eos_show_ip_route.json | 572 ------- .../arista_eos_show_lldp_neighbors.json | 22 - .../sw_upgrade/arista_eos_show_version.json | 11 - .../sw_upgrade/cisco_ios_show_interface.json | 408 ----- .../cisco_ios_show_ip_bgp_neighbors.json | 158 -- .../cisco_ios_show_ip_bgp_summary.json | 20 - .../cisco_ios_show_ip_ospf_neighbors.json | 26 - .../sw_upgrade/cisco_ios_show_ip_route.json | 387 ----- .../cisco_ios_show_lldp_neighbors.json | 20 - .../sw_upgrade/cisco_ios_show_version.json | 24 - .../sw_upgrade/cisco_nxos_show_interface.json | 68 - .../cisco_nxos_show_ip_bgp_neighbors.json | 62 - .../cisco_nxos_show_ip_bgp_summary.json | 171 -- .../cisco_nxos_show_ip_ospf_neighbors.json | 56 - .../sw_upgrade/cisco_nxos_show_ip_route.json | 1260 --------------- .../cisco_nxos_show_lldp_neighbors.json | 17 - .../sw_upgrade/cisco_nxos_show_version.json | 11 - tests/mock/textfsm/post.json | 34 - tests/mock/textfsm/pre.json | 34 - tests/mock/textfsm_ospf_int_br/post.json | 14 - tests/mock/textfsm_ospf_int_br/pre.json | 14 - tests/mock/tolerance/post.json | 16 - tests/mock/tolerance/pre.json | 16 - tests/test_data_normalization.py | 23 - tests/test_diff_generator.py | 209 --- tests/test_diff_helpers.py | 197 --- tests/test_filter_parsers.py | 72 - tests/test_get_value.py | 141 -- tests/test_jmespath_parsers.py | 155 -- tests/test_operators.py | 244 --- tests/test_sw_upgrade_device_state.py | 231 --- tests/test_type_checks.py | 360 ----- tests/test_validates.py | 141 -- tests/unit/__init__.py | 1 + tests/unit/conftest.py | 10 + tests/unit/test_basics.py | 29 + tests/unit/test_cli.py | 16 + tests/unit/test_logging.py | 58 + tests/utility.py | 26 - towncrier_template.j2 | 1 + 135 files changed, 614 insertions(+), 12400 deletions(-) create mode 100644 .github/workflows/release.yml delete mode 100644 changes/+dne.documentation create mode 100644 changes/+main.housekeeping create mode 100644 changes/.gitignore delete mode 100644 changes/.gitkeep delete mode 100644 changes/133.fixed delete mode 100644 changes/134.added delete mode 100644 changes/136.fixed delete mode 100644 changes/140.fixed delete mode 100644 changes/141.fixed delete mode 100644 changes/141.housekeeping delete mode 100644 docs/admin/release_notes/version_0.0.md delete mode 100644 docs/code-reference/jdiff/__init__.md delete mode 100644 docs/code-reference/jdiff/check_types.md delete mode 100644 docs/code-reference/jdiff/evaluators.md delete mode 100644 docs/code-reference/jdiff/extract_data.md delete mode 100644 docs/code-reference/jdiff/operator.md delete mode 100644 docs/code-reference/jdiff/utils/__init__.md delete mode 100644 docs/code-reference/jdiff/utils/data_normalization.md delete mode 100644 docs/code-reference/jdiff/utils/diff_helpers.md delete mode 100644 docs/code-reference/jdiff/utils/jmespath_parsers.md delete mode 100644 docs/images/hld-architecture.png delete mode 100644 docs/images/hld.png delete mode 100644 docs/images/jdiff-workflow.png delete mode 100644 docs/images/jdiff_logo.png rename docs/{assets => images}/networktocode_logo.svg (100%) delete mode 100644 docs/images/workflow.png delete mode 100644 docs/requirements.txt delete mode 100644 docs/user/architecture.md create mode 100644 docs/user/lib_use_cases.md delete mode 100644 docs/user/usage.md create mode 100644 jdiff/api.py delete mode 100644 jdiff/check_types.py create mode 100644 jdiff/cli.py delete mode 100644 jdiff/evaluators.py delete mode 100644 jdiff/extract_data.py create mode 100644 jdiff/log.py delete mode 100644 jdiff/operator.py delete mode 100644 jdiff/utils/__init__.py delete mode 100644 jdiff/utils/data_normalization.py delete mode 100644 jdiff/utils/diff_helpers.py delete mode 100644 jdiff/utils/jmespath_parsers.py delete mode 100644 poetry.lock delete mode 100644 tests/__init__.py create mode 100644 tests/integration/__init__.py delete mode 100644 tests/mock/api/post.json delete mode 100644 tests/mock/api/pre.json delete mode 100644 tests/mock/exact_match_nested/post.json delete mode 100644 tests/mock/exact_match_nested/pre.json delete mode 100644 tests/mock/napalm_get_bgp_neighbors/multi_vrf.json delete mode 100644 tests/mock/napalm_get_bgp_neighbors/post.json delete mode 100644 tests/mock/napalm_get_bgp_neighbors/pre.json delete mode 100644 tests/mock/napalm_get_lldp_neighbors/post.json delete mode 100644 tests/mock/napalm_get_lldp_neighbors/pre.json delete mode 100644 tests/mock/napalm_getter_additional_peer/post.json delete mode 100644 tests/mock/napalm_getter_additional_peer/pre.json delete mode 100644 tests/mock/napalm_getter_changed_peer/post.json delete mode 100644 tests/mock/napalm_getter_changed_peer/pre.json delete mode 100644 tests/mock/napalm_getter_missing_peer/post.json delete mode 100644 tests/mock/napalm_getter_missing_peer/pre.json delete mode 100644 tests/mock/napalm_getter_peer_state_change/post.json delete mode 100644 tests/mock/napalm_getter_peer_state_change/pre.json delete mode 100644 tests/mock/parameter_match/napalm_facts.json delete mode 100644 tests/mock/parameter_match/pre.json delete mode 100644 tests/mock/raw_novalue_exclude/post.json delete mode 100644 tests/mock/raw_novalue_exclude/pre.json delete mode 100644 tests/mock/raw_novalue_noexclude/post.json delete mode 100644 tests/mock/raw_novalue_noexclude/pre.json delete mode 100644 tests/mock/raw_value_exclude/post.json delete mode 100644 tests/mock/raw_value_exclude/pre.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_interface.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_ip_bgp_summary.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_ip_ospf_neighbors.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_ip_route.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_lldp_neighbors.json delete mode 100644 tests/mock/sw_upgrade/arista_eos_show_version.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_interface.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_ip_bgp_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_ip_bgp_summary.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_ip_ospf_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_ip_route.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_lldp_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_ios_show_version.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_interface.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_ip_bgp_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_ip_bgp_summary.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_ip_ospf_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_ip_route.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_lldp_neighbors.json delete mode 100644 tests/mock/sw_upgrade/cisco_nxos_show_version.json delete mode 100644 tests/mock/textfsm/post.json delete mode 100644 tests/mock/textfsm/pre.json delete mode 100644 tests/mock/textfsm_ospf_int_br/post.json delete mode 100644 tests/mock/textfsm_ospf_int_br/pre.json delete mode 100644 tests/mock/tolerance/post.json delete mode 100644 tests/mock/tolerance/pre.json delete mode 100644 tests/test_data_normalization.py delete mode 100644 tests/test_diff_generator.py delete mode 100644 tests/test_diff_helpers.py delete mode 100644 tests/test_filter_parsers.py delete mode 100644 tests/test_get_value.py delete mode 100644 tests/test_jmespath_parsers.py delete mode 100644 tests/test_operators.py delete mode 100644 tests/test_sw_upgrade_device_state.py delete mode 100644 tests/test_type_checks.py delete mode 100644 tests/test_validates.py create mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/conftest.py create mode 100644 tests/unit/test_basics.py create mode 100644 tests/unit/test_cli.py create mode 100644 tests/unit/test_logging.py delete mode 100644 tests/utility.py diff --git a/.cookiecutter.json b/.cookiecutter.json index 47d84bb..b4b2e82 100644 --- a/.cookiecutter.json +++ b/.cookiecutter.json @@ -14,6 +14,21 @@ "project_with_config_settings": "no", "generate_docs": "yes", "version": "1.0.1", +<<<<<<< HEAD "original_publish_year": "2022" +======= + "original_publish_year": "2022", + "_drift_manager": { + "template": "https://github.com/networktocode-llc/cookiecutter-ntc.git", + "template_dir": "python", + "template_ref": "main", + "cookie_dir": "", + "pull_request_strategy": "update-or-create", + "post_actions": [], + "draft": false, + "baked_commit_ref": "bc931311336d391d878202dba239389783ee9f09", + "drift_managed_branch": "develop" + } +>>>>>>> 75750bd (Cookie updated targeting develop by NetworkToCode Cookie Drift Manager Tool) } } diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 4b69dfe..b82c935 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,7 @@ about: Report a reproducible bug in the current release of jdiff --- ### Environment -* Python version: +* Python version: * jdiff version: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24bffdd..67bef8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,6 @@ on: # yamllint disable-line rule:truthy rule:comments branches: - "main" - "develop" - tags: - - "v*" pull_request: ~ env: @@ -18,7 +16,7 @@ env: jobs: ruff-format: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-latest" env: INVOKE_JDIFF_LOCAL: "True" steps: @@ -27,11 +25,11 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" - name: "Linting: ruff format" run: "poetry run invoke ruff --action format" ruff-lint: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-latest" env: INVOKE_JDIFF_LOCAL: "True" steps: @@ -40,11 +38,11 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" - name: "Linting: ruff" run: "poetry run invoke ruff --action lint" check-docs-build: - runs-on: "ubuntu-22.04" + runs-on: "ubuntu-latest" env: INVOKE_JDIFF_LOCAL: "True" steps: @@ -53,11 +51,12 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" + poetry-install-options: "--only dev,docs" - name: "Check Docs Build" run: "poetry run invoke build-and-check-docs" poetry: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-latest" env: INVOKE_JDIFF_LOCAL: "True" steps: @@ -66,15 +65,11 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" - name: "Checking: poetry lock file" - run: "poetry lock --check" - needs: - - "ruff-format" - - "ruff-lint" - - "yamllint" + run: "poetry run invoke lock --check" yamllint: - runs-on: "ubuntu-24.04" + runs-on: "ubuntu-latest" env: INVOKE_JDIFF_LOCAL: "True" steps: @@ -83,27 +78,31 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" - name: "Linting: yamllint" run: "poetry run invoke yamllint" + check-in-docker: needs: - "ruff-format" - "ruff-lint" - pylint: - runs-on: "ubuntu-24.04" + - "poetry" + - "yamllint" + runs-on: "ubuntu-latest" strategy: fail-fast: true matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.13"] env: - PYTHON_VER: "${{ matrix.python-version }}" + INVOKE_JDIFF_PYTHON_VER: "${{ matrix.python-version }}" steps: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" + with: + poetry-version: "2.1.3" - name: "Get image version" - run: "echo INVOKE_JDIFF_IMAGE_VER=`poetry version -s`-py${{ matrix.python-version }} >> $GITHUB_ENV" + run: "echo INVOKE_JDIFF_IMAGE_VER=`poetry version -s`-py$${{ matrix.python-version }} >> $GITHUB_ENV" - name: "Set up Docker Buildx" id: "buildx" uses: "docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2" # v3.10.0 @@ -120,25 +119,25 @@ jobs: cache-to: "type=gha,scope=${{ env.INVOKE_JDIFF_IMAGE_NAME }}-${{ env.INVOKE_JDIFF_IMAGE_VER }}-py${{ matrix.python-version }}" build-args: | PYTHON_VER=${{ env.PYTHON_VER }} - - name: "Debug: Show docker images" - run: "docker image ls" - name: "Linting: Pylint" run: "poetry run invoke pylint" - needs: - - "poetry" pytest: + needs: + - "check-in-docker" strategy: fail-fast: true matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] - runs-on: "ubuntu-24.04" + python-version: ["3.10", "3.11", "3.12", "3.13"] + runs-on: "ubuntu-latest" env: - PYTHON_VER: "${{ matrix.python-version }}" + INVOKE_JDIFF_PYTHON_VER: "${{ matrix.python-version }}" steps: - name: "Check out repository code" uses: "actions/checkout@v4" - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" + with: + poetry-version: "2.1.3" - name: "Get image version" run: "echo INVOKE_JDIFF_IMAGE_VER=`poetry version -s`-py${{ matrix.python-version }} >> $GITHUB_ENV" - name: "Set up Docker Buildx" @@ -157,17 +156,13 @@ jobs: cache-to: "type=gha,scope=${{ env.INVOKE_JDIFF_IMAGE_NAME }}-${{ env.INVOKE_JDIFF_IMAGE_VER }}-py${{ matrix.python-version }}" build-args: | PYTHON_VER=${{ env.PYTHON_VER }} - - name: "Debug: Show docker images" - run: "docker image ls" - name: "Run Tests" run: "poetry run invoke pytest" - needs: - - "poetry" changelog: if: > contains(fromJson('["develop"]'), github.base_ref) && (github.head_ref != 'main') && (!startsWith(github.head_ref, 'release')) - runs-on: "ubuntu-22.04" + runs-on: "ubuntu-latest" steps: - name: "Check out repository code" uses: "actions/checkout@v4" @@ -176,100 +171,8 @@ jobs: - name: "Setup environment" uses: "networktocode/gh-action-setup-poetry-environment@v6" with: - poetry-version: "1.8.5" + poetry-version: "2.1.3" - name: "Check for changelog entry" run: | git fetch --no-tags origin +refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }} poetry run towncrier check --compare-with origin/${{ github.base_ref }} - publish_gh: - name: "Publish to GitHub" - runs-on: "ubuntu-24.04" - # yamllint disable-line rule:quoted-strings - if: startsWith(github.ref, 'refs/tags/v') - env: - INVOKE_JDIFF_LOCAL: "True" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v4" - - name: "Setup environment" - uses: "networktocode/gh-action-setup-poetry-environment@v6" - with: - poetry-version: "1.8.5" - python-version: "3.12" - poetry-install-options: "--no-root" - - name: "Set env" - run: "echo RELEASE_VERSION=${GITHUB_REF:10} >> $GITHUB_ENV" - - name: "Run Poetry Version" - run: "poetry version $RELEASE_VERSION" - - name: "Build Documentation" - run: "poetry run invoke build-and-check-docs" - - name: "Run Poetry Build" - run: "poetry build" - - name: "Upload binaries to release" - run: "gh release upload ${{ github.ref_name }} dist/*.{tar.gz,whl}" - env: - GH_TOKEN: "${{ secrets.NTC_GITHUB_TOKEN }}" - needs: - - "pytest" - publish_pypi: - name: "Push Package to PyPI" - runs-on: "ubuntu-24.04" - # yamllint disable-line rule:quoted-strings - if: startsWith(github.ref, 'refs/tags/v') - steps: - - name: "Check out repository code" - uses: "actions/checkout@v4" - - name: "Set up Python" - uses: "actions/setup-python@v5" - with: - python-version: "3.9" - - name: "Install Python Packages" - run: "pip install poetry" - - name: "Set env" - run: "echo RELEASE_VERSION=${GITHUB_REF:10} >> $GITHUB_ENV" - - name: "Run Poetry Version" - run: "poetry version $RELEASE_VERSION" - - name: "Run Poetry Build" - run: "poetry build" - - name: "Push to PyPI" - uses: "pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc" # v1.12.4 - with: - user: "__token__" - password: "${{ secrets.PYPI_API_TOKEN }}" - needs: - - "pytest" - slack-notify: - needs: - - "publish_gh" - - "publish_pypi" - runs-on: "ubuntu-24.04" - env: - SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" - SLACK_MESSAGE: >- - *NOTIFICATION: NEW-RELEASE-PUBLISHED*\n - Repository: <${{ github.server_url }}/${{ github.repository }}|${{ github.repository }}>\n - Release: <${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}>\n - Published by: <${{ github.server_url }}/${{ github.actor }}|${{ github.actor }}> - steps: - - name: "Send a notification to Slack" - # ENVs cannot be used directly in job.if. This is a workaround to check - # if SLACK_WEBHOOK_URL is present. - if: "env.SLACK_WEBHOOK_URL != ''" - uses: "slackapi/slack-github-action@fcfb566f8b0aab22203f066d80ca1d7e4b5d05b3" # v1.27.1 - with: - payload: | - { - "text": "${{ env.SLACK_MESSAGE }}", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ env.SLACK_MESSAGE }}" - } - } - ] - } - env: - SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" - SLACK_WEBHOOK_TYPE: "INCOMING_WEBHOOK" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7dffc18 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,106 @@ +--- +name: "Release" +on: # yamllint disable-line rule:truthy rule:comments + release: + types: ["published"] + +jobs: + build: + name: "Build package with poetry" + runs-on: "ubuntu-latest" + if: "startsWith(github.ref, 'refs/tags/v')" + steps: + - uses: "actions/checkout@v4" + - name: "Setup environment" + uses: "networktocode/gh-action-setup-poetry-environment@v6" + with: + poetry-version: "2.1.3" + python-version: "3.13" + poetry-install-options: "--no-root" + - name: "Run Poetry Build" + run: "poetry build" + + - name: "Check that the release tag matches the version in pyproject.toml" + run: | + if [ "${{ github.ref_name }}" != "v$(poetry version -s)" ]; then exit 1; fi + + - uses: "actions/upload-artifact@v4" + with: + name: "distfiles" + path: "dist/" + if-no-files-found: "error" + + publish-github: + name: "Publish to GitHub" + runs-on: "ubuntu-latest" + if: "startsWith(github.ref, 'refs/tags/v')" + permissions: + contents: "write" + needs: "build" + steps: + - uses: "actions/checkout@v4" + - name: "Retrieve built package from cache" + uses: "actions/download-artifact@v4" + with: + name: "distfiles" + path: "dist/" + + - name: "Upload binaries to release" + run: "gh release upload ${{ github.ref_name }} dist/*.{tar.gz,whl}" + env: + GH_TOKEN: "${{ secrets.NTC_GITHUB_TOKEN }}" + + publish-pypi: + name: "Push Package to PyPI" + runs-on: "ubuntu-latest" + if: "startsWith(github.ref, 'refs/tags/v')" + needs: "build" + environment: "pypi" + # Steps to publish to PyPI. + steps: + - name: "Retrieve built package from cache" + uses: "actions/download-artifact@v4" + with: + name: "distfiles" + path: "dist/" + - name: "Publish package distributions to PyPI" + uses: "pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e" # v1.13.0 + ## Used for networktocode org since trusted publisher isn't supported for GitHub Plan. + with: + user: "__token__" + password: "${{ secrets.PYPI_API_TOKEN }}" + # End publish to PyPI job. + + slack-notify: + needs: + - "publish-github" + - "publish-pypi" + runs-on: "ubuntu-latest" + env: + # Secrets cannot be directly referenced in if: conditionals. They must be set as a job env var first. + # Ref: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-secrets + SLACK_WEBHOOK_URL: "${{ secrets.OSS_PYPI_SLACK_WEBHOOK_URL }}" + SLACK_WEBHOOK_TYPE: "INCOMING_WEBHOOK" + SLACK_MESSAGE: >- + *NOTIFICATION: NEW-RELEASE-PUBLISHED*\n + Repository: <${{ github.server_url }}/${{ github.repository }}|${{ github.repository }}>\n + Release: <${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}>\n + Published by: <${{ github.server_url }}/${{ github.actor }}|${{ github.actor }}> + steps: + - name: "Send a notification to Slack" + if: "${{ env.SLACK_WEBHOOK_URL != '' }}" + uses: "slackapi/slack-github-action@fcfb566f8b0aab22203f066d80ca1d7e4b5d05b3" # v1.27.1 + with: + payload: | + { + "text": "${{ env.SLACK_MESSAGE }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "${{ env.SLACK_MESSAGE }}" + } + } + ] + } diff --git a/.gitignore b/.gitignore index cbb9133..fabcfd8 100644 --- a/.gitignore +++ b/.gitignore @@ -306,3 +306,5 @@ invoke.yml docs/README.md docs/CHANGELOG.md public +/compose.yaml +/dump.sql diff --git a/.readthedocs.yml b/.readthedocs.yml index b60d928..36f32f0 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -6,19 +6,22 @@ # Required version: 2 -# Set the version of Python in the build environment. +# Setup the build environment. build: - os: "ubuntu-22.04" + os: "ubuntu-lts-latest" tools: - python: "3.10" + python: "3.13" + jobs: + post_install: + # Install poetry + # https://python-poetry.org/docs/#installing-manually + - "pip install poetry" + # Install dependencies 'docs' dependency group + # https://python-poetry.org/docs/managing-dependencies/#dependency-groups + # VIRTUAL_ENV needs to be set manually for now. + # See https://github.com/readthedocs/readthedocs.org/pull/11152/ + - "VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --only docs" mkdocs: configuration: "mkdocs.yml" - # fail_on_warning: true - -# Use our docs/requirements.txt during installation. -python: - install: - - requirements: "docs/requirements.txt" - - method: "pip" - path: "." + fail_on_warning: true diff --git a/Dockerfile b/Dockerfile index cb1757c..3c1fdca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG PYTHON_VER=3.11 +ARG PYTHON_VER="3.10" FROM python:${PYTHON_VER}-slim @@ -8,7 +8,7 @@ FROM python:${PYTHON_VER}-slim # This also makes it so that Poetry will *not* be included in the "final" image since it's not installed to /usr/local/ ARG POETRY_HOME=/opt/poetry ARG POETRY_INSTALLER_PARALLEL=true -ARG POETRY_VERSION=1.8.2 +ARG POETRY_VERSION=2.1.3 ARG POETRY_VIRTUALENVS_CREATE=false ADD https://install.python-poetry.org /tmp/install-poetry.py RUN python /tmp/install-poetry.py @@ -23,4 +23,4 @@ WORKDIR /local COPY . /local # Install the app -RUN poetry install --with dev +RUN poetry install --with dev --all-extras diff --git a/LICENSE b/LICENSE index f433b1a..a960bf7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,177 +1,15 @@ +Apache Software License 2.0 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2022-2026, Network to Code, LLC - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - 1. Definitions. +http://www.apache.org/licenses/LICENSE-2.0 - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index 85b04d6..52a4174 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ # Jdiff + +

- +
- +
@@ -12,23 +22,23 @@ ## Overview -`jdiff` is a lightweight Python library allowing you to examine structured data. `jdiff` provides an interface to intelligently compare JSON data objects and test for the presence (or absence) of keys. You can also examine and compare corresponding key-values. +> Developer Note: Add a long (2-3 paragraphs) description of what the library does, what problems it solves, etc. ## Documentation -Full web-based HTML documentation for this library can be found over on the [Jdiff Docs](https://jdiff.readthedocs.io) website: +Full documentation for this library can be found over on the [Jdiff Docs](https://jdiff.readthedocs.io/) website: -- [User Guide](https://jdiff.readthedocs.io/en/latest/user/lib_overview/) - Overview, Using the library, Getting Started. -- [Administrator Guide](https://jdiff.readthedocs.io/en/latest/admin/install/) - How to Install, Configure, Upgrade, or Uninstall the library. -- [Developer Guide](https://jdiff.readthedocs.io/en/latest/dev/contributing/) - Extending the library, Code Reference, Contribution Guide. -- [Release Notes / Changelog](https://jdiff.readthedocs.io/en/latest/admin/release_notes/). -- [Frequently Asked Questions](https://jdiff.readthedocs.io/en/latest/user/faq/). +- [User Guide](https://jdiff.readthedocs.io/user/app_overview/) - Overview, Using the Library, Getting Started. +- [Administrator Guide](https://jdiff.readthedocs.io/admin/install/) - How to Install, Configure, Upgrade, or Uninstall the Library. +- [Developer Guide](https://jdiff.readthedocs.io/dev/contributing/) - Extending the Library, Code Reference, Contribution Guide. +- [Release Notes / Changelog](https://jdiff.readthedocs.io/admin/release_notes/). +- [Frequently Asked Questions](https://jdiff.readthedocs.io/user/faq/). -### Contributing to the Docs +### Contributing to the Documentation -All the Markdown source for the library documentation can be found under the [docs](https://github.com/networktocode/jdiff/tree/develop/docs) folder in this repository. For simple edits, a Markdown capable editor is sufficient - clone the repository and edit away. +You can find all the Markdown source for the App documentation under the [`docs`](https://github.com/networktocode/jdiff/tree/develop/docs) folder in this repository. For simple edits, a Markdown capable editor is sufficient: clone the repository and edit away. -If you need to view the fully generated documentation site, you can build it with [mkdocs](https://www.mkdocs.org/). A container hosting the docs will be started using the invoke commands (details in the [Development Environment Guide](https://jdiff.readthedocs.io/en/latest/dev/dev_environment/#docker-development-environment)) on [http://localhost:8001](http://localhost:8001). As your changes are saved, the live docs will be automatically reloaded. +If you need to view the fully-generated documentation site, you can build it with [MkDocs](https://www.mkdocs.org/). A container hosting the documentation can be started using the `invoke` commands (details in the [Development Environment Guide](https://jdiff/dev/dev_environment/#docker-development-environment)) on [http://localhost:8001](http://localhost:8001). Using this container, as your changes to the documentation are saved, they will be automatically rebuilt and any pages currently being viewed will be reloaded in your browser. Any PRs with fixes or improvements are very welcome! diff --git a/changes/+dne.documentation b/changes/+dne.documentation deleted file mode 100644 index a18431b..0000000 --- a/changes/+dne.documentation +++ /dev/null @@ -1 +0,0 @@ -Fixed the section headers for portions of the documentation. \ No newline at end of file diff --git a/changes/+main.housekeeping b/changes/+main.housekeeping new file mode 100644 index 0000000..3433adf --- /dev/null +++ b/changes/+main.housekeeping @@ -0,0 +1 @@ +Rebaked from the cookie `main`. diff --git a/changes/.gitignore b/changes/.gitignore new file mode 100644 index 0000000..f935021 --- /dev/null +++ b/changes/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/changes/.gitkeep b/changes/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/changes/133.fixed b/changes/133.fixed deleted file mode 100644 index f89c903..0000000 --- a/changes/133.fixed +++ /dev/null @@ -1 +0,0 @@ -Fix GitHub release failing in CI pipeline. diff --git a/changes/134.added b/changes/134.added deleted file mode 100644 index 5ade60f..0000000 --- a/changes/134.added +++ /dev/null @@ -1 +0,0 @@ -Added documentation on the release checklist and process for the library. diff --git a/changes/136.fixed b/changes/136.fixed deleted file mode 100644 index f89c903..0000000 --- a/changes/136.fixed +++ /dev/null @@ -1 +0,0 @@ -Fix GitHub release failing in CI pipeline. diff --git a/changes/140.fixed b/changes/140.fixed deleted file mode 100644 index 41254cf..0000000 --- a/changes/140.fixed +++ /dev/null @@ -1 +0,0 @@ -Fix invoke volume path. diff --git a/changes/141.fixed b/changes/141.fixed deleted file mode 100644 index c348698..0000000 --- a/changes/141.fixed +++ /dev/null @@ -1 +0,0 @@ -Fix GitHub CI Publish failures. diff --git a/changes/141.housekeeping b/changes/141.housekeeping deleted file mode 100644 index 7a5e98c..0000000 --- a/changes/141.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Pep508 compliant deepdiff dependency specification. diff --git a/docs/admin/release_notes/version_0.0.md b/docs/admin/release_notes/version_0.0.md deleted file mode 100644 index 9f79e4c..0000000 --- a/docs/admin/release_notes/version_0.0.md +++ /dev/null @@ -1,34 +0,0 @@ -# v0.0 Release Notes - -## v0.0.7 -- Fix exclude to work with lists [#123](https://github.com/networktocode/jdiff/pull/123) - -## v0.0.6 -- Sort the data when data normalization is used with key anchoring - -## v0.0.5 -- Update jmespath dependency -- Drop python 3.7 support - -## v0.0.4 -- Relax deepdiff dependency - -## v0.0.3 -- Update documentation -- Fix evaluation logic in operator check -- Fix operator checks to follow other check_type logic #85 -- Add support for multiple ref key #92 -- Update gt and lt logic in operator check #64 -- Fix ref key in dict of dicts data type #91 -- Support single value in expression #94 -- Minor fixes - -## v0.0.2 -- Update operator logic for returned result -- Update docs - -## v0.0.1 -- Initial release - -## v0.0.1-beta.1 -- First beta release diff --git a/docs/admin/release_notes/version_1.0.md b/docs/admin/release_notes/version_1.0.md index dab74e7..b8b2c39 100644 --- a/docs/admin/release_notes/version_1.0.md +++ b/docs/admin/release_notes/version_1.0.md @@ -1,29 +1,40 @@ # v1.0 Release Notes -This document describes all new features and changes in the release. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +!!! warning "Developer Note - Remove Me!" + Guiding Principles: -## 1.0.1 Release Overview + - Changelogs are for humans, not machines. + - There should be an entry for every single version. + - The same types of changes should be grouped. + - Versions and sections should be linkable. + - The latest version comes first. + - The release date of each version is displayed. + - Mention whether you follow Semantic Versioning. -- Updated DeepDiff dependency due to vulnerability. + Types of changes: -## [v1.0.1 (2025-08-25)](https://github.com/networktocode/jdiff/releases/tag/v1.0.1) + - `Added` for new features. + - `Changed` for changes in existing functionality. + - `Deprecated` for soon-to-be removed features. + - `Removed` for now removed features. + - `Fixed` for any bug fixes. + - `Security` in case of vulnerabilities. -### Fixed - -- [#136](https://github.com/networktocode/jdiff/issues/136) - Update DeepDiif dependency to 8.6.1 +This document describes all new features and changes in the release `1.0`. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 1.0.0 Release Overview +## Release Overview -- Updated the entire project to the new Network to Code development standards. -- Added a JSON data compliance utility to help reconstruct JSON from compliance results. +- Major features or milestones +- Achieved in this `x.y` release +- Changes to compatibility with Nautobot and/or other apps, libraries etc. -## [v1.0.0 (2025-08-25)](https://github.com/networktocode/jdiff/releases/tag/v1.0.0) +## [v1.0.0] - 2026-01-09 ### Added -- [#130](https://github.com/networktocode/jdiff/issues/130) - Add the ability to reconstruct JSON blobs to perform JSON data compliance. +### Changed ### Fixed -- [#128](https://github.com/networktocode/jdiff/issues/128) - Fixed the development standards to use 2025 standards. +- [#123](https://github.com/networktocode/jdiff/issues/123) Fixed Tag filtering not working in job launch form. diff --git a/docs/admin/uninstall.md b/docs/admin/uninstall.md index c14848a..bcffe4b 100644 --- a/docs/admin/uninstall.md +++ b/docs/admin/uninstall.md @@ -3,5 +3,5 @@ Uninstall from environment. ```bash -$ pip uninstall jdiff -``` \ No newline at end of file +pip uninstall jdiff +``` diff --git a/docs/admin/upgrade.md b/docs/admin/upgrade.md index 77e0d55..03be4e0 100644 --- a/docs/admin/upgrade.md +++ b/docs/admin/upgrade.md @@ -3,5 +3,5 @@ Upgrade from PyPI. ```bash -$ pip install jdiff --upgrade +pip install jdiff --upgrade ``` diff --git a/docs/assets/overrides/partials/copyright.html b/docs/assets/overrides/partials/copyright.html index b623894..cbf6bde 100644 --- a/docs/assets/overrides/partials/copyright.html +++ b/docs/assets/overrides/partials/copyright.html @@ -1,3 +1,4 @@ +