diff --git a/manageprojects/tests/test_utilities_publish.py b/manageprojects/tests/test_utilities_publish.py index 8ed00c4..54f5577 100644 --- a/manageprojects/tests/test_utilities_publish.py +++ b/manageprojects/tests/test_utilities_publish.py @@ -1,3 +1,4 @@ +import inspect from pathlib import Path from unittest import TestCase @@ -7,11 +8,45 @@ from manageprojects.test_utils.logs import AssertLogs from manageprojects.test_utils.subprocess import FakeStdout, SubprocessCallMock from manageprojects.tests.base import GIT_BIN_PARENT -from manageprojects.utilities.publish import PublisherGit +from manageprojects.utilities.publish import PublisherGit, get_pyproject_toml_version from manageprojects.utilities.temp_path import TemporaryDirectory class PublishTestCase(TestCase): + def test_get_pyproject_toml_version(self): + with TemporaryDirectory(prefix='test_get_pyproject_toml_version') as temp_path: + pyproject_toml_path = temp_path / 'pyproject.toml' + pyproject_toml_path.touch() + + version = get_pyproject_toml_version(temp_path) + self.assertIs(version, None) + + pyproject_toml_path.write_text( + inspect.cleandoc( + ''' + [project] + name = "foo" + version = "1.2" + description = "bar" + ''' + ) + ) + version = get_pyproject_toml_version(temp_path) + self.assertEqual(version, Version('1.2')) + + pyproject_toml_path.write_text( + inspect.cleandoc( + ''' + [tool.poetry] + name = "foo" + version = "2.3" + description = "bar" + ''' + ) + ) + version = get_pyproject_toml_version(temp_path) + self.assertEqual(version, Version('2.3')) + def test_publisher_git(self): with AssertLogs(self, loggers=('manageprojects',)), TemporaryDirectory( prefix='test_publisher_git' diff --git a/manageprojects/utilities/publish.py b/manageprojects/utilities/publish.py index 095c146..1b24c3f 100644 --- a/manageprojects/utilities/publish.py +++ b/manageprojects/utilities/publish.py @@ -3,7 +3,9 @@ from collections.abc import Iterable from importlib.metadata import version from pathlib import Path +from typing import Optional +from bx_py_utils.dict_utils import dict_get from bx_py_utils.path import assert_is_file @@ -134,11 +136,22 @@ def clean_version(version: str) -> Version: return Version(version) -def check_version(*, module, package_path: Path) -> Version: - module_version = clean_version(module.__version__) +def get_pyproject_toml_version(package_path: Path) -> Optional[Version]: pyproject_toml_path = Path(package_path, 'pyproject.toml') assert_is_file(pyproject_toml_path) + pyproject_toml = tomllib.loads(pyproject_toml_path.read_text(encoding='UTF-8')) + + ver_str = dict_get(pyproject_toml, 'project', 'version') + if not ver_str: + ver_str = dict_get(pyproject_toml, 'tool', 'poetry', 'version') + + if ver_str: + return clean_version(ver_str) + + +def check_version(*, module, package_path: Path) -> Version: + module_version = clean_version(module.__version__) installed_version = clean_version(version(module.__name__)) if module_version != installed_version: exit_with_error( @@ -146,9 +159,10 @@ def check_version(*, module, package_path: Path) -> Version: hint='Install package and run publish again', ) - pyproject_toml = tomllib.loads(pyproject_toml_path.read_text(encoding='UTF-8')) - pyproject_version = clean_version(pyproject_toml['project']['version']) - if pyproject_version != installed_version: + pyproject_version = get_pyproject_toml_version(package_path) + if not pyproject_version: + confirm('Can not get package version from pyproject.toml') + elif pyproject_version != installed_version: exit_with_error( ( f'Version mismatch:' diff --git a/pyproject.toml b/pyproject.toml index e663974..5cf0ede 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "manageprojects" -version = "0.9.0" +version = "0.9.1" description = "Manage Python / Django projects" readme = "README.md" authors = [ diff --git a/requirements.dev.txt b/requirements.dev.txt index 562fe6b..c21e4f1 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -55,9 +55,9 @@ build==0.10.0 \ --hash=sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171 \ --hash=sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269 # via pip-tools -bx-py-utils==75 \ - --hash=sha256:2cd1053197e579f12b3d1b942f77c9736838c63cd13035db3fe5cb426283c458 \ - --hash=sha256:8b5aefea276516217bcb1b99af7c28020448d2595439c44927d0f5a880ce0c8b +bx-py-utils==76 \ + --hash=sha256:c9fcedc76daa9782b0a0c535d0d803061f61117f95957862ef58253f3c35fc0e \ + --hash=sha256:f15c64731cd9df0ca9a7bd3993fc0bf4faeb25fc30157348eb9735bf0989a210 # via manageprojects (pyproject.toml) cachetools==5.3.0 \ --hash=sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14 \ @@ -410,9 +410,8 @@ keyring==23.13.1 \ --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 # via twine -markdown-it-py==2.1.0 \ - --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ - --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da +markdown-it-py==2.2.0 \ + --hash=sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30 # via rich markupsafe==2.1.2 \ --hash=sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed \ @@ -762,9 +761,9 @@ tomlkit==0.11.6 \ --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via manageprojects (pyproject.toml) -tox==4.4.5 \ - --hash=sha256:1081864f1a1393ffa11ebe9beaa280349020579310d217a594a4e7b6124c5425 \ - --hash=sha256:f9bc83c5da8666baa2a4d4e884bbbda124fe646e4b1c0e412949cecc2b6e8f90 +tox==4.4.6 \ + --hash=sha256:9786671d23b673ace7499c602c5746e2a225d1ecd9d9f624d0461303f40bd93b \ + --hash=sha256:e3d4a65852f029e5ba441a01824d2d839d30bb8fb071635ef9cb53952698e6bf # via manageprojects (pyproject.toml) twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ @@ -804,9 +803,9 @@ pip==23.0.1 \ --hash=sha256:236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f \ --hash=sha256:cd015ea1bfb0fcef59d8a286c1f8bebcb983f6317719d415dc5351efb7cd7024 # via pip-tools -setuptools==67.3.2 \ - --hash=sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012 \ - --hash=sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48 +setuptools==67.4.0 \ + --hash=sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330 \ + --hash=sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251 # via # pip-tools # safety diff --git a/requirements.txt b/requirements.txt index 5792a0b..07ff4e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,9 +34,9 @@ black==23.1a1 \ --hash=sha256:ddbf9da228726d46f45c29024263e160d41030a415097254817d65127012d1a2 \ --hash=sha256:e88e4b633d64b9e7adc4a6b922f52bb204af9f90d7b1e3317e6490f2b598b1ea # via darker -bx-py-utils==75 \ - --hash=sha256:2cd1053197e579f12b3d1b942f77c9736838c63cd13035db3fe5cb426283c458 \ - --hash=sha256:8b5aefea276516217bcb1b99af7c28020448d2595439c44927d0f5a880ce0c8b +bx-py-utils==76 \ + --hash=sha256:c9fcedc76daa9782b0a0c535d0d803061f61117f95957862ef58253f3c35fc0e \ + --hash=sha256:f15c64731cd9df0ca9a7bd3993fc0bf4faeb25fc30157348eb9735bf0989a210 # via manageprojects (pyproject.toml) certifi==2022.12.7 \ --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ @@ -191,9 +191,8 @@ jinja2-time==0.2.0 \ --hash=sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40 \ --hash=sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa # via cookiecutter -markdown-it-py==2.1.0 \ - --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ - --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da +markdown-it-py==2.2.0 \ + --hash=sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30 # via rich markupsafe==2.1.2 \ --hash=sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed \ @@ -478,7 +477,7 @@ urllib3==1.26.14 \ # via requests # The following packages are considered to be unsafe in a requirements file: -setuptools==67.3.2 \ - --hash=sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012 \ - --hash=sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48 +setuptools==67.4.0 \ + --hash=sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330 \ + --hash=sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251 # via safety