@dataclass
class Package:
name: str
- version_files: list[Path]
+ ini_files: list[Path]
history_file: Path
tag_format: str
+ extras: list[str]
def __post_init__(self) -> None:
packages[self.name] = self
Package(
name="psycopg",
- version_files=[
- PROJECT_DIR / "psycopg/psycopg/version.py",
- PROJECT_DIR / "psycopg_c/psycopg_c/version.py",
+ ini_files=[
+ PROJECT_DIR / "psycopg/setup.cfg",
+ PROJECT_DIR / "psycopg_c/setup.cfg",
],
history_file=PROJECT_DIR / "docs/news.rst",
tag_format="{version}",
+ extras=["psycopg-c", "psycopg-binary"],
)
Package(
name="psycopg_pool",
- version_files=[PROJECT_DIR / "psycopg_pool/psycopg_pool/version.py"],
+ ini_files=[PROJECT_DIR / "psycopg_pool/setup.cfg"],
history_file=PROJECT_DIR / "docs/news_pool.rst",
tag_format="pool-{version}",
+ extras=[],
)
self.package = package
self.bump_level = BumpLevel(bump_level)
- self._version_regex = re.compile(
+ self._ini_regex = re.compile(
r"""(?ix)
^
- (?P<pre>__version__\s*=\s*(?P<quote>["']))
- (?P<ver>[^'"]+)
- (?P<post>(?P=quote)\s*(?:\#.*)?)
- $
+ (?P<pre> version \s* = \s*)
+ (?P<ver> [^\s]+)
+ (?P<post> \s*)
+ \s* $
+ """
+ )
+ self._extra_regex = re.compile(
+ r"""(?ix)
+ ^
+ (?P<pre> \s* )
+ (?P<package> [^\s]+)
+ (?P<op> \s* == \s*)
+ (?P<ver> [^\s]+)
+ (?P<post> \s*)
+ \s* $
"""
)
@cached_property
def current_version(self) -> Version:
- versions = set(
- self._parse_version_from_file(f) for f in self.package.version_files
- )
+ versions = set(self._parse_version_from_file(f) for f in self.package.ini_files)
if len(versions) > 1:
raise ValueError(
f"inconsistent versions ({', '.join(map(str, sorted(versions)))})"
- f" in {self.package.version_files}"
+ f" in {self.package.ini_files}"
)
return versions.pop()
return Version(".".join(sparts))
def update_files(self) -> None:
- for f in self.package.version_files:
+ for f in self.package.ini_files:
self._update_version_in_file(f, self.want_version)
if self.bump_level != BumpLevel.DEV:
self._update_history_file(self.package.history_file, self.want_version)
def commit(self) -> None:
- logger.debug("committing version changes")
+ logger.info("committing version changes")
msg = f"""\
chore: bump {self.package.name} package version to {self.want_version}
"""
- files = self.package.version_files + [self.package.history_file]
+ files = self.package.ini_files + [self.package.history_file]
cmdline = ["git", "commit", "-m", msg] + list(map(str, files))
sp.check_call(cmdline)
def create_tag(self) -> None:
- logger.debug("tagging version %s", self.want_version)
+ logger.info("tagging version %s", self.want_version)
tag_name = self.package.tag_format.format(version=self.want_version)
changes = self._get_changes_lines(
self.package.history_file,
matches = []
with fp.open() as f:
for line in f:
- m = self._version_regex.match(line)
+ m = self._ini_regex.match(line)
if m:
matches.append(m)
return vs
def _update_version_in_file(self, fp: Path, version: Version) -> None:
- logger.debug("upgrading version to %s in %s", version, fp)
+ logger.info("upgrading version in %s", fp)
lines = []
with fp.open() as f:
for line in f:
- if self._version_regex.match(line):
- line = self._version_regex.sub(f"\\g<pre>{version}\\g<post>", line)
+ if self._ini_regex.match(line):
+ line = self._ini_regex.sub(f"\\g<pre>{version}\\g<post>", line)
+ elif m := self._extra_regex.match(line):
+ if m.group("package") in self.package.extras:
+ line = self._extra_regex.sub(
+ f"\\g<pre>\\g<package>\\g<op>{version}\\g<post>", line
+ )
+
lines.append(line)
with fp.open("w") as f:
f.write(line)
def _update_history_file(self, fp: Path, version: Version) -> None:
- logger.debug("upgrading history file %s", fp)
+ logger.info("upgrading history file %s", fp)
with fp.open() as f:
lines = f.readlines()