|
2 | 2 |
|
3 | 3 | import os
|
4 | 4 | from abc import ABCMeta
|
5 |
| -from typing import IO, Any, ClassVar |
| 5 | +from typing import IO, ClassVar |
6 | 6 |
|
7 | 7 | from commitizen.changelog import Metadata
|
8 | 8 | from commitizen.config.base_config import BaseConfig
|
@@ -40,34 +40,40 @@ def get_metadata(self, filepath: str) -> Metadata:
|
40 | 40 | with open(filepath, encoding=self.encoding) as changelog_file:
|
41 | 41 | return self.get_metadata_from_file(changelog_file)
|
42 | 42 |
|
43 |
| - def get_metadata_from_file(self, file: IO[Any]) -> Metadata: |
44 |
| - meta = Metadata() |
| 43 | + def get_metadata_from_file(self, file: IO[str]) -> Metadata: |
| 44 | + out_metadata = Metadata() |
45 | 45 | unreleased_level: int | None = None
|
46 |
| - for index, line in enumerate(file): |
47 |
| - line = line.strip().lower() |
48 | 46 |
|
49 |
| - unreleased: int | None = None |
50 |
| - if "unreleased" in line: |
51 |
| - unreleased = self.parse_title_level(line) |
| 47 | + lines = file.readlines() |
| 48 | + for index, line in enumerate(line.strip().lower() for line in lines): |
| 49 | + parsed_unreleased_level = self.parse_title_level(line) |
| 50 | + current_unreleased_level = ( |
| 51 | + parsed_unreleased_level if "unreleased" in line else None |
| 52 | + ) |
| 53 | + |
52 | 54 | # Try to find beginning and end lines of the unreleased block
|
53 |
| - if unreleased: |
54 |
| - meta.unreleased_start = index |
55 |
| - unreleased_level = unreleased |
| 55 | + if current_unreleased_level: |
| 56 | + out_metadata.unreleased_start = index |
| 57 | + unreleased_level = current_unreleased_level |
56 | 58 | continue
|
57 |
| - elif unreleased_level and self.parse_title_level(line) == unreleased_level: |
58 |
| - meta.unreleased_end = index |
| 59 | + |
| 60 | + if unreleased_level and parsed_unreleased_level == unreleased_level: |
| 61 | + out_metadata.unreleased_end = index |
59 | 62 |
|
60 | 63 | # Try to find the latest release done
|
61 |
| - parsed = self.parse_version_from_title(line) |
62 |
| - if parsed: |
63 |
| - meta.latest_version = parsed.version |
64 |
| - meta.latest_version_tag = parsed.tag |
65 |
| - meta.latest_version_position = index |
| 64 | + if parsed_version_tag := self.parse_version_from_title(line): |
| 65 | + out_metadata.latest_version = parsed_version_tag.version |
| 66 | + out_metadata.latest_version_tag = parsed_version_tag.tag |
| 67 | + out_metadata.latest_version_position = index |
66 | 68 | break # there's no need for more info
|
67 |
| - if meta.unreleased_start is not None and meta.unreleased_end is None: |
68 |
| - meta.unreleased_end = index |
69 | 69 |
|
70 |
| - return meta |
| 70 | + if ( |
| 71 | + out_metadata.unreleased_start is not None |
| 72 | + and out_metadata.unreleased_end is None |
| 73 | + ): |
| 74 | + out_metadata.unreleased_end = len(lines) |
| 75 | + |
| 76 | + return out_metadata |
71 | 77 |
|
72 | 78 | def parse_version_from_title(self, line: str) -> VersionTag | None:
|
73 | 79 | """
|
|
0 commit comments