Skip to content

Commit 8f97602

Browse files
build: add git-cliff for automated changelog and release notes (#421)
1 parent b7f7404 commit 8f97602

File tree

4 files changed

+116
-153
lines changed

4 files changed

+116
-153
lines changed

.github/workflows/prepare_release.yml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Prepare release
33
on:
44
push:
55
tags:
6-
- '*'
6+
- "*"
77
workflow_call:
88
workflow_dispatch:
99

@@ -22,7 +22,23 @@ jobs:
2222
needs:
2323
- build
2424
runs-on: ubuntu-latest
25+
permissions:
26+
contents: write
2527
steps:
28+
- name: Checkout
29+
uses: actions/checkout@v4
30+
with:
31+
fetch-depth: 0
32+
- name: Generate release notes
33+
id: release-notes
34+
uses: orhun/git-cliff-action@v4
35+
with:
36+
config: cliff.toml
37+
args: --latest --strip all
38+
env:
39+
OUTPUT: RELEASE_NOTES.md
40+
GITHUB_REPO: ${{ github.repository }}
41+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2642
- name: Download all the dists
2743
uses: actions/download-artifact@v4
2844
with:
@@ -35,6 +51,7 @@ jobs:
3551
files: |
3652
./dist/*
3753
draft: true
54+
body_path: RELEASE_NOTES.md
3855
- name: Summary
3956
run: |
4057
echo "# Release summary" >> $GITHUB_STEP_SUMMARY

CHANGELOG.md

Lines changed: 6 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -1,159 +1,13 @@
11
# CHANGELOG
22

3-
## 0.15.2 (2025-08-28)
3+
All notable unreleased changes to this project will be documented in this file.
44

5-
- Changed code typing to satisfy MyPy 1.11.0 version
6-
- Added support for `async_client=false` to work with `enable_custom_operations=true`
7-
- Fix propagating `convert_to_snake_case` to clients during package generation
8-
- Added ClientForwardRefsPlugin to standard plugins.
9-
- Re-added model_rebuild calls for input types with forward references.
10-
- Fixed fragments on interfaces being omitted from generated client.
11-
- Fixed @include directive result type when using convert_to_snake_case option.
12-
- Added Custom query builder feature.
5+
For released versions, see the [Releases](https://github.com/mirumee/ariadne-codegen/releases) page.
136

14-
## 0.14.0 (2024-07-17)
7+
## Unreleased
158

16-
- Added `ClientForwardRefsPlugin` to standard plugins.
17-
- Re-added `model_rebuild` calls for input types with forward references.
18-
- Fixed fragments on interfaces being omitted from generated client.
19-
- Fixed `@Include` directive result type when using `convert_to_snake_case` option.
20-
- Added Custom query builder feature.
9+
### ⚠️ Breaking Changes
2110

11+
### 📚 Documentation
2212

23-
## 0.13.0 (2024-03-4)
24-
25-
- Fixed `str_to_snake_case` utility to capture fully capitalized words followed by an underscore.
26-
- Re-added `model_rebuild` calls for models with forward references.
27-
- Fixed potential name conflicts between field args and generated client's method code.
28-
29-
30-
## 0.12.0 (2024-02-05)
31-
32-
- Fixed `graphql-transport-ws` protocol implementation not waiting for the `connection_ack` message on new connection.
33-
- Fixed `get_client_settings` mutating `config_dict` instance.
34-
- Added support to `graphqlschema` for saving schema as a GraphQL file.
35-
- Restored `model_rebuild` calls for top level fragment models.
36-
37-
38-
## 0.11.0 (2023-12-05)
39-
40-
- Removed `model_rebuild` calls for generated input, fragment and result models.
41-
- Added `NoReimportsPlugin` that makes the `__init__.py` of generated client package empty.
42-
- Added `include_all_inputs` config flag to generate only inputs used in supplied operations.
43-
- Added `include_all_enums` config flag to generate only enums used in supplied operations.
44-
- Added `operationName` to payload sent by generated client's methods.
45-
- Fixed base clients to pass `mypy --strict` without installed optional dependencies.
46-
- Renamed `GraphQlClientInvalidResponseError` to `GraphQLClientInvalidResponseError` (breaking change).
47-
- Changed base clients to raise `GraphQLClientGraphQLMultiError` for payloads with `errors` key but no `data` (breaking change).
48-
49-
50-
## 0.10.0 (2023-11-15)
51-
52-
- Fixed generating results for nullable fields with nullable directives.
53-
- Changed `include_comments` option to accept enum value, changed default to `"stable"`, deprecated boolean support. Added `get_file_comment` plugin hook.
54-
- Changed `str_to_snake_case` utility to correctly handle capitalized words.
55-
- Digits in Python names are now preceded by an underscore (breaking change).
56-
- Fixed parsing of unions and interfaces to always add `__typename` to generated result models.
57-
- Added escaping of enum values which are Python keywords by appending `_` to them.
58-
- Fixed `enums_module_name` option not being passed to generators.
59-
- Added additional base clients supporting the Open Telemetry tracing. Added `opentelemetry_client` config option.
60-
- Changed generated client's methods to pass `**kwargs` to base client's `execute` and `execute_ws` methods (breaking change for custom base clients).
61-
- Added `operation_definition` argument to `generate_client_method` plugin hook.
62-
- Added `ExtractOperationsPlugin` that extracts operation strings from client methods to separate module.
63-
- Added Python 3.12 to tested versions.
64-
65-
66-
## 0.9.0 (2023-09-11)
67-
68-
- Fixed generating operation string for nested inline fragments.
69-
- Removed scalars module. Changed generated models and client to use annotated types for custom scalars. Removed `scalars_module_name` option. Removed `generate_scalars_module`, `generate_scalars_cod`, `generate_scalar_annotation` and `generate_scalar_imports` plugin hooks.
70-
- Removed pydantic warnings for fields with `model_` prefix.
71-
- Fixed generating result types with nullable directives.
72-
73-
74-
## 0.8.0 (2023-08-22)
75-
76-
- Added support for `Upload` scalar. Added support for file uploads to `AsyncBaseClient` and `BaseClient`.
77-
- Added validation of defined operations against the schema.
78-
- Removed `mixin` directive from fragment string included in operation string sent to server.
79-
- Added support for `mixin` directive on fragments definitions.
80-
- Added support for fragments defined on subtype of field's type.
81-
- Added default representation for a field name consisting only of underscores.
82-
- Changed generated client and models to use pydantic v2.
83-
- Changed custom scalars implementation to utilize pydantic's `BeforeValidator` and `PlainSerializer`. Added `scalars_module_name` option. Replaced `generate_scalars_parse_dict` and `generate_scalars_serialize_dict` with `generate_scalar_annotation` and `generate_scalar_imports` plugin hooks.
84-
- Unified annotations in generated client to be compatible with python < 3.9.
85-
- Fixed generating default values of input types from remote schemas.
86-
- Changed generating of input and result field names to add `_` to names reserved by pydantic.
87-
88-
89-
## 0.7.1 (2023-06-06)
90-
91-
- Fixed `AsyncBaseClient` and `BaseClient` to send `Content-Type` header with requests.
92-
93-
94-
## 0.7.0 (2023-06-01)
95-
96-
- Added support for subscriptions as async generators.
97-
- Changed how fragments are handled to generate separate module with fragments as mixins.
98-
- Fixed `ResultTypesGenerator` to trigger `generate_result_class` for each result model.
99-
- Changed processing of models fields to trim leading underscores.
100-
- Added `ShorterResultsPlugin` to standard plugins.
101-
- Fixed handling of inline fragments inside other fragments.
102-
- Changed generated unions to use pydantic's discriminated unions feature.
103-
- Replaced HTTPX's `json=` serializer for query payloads with pydantic's `pydantic_encoder`.
104-
- Removed `mixin` directive from operation string sent to server.
105-
- Fixed `ShorterResultsPlugin` that generated faulty code for discriminated unions.
106-
- Changed generator to ignore unused fragments which should be unpacked in queries.
107-
- Changed type hints for parse and serialize methods of scalars to `typing.Any`.
108-
- Added `process_schema` plugin hook.
109-
110-
111-
## 0.6.0 (2023-04-18)
112-
113-
- Changed logic how custom scalar imports are generated. Deprecated `import_` key.
114-
- Added escaping of GraphQL names which are Python keywords by appending `_` to them.
115-
- Fixed parsing of list variables.
116-
- Changed base clients to remove unset arguments and input fields from variables payload.
117-
- Added `process_name` plugin hook.
118-
119-
120-
## 0.5.0 (2023-04-05)
121-
122-
- Added generation of GraphQL schema's Python representation.
123-
- Fixed annotations for lists.
124-
- Fixed support of custom operation types names.
125-
- Unlocked versions of black, isort, autoflake and dev dependencies
126-
- Added `remote_schema_verify_ssl` option.
127-
- Changed how default values for inputs are generated to handle potential cycles.
128-
- Fixed `BaseModel` incorrectly calling `parse` and `serialize` methods on entire list instead of its items for `list[Scalar]`.
129-
130-
131-
## 0.4.0 (2023-03-20)
132-
133-
- Fixed generating models from interfaces with inline fragments.
134-
- Added default `None` values for generated methods optional arguments.
135-
- Added basic plugin system.
136-
- Added `InitFileGenerator`, `EnumsGenerator`, `ClientGenerator` and `ArgumentsGenerator` plugin hooks.
137-
- Added `InputTypesGenerator` and `ResultTypesGenerator` plugin hooks.
138-
- Added `ScalarsDefinitionsGenerator` and `PackageGenerator` plugin hooks.
139-
- Added support for `[tool.ariadne-codegen]` section key. Deprecated `[ariadne-codegen]`.
140-
- Added support for environment variables to remote schema headers values.
141-
- Added `--config` argument to `ariadne-codegen` script, to support reading configuration from custom path.
142-
143-
144-
## 0.3.0 (2023-02-21)
145-
146-
- Changed generated code to pass `mypy --strict`.
147-
- Changed base clients to get full url from user.
148-
- Added support for custom scalars.
149-
150-
151-
## 0.2.1 (2023-02-13)
152-
153-
- Fixed incorrectly raised exception when using custom scalar as query argument type.
154-
155-
156-
## 0.2.0 (2023-02-02)
157-
158-
- Added `remote_schema_url` and `remote_schema_headers` settings to support reading remote schemas.
159-
- Added `headers` argument to `__init__` methods of `BaseClient` and `AsyncBaseClient`.
13+
### 🛠️ Build System

cliff.toml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# GitHub integration is activated in CI via GITHUB_REPO env var (set in prepare_release.yml).
2+
# For local use (just changelog-preview / just release-notes), no token is needed.
3+
# [remote.github] owner/repo can also be set here to enable local GitHub-enriched output
4+
# when GITHUB_TOKEN is available, but it is omitted to keep local commands offline-friendly.
5+
6+
[changelog]
7+
header = """# CHANGELOG
8+
9+
All notable unreleased changes to this project will be documented in this file.
10+
11+
For released versions, see the [Releases](https://github.com/mirumee/ariadne/releases) page.
12+
13+
"""
14+
# Template produces two zones:
15+
# 1. Summary sections – grouped, emoji-prefixed, breaking changes first (CHANGELOG.md / release body top)
16+
# 2. What's Changed – flat list of every commit with contributor @mentions and PR links (release body only)
17+
body = """
18+
{% if version -%}
19+
## {{ version }} ({{ timestamp | date(format="%Y-%m-%d") }})
20+
{% else -%}
21+
## Unreleased
22+
{% endif -%}
23+
{% set breaking_commits = commits | filter(attribute="breaking", value=true) -%}
24+
{% if breaking_commits %}
25+
### ⚠️ Breaking Changes
26+
{% for commit in breaking_commits -%}
27+
- **{{ commit.message | upper_first | trim }}**{% if commit.body %}
28+
29+
{{ commit.body | trim | indent(prefix=" ") }}
30+
{% endif %}
31+
{% endfor %}
32+
{%- endif %}
33+
{%- for group, commits in commits | group_by(attribute="group") -%}
34+
{%- set non_breaking = commits | filter(attribute="breaking", value=false) -%}
35+
{%- if non_breaking and group != "_misc" %}
36+
### {{ group }}
37+
{% for commit in non_breaking -%}
38+
- {{ commit.message | upper_first | trim }}{% if commit.remote.username %} (by @{{ commit.remote.username }}{% if commit.remote.pr_number %} in [#{{ commit.remote.pr_number }}](https://github.com/mirumee/ariadne/pull/{{ commit.remote.pr_number }}){% endif %}){% endif %}
39+
{% endfor %}
40+
{%- endif -%}
41+
{% endfor %}
42+
{% if version %}
43+
## What's Changed
44+
{% for commit in commits -%}
45+
* {{ commit.message | upper_first | trim }}{% if commit.remote.username %} by @{{ commit.remote.username }}{% endif %}{% if commit.remote.pr_number %} in [#{{ commit.remote.pr_number }}](https://github.com/mirumee/ariadne/pull/{{ commit.remote.pr_number }}){% endif %}
46+
{% endfor %}
47+
{%- if github.contributors is defined -%}
48+
{%- set new_contributors = github.contributors | filter(attribute="is_first_time", value=true) -%}
49+
{%- if new_contributors | length != 0 %}
50+
### New Contributors
51+
{% for contributor in new_contributors -%}
52+
* @{{ contributor.username }} made their first contribution{% if contributor.pr_number %} in [#{{ contributor.pr_number }}](https://github.com/mirumee/ariadne/pull/{{ contributor.pr_number }}){% endif %}
53+
{% endfor %}
54+
{%- endif -%}
55+
{%- endif %}
56+
**Full Changelog**: https://github.com/mirumee/ariadne/compare/{{ previous.version }}...{{ version }}
57+
{% endif -%}
58+
"""
59+
trim = true
60+
footer = ""
61+
62+
[git]
63+
conventional_commits = true
64+
filter_unconventional = true
65+
split_commits = false
66+
protect_breaking_commits = false
67+
# Keep all conventional commits (including chore/type/style) so they appear in "What's Changed".
68+
# Non-conventional commits (e.g. "Benchmark results for 3.14") are removed by filter_unconventional.
69+
filter_commits = false
70+
sort_commits = "oldest"
71+
72+
# Only include stable release tags (no .rc, .dev, .b, .beta, .alpha suffixes)
73+
tag_pattern = "^[0-9]+\\.[0-9]+(\\.[0-9]+)?$"
74+
# Skip pre-release tags – their commits are folded into the next stable release
75+
skip_tags = "\\.(rc|dev)[0-9]*$"
76+
ignore_tags = "\\.(b|beta|alpha)[0-9]*$"
77+
78+
commit_parsers = [
79+
{ message = "^feat", group = "✨ New Features" },
80+
{ message = "^fix", group = "🐛 Bug Fixes" },
81+
{ message = "^perf", group = "⚡ Performance" },
82+
{ message = "^refactor", group = "♻️ Refactoring" },
83+
{ message = "^docs?", group = "📚 Documentation" },
84+
{ message = "^build", group = "🛠️ Build System" },
85+
{ message = "^ci", group = "👷 CI/CD" },
86+
{ message = "^test", group = "🧪 Testing" },
87+
# Grouped as _misc so they appear in "What's Changed" but are hidden from the summary sections
88+
{ message = ".*", group = "_misc" },
89+
]

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ check = [
8484
"hatch test --cover",
8585
"hatch run types:check",
8686
]
87+
changelog-preview = "git cliff --unreleased --strip all"
88+
changelog-update = "git cliff --unreleased -o CHANGELOG.md"
89+
release-notes = "git cliff --latest --strip all"
8790

8891
## Types environment
8992

0 commit comments

Comments
 (0)