audiocompose 0.1.0__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 (76) hide show
  1. audiocompose-0.1.0/.codecrate.toml +25 -0
  2. audiocompose-0.1.0/.github/workflows/codecov.yml +40 -0
  3. audiocompose-0.1.0/.github/workflows/pre-commit.yml +31 -0
  4. audiocompose-0.1.0/.github/workflows/python-publish.yml +93 -0
  5. audiocompose-0.1.0/.github/workflows/tests.yml +89 -0
  6. audiocompose-0.1.0/.gitignore +219 -0
  7. audiocompose-0.1.0/.ledger/ledger.toml +24 -0
  8. audiocompose-0.1.0/.ledger/releaseledger/.ledger-project.toml +6 -0
  9. audiocompose-0.1.0/.ledger/releaseledger/config.toml +56 -0
  10. audiocompose-0.1.0/.ledger/releaseledger/data/.ledger-project.toml +6 -0
  11. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +17 -0
  12. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +364 -0
  13. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +33 -0
  14. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +32 -0
  15. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +27 -0
  16. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +28 -0
  17. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +33 -0
  18. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0006.md +32 -0
  19. audiocompose-0.1.0/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +27 -0
  20. audiocompose-0.1.0/.ledger/releaseledger/write.lock +0 -0
  21. audiocompose-0.1.0/.ledger/taskledger/.ledger-project.toml +6 -0
  22. audiocompose-0.1.0/.ledger/taskledger/config.toml +7 -0
  23. audiocompose-0.1.0/.pre-commit-config.yaml +64 -0
  24. audiocompose-0.1.0/LICENSE +201 -0
  25. audiocompose-0.1.0/PKG-INFO +342 -0
  26. audiocompose-0.1.0/README.md +107 -0
  27. audiocompose-0.1.0/audiocompose/__init__.py +89 -0
  28. audiocompose-0.1.0/audiocompose/__main__.py +3 -0
  29. audiocompose-0.1.0/audiocompose/_version.py +24 -0
  30. audiocompose-0.1.0/audiocompose/alignment.py +94 -0
  31. audiocompose-0.1.0/audiocompose/analysis.py +179 -0
  32. audiocompose-0.1.0/audiocompose/cli.py +293 -0
  33. audiocompose-0.1.0/audiocompose/composer.py +170 -0
  34. audiocompose-0.1.0/audiocompose/diagnostics.py +25 -0
  35. audiocompose-0.1.0/audiocompose/errors.py +14 -0
  36. audiocompose-0.1.0/audiocompose/job.py +399 -0
  37. audiocompose-0.1.0/audiocompose/loudness.py +224 -0
  38. audiocompose-0.1.0/audiocompose/model.py +179 -0
  39. audiocompose-0.1.0/audiocompose/operations.py +185 -0
  40. audiocompose-0.1.0/audiocompose/py.typed +0 -0
  41. audiocompose-0.1.0/audiocompose/resampling.py +23 -0
  42. audiocompose-0.1.0/audiocompose/sources.py +68 -0
  43. audiocompose-0.1.0/audiocompose/timeline.py +19 -0
  44. audiocompose-0.1.0/audiocompose/wav.py +131 -0
  45. audiocompose-0.1.0/audiocompose.egg-info/PKG-INFO +342 -0
  46. audiocompose-0.1.0/audiocompose.egg-info/SOURCES.txt +74 -0
  47. audiocompose-0.1.0/audiocompose.egg-info/dependency_links.txt +1 -0
  48. audiocompose-0.1.0/audiocompose.egg-info/entry_points.txt +2 -0
  49. audiocompose-0.1.0/audiocompose.egg-info/requires.txt +11 -0
  50. audiocompose-0.1.0/audiocompose.egg-info/scm_file_list.json +69 -0
  51. audiocompose-0.1.0/audiocompose.egg-info/scm_version.json +8 -0
  52. audiocompose-0.1.0/audiocompose.egg-info/top_level.txt +1 -0
  53. audiocompose-0.1.0/docs/Makefile +32 -0
  54. audiocompose-0.1.0/docs/architecture.md +58 -0
  55. audiocompose-0.1.0/docs/changelog.md +21 -0
  56. audiocompose-0.1.0/docs/conf.py +101 -0
  57. audiocompose-0.1.0/docs/make.bat +113 -0
  58. audiocompose-0.1.0/docs/make.py +89 -0
  59. audiocompose-0.1.0/docs/requirements.txt +5 -0
  60. audiocompose-0.1.0/examples/mixed_engines.py +15 -0
  61. audiocompose-0.1.0/examples/simple_api.py +11 -0
  62. audiocompose-0.1.0/pyproject.toml +70 -0
  63. audiocompose-0.1.0/setup.cfg +4 -0
  64. audiocompose-0.1.0/spec/audiojob-v1.schema.json +142 -0
  65. audiocompose-0.1.0/tests/fixtures/simple.audiojob/audiojob.json +61 -0
  66. audiocompose-0.1.0/tests/fixtures/simple.audiojob/parts/one.wav +0 -0
  67. audiocompose-0.1.0/tests/fixtures/simple.audiojob/parts/two.wav +0 -0
  68. audiocompose-0.1.0/tests/test_analysis.py +34 -0
  69. audiocompose-0.1.0/tests/test_audiocompose_core.py +110 -0
  70. audiocompose-0.1.0/tests/test_cli.py +52 -0
  71. audiocompose-0.1.0/tests/test_contracts_v1.py +45 -0
  72. audiocompose-0.1.0/tests/test_loudness_diagnostics.py +106 -0
  73. audiocompose-0.1.0/tests/test_mixed_producers.py +58 -0
  74. audiocompose-0.1.0/tests/test_readiness_regressions.py +175 -0
  75. audiocompose-0.1.0/tests/test_span_identity.py +109 -0
  76. audiocompose-0.1.0/tests/test_timing_operations.py +94 -0
