From 23c173b6efd3645c6cad130c85c853a9c6fc9053 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Thu, 29 Dec 2022 00:26:33 +0000 Subject: [PATCH] chore(bump-version): find versions to maintain in setup.cfg files --- psycopg/setup.cfg | 2 ++ tools/bump_version.py | 64 +++++++++++++++++++++++++++---------------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/psycopg/setup.cfg b/psycopg/setup.cfg index 5dd06445c..29e64c895 100644 --- a/psycopg/setup.cfg +++ b/psycopg/setup.cfg @@ -14,6 +14,8 @@ version = 3.2.0.dev1 # also change: # - `docs/news.rst` to declare this as the current version or an unreleased one # - `psycopg_c/setup.cfg`, and the extra dependencies below, to the same version. +# +# Check out tools/bump_version.py to help maintaining versions. project_urls = Homepage = https://psycopg.org/ diff --git a/tools/bump_version.py b/tools/bump_version.py index 50dbe0bd4..3c12aba0b 100755 --- a/tools/bump_version.py +++ b/tools/bump_version.py @@ -25,9 +25,10 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(mess @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 @@ -37,19 +38,21 @@ packages: dict[str, Package] = {} 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=[], ) @@ -58,25 +61,34 @@ class Bumper: self.package = package self.bump_level = BumpLevel(bump_level) - self._version_regex = re.compile( + self._ini_regex = re.compile( r"""(?ix) ^ - (?P
__version__\s*=\s*(?P["']))
-            (?P[^'"]+)
-            (?P(?P=quote)\s*(?:\#.*)?)
-            $
+            (?P
 version \s* = \s*)
+            (?P [^\s]+)
+            (?P \s*)
+            \s* $
+            """
+        )
+        self._extra_regex = re.compile(
+            r"""(?ix)
+            ^
+            (?P
 \s* )
+            (?P [^\s]+)
+            (?P \s* == \s*)
+            (?P [^\s]+)
+            (?P \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()
@@ -115,23 +127,23 @@ class Bumper:
         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,
@@ -150,7 +162,7 @@ chore: bump {self.package.name} package version to {self.want_version}
         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)
 
@@ -164,12 +176,18 @@ chore: bump {self.package.name} package version to {self.want_version}
         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
{version}\\g", line)
+                if self._ini_regex.match(line):
+                    line = self._ini_regex.sub(f"\\g
{version}\\g", line)
+                elif m := self._extra_regex.match(line):
+                    if m.group("package") in self.package.extras:
+                        line = self._extra_regex.sub(
+                            f"\\g
\\g\\g{version}\\g", line
+                        )
+
                 lines.append(line)
 
         with fp.open("w") as f:
@@ -177,7 +195,7 @@ chore: bump {self.package.name} package version to {self.want_version}
                 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()
 
-- 
2.47.2