|
29 | 29 |
|
30 | 30 | import re
|
31 | 31 | from collections import OrderedDict, defaultdict
|
32 |
| -from collections.abc import Iterable |
| 32 | +from collections.abc import Iterable, Iterator, Mapping |
33 | 33 | from dataclasses import dataclass
|
34 | 34 | from datetime import date
|
35 |
| -from typing import TYPE_CHECKING |
| 35 | +from typing import TYPE_CHECKING, Any |
36 | 36 |
|
37 | 37 | from jinja2 import (
|
38 | 38 | BaseLoader,
|
@@ -84,7 +84,7 @@ def generate_tree_from_commits(
|
84 | 84 | changelog_message_builder_hook: MessageBuilderHook | None = None,
|
85 | 85 | changelog_release_hook: ChangelogReleaseHook | None = None,
|
86 | 86 | rules: TagRules | None = None,
|
87 |
| -) -> Iterable[dict]: |
| 87 | +) -> Iterator[dict[str, Any]]: |
88 | 88 | pat = re.compile(changelog_pattern)
|
89 | 89 | map_pat = re.compile(commit_parser, re.MULTILINE)
|
90 | 90 | body_map_pat = re.compile(commit_parser, re.MULTILINE | re.DOTALL)
|
@@ -187,24 +187,24 @@ def process_commit_message(
|
187 | 187 | changes[change_type].append(msg)
|
188 | 188 |
|
189 | 189 |
|
190 |
| -def order_changelog_tree(tree: Iterable, change_type_order: list[str]) -> Iterable: |
| 190 | +def order_changelog_tree( |
| 191 | + tree: Iterable[Mapping[str, Any]], change_type_order: list[str] |
| 192 | +) -> Iterator[dict[str, Any]]: |
191 | 193 | if len(set(change_type_order)) != len(change_type_order):
|
192 | 194 | raise InvalidConfigurationError(
|
193 | 195 | f"Change types contain duplicates types ({change_type_order})"
|
194 | 196 | )
|
195 | 197 |
|
196 |
| - sorted_tree = [] |
197 | 198 | for entry in tree:
|
198 |
| - ordered_change_types = change_type_order + sorted( |
199 |
| - set(entry["changes"].keys()) - set(change_type_order) |
200 |
| - ) |
201 |
| - changes = [ |
202 |
| - (ct, entry["changes"][ct]) |
203 |
| - for ct in ordered_change_types |
204 |
| - if ct in entry["changes"] |
205 |
| - ] |
206 |
| - sorted_tree.append({**entry, **{"changes": OrderedDict(changes)}}) |
207 |
| - return sorted_tree |
| 199 | + yield { |
| 200 | + **entry, |
| 201 | + "changes": OrderedDict( |
| 202 | + (ct, entry["changes"][ct]) |
| 203 | + for ct in change_type_order |
| 204 | + + sorted(set(entry["changes"].keys()) - set(change_type_order)) |
| 205 | + if ct in entry["changes"] |
| 206 | + ), |
| 207 | + } |
208 | 208 |
|
209 | 209 |
|
210 | 210 | def get_changelog_template(loader: BaseLoader, template: str) -> Template:
|
|
0 commit comments