@@ -0,0 +1,25 @@
1
+ [codecrate]
2
+ output = "context_audiocompose.md"
3
+ keep_docstrings = true
4
+ dedupe = true
5
+ metadata = false
6
+ respect_gitignore = true
7
+ exclude = ["*/.venv/*", "context_audiocompose.*"]
8
+ gitignore_allow = ["audiocompose/_version.py"]
9
+ include = [
10
+ "**/*.py",
11
+ "**/*.toml",
12
+ "**/*.md",
13
+ "**/*.json",
14
+ "**/*.txt",
15
+ "**/*.csv",
16
+ "**/*.tsv",
17
+ "**/*.yaml",
18
+ "**/*.yml",
19
+ "**/*.ssmd",
20
+ "LICENSE",
21
+ ]
22
+ split_max_chars = 0
23
+ layout = "full"
24
+ profile = "portable-agent"
25
+ emit_standalone_unpacker = true
@@ -0,0 +1,40 @@
1
+ name: Code coverage
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ coverage:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.13"
20
+ cache: pip
21
+
22
+ - name: Install package and coverage tools
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ python -m pip install ".[dev]" coverage pytest-cov
26
+
27
+ - name: Generate coverage and test reports
28
+ run: |
29
+ python -m pytest --cov=audiocompose --cov-report=xml --junitxml=junit.xml
30
+
31
+ - name: Upload coverage to Codecov
32
+ uses: codecov/codecov-action@v5
33
+ with:
34
+ token: ${{ secrets.CODECOV_TOKEN }}
35
+
36
+ - name: Upload test results to Codecov
37
+ if: ${{ !cancelled() }}
38
+ uses: codecov/test-results-action@v1
39
+ with:
40
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,31 @@
1
+ name: pre-commit
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ pre-commit:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.13"
19
+ cache: pip
20
+
21
+ - uses: actions/setup-node@v4
22
+ with:
23
+ node-version: "20"
24
+
25
+ - name: Install AudioCompose development tools
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ python -m pip install ".[dev]" pre-commit
29
+
30
+ - name: Run pre-commit
31
+ uses: pre-commit/action@v3.0.1
@@ -0,0 +1,93 @@
1
+ # Build and publish a Python package when a GitHub Release is published.
2
+
3
+ name: Upload Python Package
4
+
5
+ on:
6
+ release:
7
+ types: [published]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ deploy:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Check out release
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.13"
23
+ cache: pip
24
+
25
+ - name: Install build tooling
26
+ run: python -m pip install --upgrade pip build twine packaging
27
+
28
+ - name: Build package
29
+ run: |
30
+ rm -rf dist
31
+ python -m build
32
+
33
+ - name: Check built distributions
34
+ run: python -m twine check dist/*
35
+
36
+ - name: Validate release artifacts
37
+ env:
38
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
39
+ run: |
40
+ python - <<'PY'
41
+ import os
42
+ import zipfile
43
+ from email import policy
44
+ from email.parser import Parser
45
+ from pathlib import Path
46
+ from packaging.requirements import Requirement
47
+ from packaging.utils import parse_sdist_filename, parse_wheel_filename
48
+ from packaging.version import Version
49
+
50
+ def has_minimum(requirements, name, minimum):
51
+ minimum_version = Version(minimum)
52
+ return any(
53
+ requirement.name == name
54
+ and any(
55
+ spec.operator in (">=", ">", "==")
56
+ and Version(spec.version) >= minimum_version
57
+ for spec in requirement.specifier
58
+ )
59
+ for requirement in requirements
60
+ )
61
+
62
+ tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
63
+ artifacts = sorted(Path("dist").iterdir())
64
+ wheels = [path for path in artifacts if path.suffix == ".whl"]
65
+ sdists = [path for path in artifacts if path.name.endswith(".tar.gz")]
66
+ assert len(wheels) == 1, wheels
67
+ assert len(sdists) == 1, sdists
68
+
69
+ wheel_name, wheel_version, _, _ = parse_wheel_filename(wheels[0].name)
70
+ sdist_name, sdist_version = parse_sdist_filename(sdists[0].name)
71
+ assert wheel_name == "audiocompose", wheel_name
72
+ assert sdist_name == "audiocompose", sdist_name
73
+ assert str(wheel_version) == tag_version, (wheel_version, tag_version)
74
+ assert str(sdist_version) == tag_version, (sdist_version, tag_version)
75
+
76
+ with zipfile.ZipFile(wheels[0]) as archive:
77
+ metadata_name = next(name for name in archive.namelist() if name.endswith("METADATA"))
78
+ metadata = Parser(policy=policy.default).parsestr(
79
+ archive.read(metadata_name).decode("utf-8")
80
+ )
81
+ assert metadata["Name"] == "audiocompose"
82
+ requirements = [
83
+ Requirement(value) for value in metadata.get_all("Requires-Dist", [])
84
+ ]
85
+ assert has_minimum(requirements, "numpy", "1.23")
86
+ assert any(name.endswith("audiocompose/py.typed") for name in archive.namelist())
87
+ PY
88
+
89
+ - name: Publish package to PyPI
90
+ uses: pypa/gh-action-pypi-publish@v1.14.1
91
+ with:
92
+ password: ${{ secrets.PYPI_API_TOKEN }}
93
+ attestations: false
@@ -0,0 +1,89 @@
1
+ name: Run tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_call:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ run:
13
+ runs-on: ${{ matrix.os }}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os: [ubuntu-latest, windows-latest, macos-latest]
18
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
19
+
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: ${{ matrix.python-version }}
27
+ cache: pip
28
+
29
+ - name: Install package and development tools
30
+ run: |
31
+ python -m pip install --upgrade pip
32
+ python -m pip install ".[dev]"
33
+ python -m compileall -q audiocompose tests
34
+
35
+ - name: Run tests
36
+ run: python -m pytest -q
37
+
38
+ - name: Lint and type-check
39
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
40
+ run: |
41
+ python -m ruff check audiocompose tests
42
+ python -m mypy audiocompose
43
+
44
+ lower-bounds:
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+
49
+ - name: Set up Python
50
+ uses: actions/setup-python@v5
51
+ with:
52
+ python-version: "3.10"
53
+ cache: pip
54
+
55
+ - name: Install lower-bound package
56
+ run: |
57
+ python -m pip install --upgrade pip
58
+ python -m pip install ".[dev]"
59
+
60
+ - name: Run lower-bound tests
61
+ run: python -m pytest -q
62
+
63
+ package:
64
+ runs-on: ubuntu-latest
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+
68
+ - name: Set up Python
69
+ uses: actions/setup-python@v5
70
+ with:
71
+ python-version: "3.13"
72
+ cache: pip
73
+
74
+ - name: Build and check distributions
75
+ run: |
76
+ python -m pip install --upgrade pip build twine
77
+ rm -rf dist
78
+ python -m build
79
+ python -m twine check dist/*
80
+
81
+ - name: Install isolated wheel
82
+ run: |
83
+ python -m venv "$RUNNER_TEMP/audiocompose-wheel-venv"
84
+ "$RUNNER_TEMP/audiocompose-wheel-venv/bin/python" -m pip install dist/audiocompose-*.whl
85
+
86
+ - name: Smoke-test installed wheel
87
+ run: |
88
+ "$RUNNER_TEMP/audiocompose-wheel-venv/bin/python" -c "import audiocompose; assert audiocompose.__version__"
89
+ "$RUNNER_TEMP/audiocompose-wheel-venv/bin/audiocompose" --version
@@ -0,0 +1,219 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ share/python-wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+ MANIFEST
27
+
28
+ # PyInstaller
29
+ # Usually these files are written by a python script from a template
30
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .nox/
42
+ .coverage
43
+ .coverage.*
44
+ .cache
45
+ nosetests.xml
46
+ coverage.xml
47
+ *.cover
48
+ *.py.cover
49
+ .hypothesis/
50
+ .pytest_cache/
51
+ cover/
52
+
53
+ # Translations
54
+ *.mo
55
+ *.pot
56
+
57
+ # Django stuff:
58
+ *.log
59
+ local_settings.py
60
+ db.sqlite3
61
+ db.sqlite3-journal
62
+
63
+ # Flask stuff:
64
+ instance/
65
+ .webassets-cache
66
+
67
+ # Scrapy stuff:
68
+ .scrapy
69
+
70
+ # Sphinx documentation
71
+ docs/_build/
72
+
73
+ # PyBuilder
74
+ .pybuilder/
75
+ target/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ # For a library or package, you might want to ignore these files since the code is
86
+ # intended to run in multiple environments; otherwise, check them in:
87
+ # .python-version
88
+
89
+ # pipenv
90
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
91
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
92
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
93
+ # install all needed dependencies.
94
+ # Pipfile.lock
95
+
96
+ # UV
97
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
98
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
99
+ # commonly ignored for libraries.
100
+ # uv.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ # poetry.lock
108
+ # poetry.toml
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
113
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
114
+ # pdm.lock
115
+ # pdm.toml
116
+ .pdm-python
117
+ .pdm-build/
118
+
119
+ # pixi
120
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
121
+ # pixi.lock
122
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
123
+ # in the .venv directory. It is recommended not to include this directory in version control.
124
+ .pixi
125
+
126
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
127
+ __pypackages__/
128
+
129
+ # Celery stuff
130
+ celerybeat-schedule
131
+ celerybeat.pid
132
+
133
+ # Redis
134
+ *.rdb
135
+ *.aof
136
+ *.pid
137
+
138
+ # RabbitMQ
139
+ mnesia/
140
+ rabbitmq/
141
+ rabbitmq-data/
142
+
143
+ # ActiveMQ
144
+ activemq-data/
145
+
146
+ # SageMath parsed files
147
+ *.sage.py
148
+
149
+ # Environments
150
+ .env
151
+ .envrc
152
+ .venv
153
+ env/
154
+ venv/
155
+ ENV/
156
+ env.bak/
157
+ venv.bak/
158
+
159
+ # Spyder project settings
160
+ .spyderproject
161
+ .spyproject
162
+
163
+ # Rope project settings
164
+ .ropeproject
165
+
166
+ # mkdocs documentation
167
+ /site
168
+
169
+ # mypy
170
+ .mypy_cache/
171
+ .dmypy.json
172
+ dmypy.json
173
+
174
+ # Pyre type checker
175
+ .pyre/
176
+
177
+ # pytype static type analyzer
178
+ .pytype/
179
+
180
+ # Cython debug symbols
181
+ cython_debug/
182
+
183
+ # PyCharm
184
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
185
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
186
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
187
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
188
+ # .idea/
189
+
190
+ # Abstra
191
+ # Abstra is an AI-powered process automation framework.
192
+ # Ignore directories containing user credentials, local state, and settings.
193
+ # Learn more at https://abstra.io/docs
194
+ .abstra/
195
+
196
+ # Visual Studio Code
197
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
198
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
199
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
200
+ # you could uncomment the following to ignore the entire vscode folder
201
+ # .vscode/
202
+ # Temporary file for partial code execution
203
+ tempCodeRunnerFile.py
204
+
205
+ # Ruff stuff:
206
+ .ruff_cache/
207
+
208
+ # PyPI configuration file
209
+ .pypirc
210
+
211
+ # Marimo
212
+ marimo/_static/
213
+ marimo/_lsp/
214
+ __marimo__/
215
+
216
+ # Streamlit
217
+ .streamlit/secrets.toml
218
+ context_audiocompose*.*
219
+ audiocompose/_version.py
@@ -0,0 +1,24 @@
1
+ schema_version = 3
2
+
3
+ [project]
4
+ uuid = "585f9250-92fc-4d44-ad79-7dadf29c2c66"
5
+ name = "utterrender"
6
+
7
+ [ledgers.taskledger.mounts.data]
8
+ storage = "external"
9
+ root = "../ledger"
10
+
11
+ [ledgers.taskledger.mounts.runtime]
12
+ storage = "user-data"
13
+
14
+ [ledgers.taskledger.mounts.logs]
15
+ storage = "user-data"
16
+
17
+ [ledgers.taskledger.mounts.indexes]
18
+ storage = "cache"
19
+
20
+ [ledgers.releaseledger.mounts.data]
21
+ storage = "project"
22
+
23
+ [ledgers.releaseledger.mounts.indexes]
24
+ storage = "cache"
@@ -0,0 +1,6 @@
1
+ schema_version = 1
2
+ layout_version = 3
3
+ project_uuid = "585f9250-92fc-4d44-ad79-7dadf29c2c66"
4
+ tool = "releaseledger"
5
+ mount = "config"
6
+ storage = "project"
@@ -0,0 +1,56 @@
1
+ config_version = 2
2
+ # Branch-scoped release state. This block is safe to commit.
3
+ ledger_ref = "main"
4
+ ledger_parent_ref = ""
5
+ ledger_branch_guard = "off"
6
+ # Cross-ledger identity. Local record IDs stay unchanged.
7
+
8
+ [ledger]
9
+ code = "rl"
10
+ # Release defaults.
11
+
12
+ [release]
13
+ default_changelog = "CHANGELOG.md"
14
+ default_status = "planned"
15
+ allow_dirty_worktree = true
16
+ # Changelog build defaults.
17
+
18
+ [changelog]
19
+ output = "docs/changelog.md"
20
+ header = ""
21
+ body = """## {% if release.date %}[{{ release.version }}] - {{ release.date }}{% else %}[{{ release.version }}] - Unreleased{% endif %}
22
+
23
+ {% for group in groups %}
24
+ ### {{ group.title }}
25
+ {% for entry in group.entries %}
26
+ - {% if entry.breaking %}**BREAKING:** {% endif %}{{ entry.summary }}
27
+ {% endfor %}
28
+
29
+ {% endfor %}
30
+ """
31
+ footer = "<!-- generated by releaseledger -->"
32
+ trim = true
33
+ render_always = false
34
+ postprocessors = []
35
+ standard = ""
36
+ group_mode = "extended"
37
+ link_references = false
38
+ repository_url = ""
39
+ tag_prefix = "v"
40
+ compare_url_template = ""
41
+ release_url_template = ""
42
+ preamble = ""
43
+ semver = false
44
+ unreleased = true
45
+ # Git-first release evidence.
46
+
47
+ [git]
48
+ enabled = true
49
+ default_base = "previous_release_tag"
50
+ default_head = "HEAD"
51
+ previous_tag_patterns = ["v{version}", "{version}"]
52
+ include_merges = "nontrivial"
53
+ require_clean_worktree = false
54
+ max_commits = 500
55
+ max_diff_chars_per_commit = 12000
56
+ candidate_status = "draft"
@@ -0,0 +1,6 @@
1
+ schema_version = 1
2
+ layout_version = 3
3
+ project_uuid = "585f9250-92fc-4d44-ad79-7dadf29c2c66"
4
+ tool = "releaseledger"
5
+ mount = "data"
6
+ storage = "project"
@@ -0,0 +1,17 @@
1
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0001","record_revisions":{"release:v0.1.0":1},"release_version":"v0.1.0","schema_version":2}
2
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0002","record_revisions":{"release:v0.1.0":2},"release_version":"v0.1.0","schema_version":2}
3
+ {"data":{"row_count":6},"event":"audit.created","event_id":"event-0003","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.1.0","schema_version":2}
4
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005","entry-0006"],"synced_audit_rows":0},"event":"entry.batch_added","event_id":"event-0004","record_revisions":{"commit_audit_sheet":1,"entry:v0.1.0/entry-0001":1,"entry:v0.1.0/entry-0002":1,"entry:v0.1.0/entry-0003":1,"entry:v0.1.0/entry-0004":1,"entry:v0.1.0/entry-0005":1,"entry:v0.1.0/entry-0006":1,"release:v0.1.0":3},"release_version":"v0.1.0","schema_version":2}
5
+ {"data":{"released_at":"2025-09-18"},"event":"release.finalized","event_id":"event-0005","record_revisions":{"release:v0.1.0":4},"release_version":"v0.1.0","schema_version":2}
6
+ {"data":{"added_source_refs":["git:70cfaae"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0005","event":"entry.updated","event_id":"event-0006","record_revisions":{"entry:v0.1.0/entry-0005":2},"release_version":"v0.1.0","schema_version":2}
7
+ {"data":{"added_source_refs":["git:f1837b4"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0003","event":"entry.updated","event_id":"event-0007","record_revisions":{"entry:v0.1.0/entry-0003":2},"release_version":"v0.1.0","schema_version":2}
8
+ {"data":{"added_source_refs":["git:7881eb2"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0006","event":"entry.updated","event_id":"event-0008","record_revisions":{"entry:v0.1.0/entry-0006":2},"release_version":"v0.1.0","schema_version":2}
9
+ {"data":{"added_source_refs":["git:91754e6"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0001","event":"entry.updated","event_id":"event-0009","record_revisions":{"entry:v0.1.0/entry-0001":2},"release_version":"v0.1.0","schema_version":2}
10
+ {"data":{"added_source_refs":["git:dda00c9"],"fields":["source_refs"],"removed_source_refs":[],"source_refs_mode":"merge"},"entry_id":"entry-0004","event":"entry.updated","event_id":"event-0010","record_revisions":{"entry:v0.1.0/entry-0004":2},"release_version":"v0.1.0","schema_version":2}
11
+ {"data":{"updated_rows":6},"event":"audit.updated","event_id":"event-0011","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.1.0","schema_version":2}
12
+ {"data":{"added_source_refs":["git:30da519bc7be31f6384cf7a798614a17408dab5b"],"fields":["source_refs"],"removed_source_refs":["git:30da519"],"source_refs_mode":"replace"},"entry_id":"entry-0002","event":"entry.updated","event_id":"event-0012","record_revisions":{"entry:v0.1.0/entry-0002":3},"release_version":"v0.1.0","schema_version":2}
13
+ {"data":{"added_source_refs":["git:f1837b4a058e20b40e7e47ace6989ea527a342c5"],"fields":["source_refs"],"removed_source_refs":["git:f1837b4"],"source_refs_mode":"replace"},"entry_id":"entry-0003","event":"entry.updated","event_id":"event-0013","record_revisions":{"entry:v0.1.0/entry-0003":3},"release_version":"v0.1.0","schema_version":2}
14
+ {"data":{"added_source_refs":["git:91754e6713e15f59aeb5b511f4ba73e3544762d4"],"fields":["source_refs"],"removed_source_refs":["git:91754e6"],"source_refs_mode":"replace"},"entry_id":"entry-0001","event":"entry.updated","event_id":"event-0014","record_revisions":{"entry:v0.1.0/entry-0001":3},"release_version":"v0.1.0","schema_version":2}
15
+ {"data":{"added_source_refs":["git:dda00c9af641edc6802697ddb3784202b64d255a"],"fields":["source_refs"],"removed_source_refs":["git:dda00c9"],"source_refs_mode":"replace"},"entry_id":"entry-0004","event":"entry.updated","event_id":"event-0015","record_revisions":{"entry:v0.1.0/entry-0004":3},"release_version":"v0.1.0","schema_version":2}
16
+ {"data":{"added_source_refs":["git:7881eb24287c818e789a03e49c758bf740116c0b"],"fields":["source_refs"],"removed_source_refs":["git:7881eb2"],"source_refs_mode":"replace"},"entry_id":"entry-0006","event":"entry.updated","event_id":"event-0016","record_revisions":{"entry:v0.1.0/entry-0006":3},"release_version":"v0.1.0","schema_version":2}
17
+ {"data":{"added_source_refs":["git:70cfaae0ec60968acd1ad2640180b3a645d8ea5c"],"fields":["source_refs"],"removed_source_refs":["git:70cfaae"],"source_refs_mode":"replace"},"entry_id":"entry-0005","event":"entry.updated","event_id":"event-0017","record_revisions":{"entry:v0.1.0/entry-0005":3},"release_version":"v0.1.0","schema_version":2}