Projects
openEuler:Mainline
python-setuptools_scm
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 2
View file
_service:tar_scm:python-setuptools_scm.spec
Changed
@@ -1,11 +1,11 @@ %global _empty_manifest_terminate_build 0 Name: python-setuptools_scm -Version: 4.1.2 +Version: 6.0.0 Release: 1 Summary: Manage your Python package versions in SCM metadata License: MIT URL: https://pypi.python.org/pypi/setuptools_scm/ -Source0: https://files.pythonhosted.org/packages/cd/66/fa77e809b7cb1c2e14b48c7fc8a8cd657a27f4f9abb848df0c967b6e4e11/setuptools_scm-4.1.2.tar.gz +Source0: https://files.pythonhosted.org/packages/bf/b1/e647ab0ad77ad74fde7f088cfa796b6b8ff24d4e2d4fa5a0d924fdbd9c6b/setuptools_scm-6.0.0.tar.gz BuildArch: noarch Requires: python3-setuptool @@ -75,6 +75,9 @@ %{_pkgdocdir} %changelog +* Thu Jun 16 2022 OpenStack_SIG <openstack@openeuler.org> - 6.0.0-1 +- Upgrade version for openstack yoga + * Thu Dec 3 2020 baizhonggui <baizhonggui@huawei.com> - 4.1.2-1 - Update to 4.1.2
View file
_service
Changed
@@ -2,7 +2,7 @@ <service name="tar_scm"> <param name="scm">git</param> <param name="url">git@gitee.com:src-openeuler/python-setuptools_scm.git</param> - <param name="revision">28f2d6b95b355c99ae30f0144733b327d5f30eb3</param> + <param name="revision">a0a7f860f9a33c31a0ec8e4f7990e7afce043d9a</param> <param name="exclude">*</param> <param name="extract">*</param> </service>
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/win_py31_compat.py
Deleted
@@ -1,214 +0,0 @@ -""" -Backport of os.path.samefile for Python prior to 3.2 -on Windows from jaraco.windows 3.8. - -DON'T EDIT THIS FILE! - -Instead, file tickets and PR's with `jaraco.windows -<https://github.com/jaraco/jaraco.windows>`_ and request -a port to setuptools_scm. -""" - -import os -import nt -import posixpath -import ctypes.wintypes -import sys -import __builtin__ as builtins - - -## -# From jaraco.windows.error - -def format_system_message(errno): - """ - Call FormatMessage with a system error number to retrieve - the descriptive error message. - """ - # first some flags used by FormatMessageW - ALLOCATE_BUFFER = 0x100 - FROM_SYSTEM = 0x1000 - - # Let FormatMessageW allocate the buffer (we'll free it below) - # Also, let it know we want a system error message. - flags = ALLOCATE_BUFFER | FROM_SYSTEM - source = None - message_id = errno - language_id = 0 - result_buffer = ctypes.wintypes.LPWSTR() - buffer_size = 0 - arguments = None - bytes = ctypes.windll.kernel32.FormatMessageW( - flags, - source, - message_id, - language_id, - ctypes.byref(result_buffer), - buffer_size, - arguments, - ) - # note the following will cause an infinite loop if GetLastError - # repeatedly returns an error that cannot be formatted, although - # this should not happen. - handle_nonzero_success(bytes) - message = result_buffer.value - ctypes.windll.kernel32.LocalFree(result_buffer) - return message - - -class WindowsError(builtins.WindowsError): - """ - More info about errors at - http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx - """ - - def __init__(self, value=None): - if value is None: - value = ctypes.windll.kernel32.GetLastError() - strerror = format_system_message(value) - if sys.version_info > (3, 3): - args = 0, strerror, None, value - else: - args = value, strerror - super(WindowsError, self).__init__(*args) - - @property - def message(self): - return self.strerror - - @property - def code(self): - return self.winerror - - def __str__(self): - return self.message - - def __repr__(self): - return '{self.__class__.__name__}({self.winerror})'.format(**vars()) - - -def handle_nonzero_success(result): - if result == 0: - raise WindowsError() - - -## -# From jaraco.windows.api.filesystem - -FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 -FILE_FLAG_BACKUP_SEMANTICS = 0x2000000 -OPEN_EXISTING = 3 -FILE_ATTRIBUTE_NORMAL = 0x80 -FILE_READ_ATTRIBUTES = 0x80 -INVALID_HANDLE_VALUE = ctypes.wintypes.HANDLE(-1).value - - -class BY_HANDLE_FILE_INFORMATION(ctypes.Structure): - _fields_ = - ('file_attributes', ctypes.wintypes.DWORD), - ('creation_time', ctypes.wintypes.FILETIME), - ('last_access_time', ctypes.wintypes.FILETIME), - ('last_write_time', ctypes.wintypes.FILETIME), - ('volume_serial_number', ctypes.wintypes.DWORD), - ('file_size_high', ctypes.wintypes.DWORD), - ('file_size_low', ctypes.wintypes.DWORD), - ('number_of_links', ctypes.wintypes.DWORD), - ('file_index_high', ctypes.wintypes.DWORD), - ('file_index_low', ctypes.wintypes.DWORD), - - - @property - def file_size(self): - return (self.file_size_high << 32) + self.file_size_low - - @property - def file_index(self): - return (self.file_index_high << 32) + self.file_index_low - - -class SECURITY_ATTRIBUTES(ctypes.Structure): - _fields_ = ( - ('length', ctypes.wintypes.DWORD), - ('p_security_descriptor', ctypes.wintypes.LPVOID), - ('inherit_handle', ctypes.wintypes.BOOLEAN), - ) - - -LPSECURITY_ATTRIBUTES = ctypes.POINTER(SECURITY_ATTRIBUTES) - - -CreateFile = ctypes.windll.kernel32.CreateFileW -CreateFile.argtypes = ( - ctypes.wintypes.LPWSTR, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - LPSECURITY_ATTRIBUTES, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.wintypes.HANDLE, -) -CreateFile.restype = ctypes.wintypes.HANDLE - -GetFileInformationByHandle = ctypes.windll.kernel32.GetFileInformationByHandle -GetFileInformationByHandle.restype = ctypes.wintypes.BOOL -GetFileInformationByHandle.argtypes = ( - ctypes.wintypes.HANDLE, - ctypes.POINTER(BY_HANDLE_FILE_INFORMATION), -) - - -## -# From jaraco.windows.filesystem - -def compat_stat(path): - """ - Generate stat as found on Python 3.2 and later. - """ - stat = os.stat(path) - info = get_file_info(path) - # rewrite st_ino, st_dev, and st_nlink based on file info - return nt.stat_result( - (stat.st_mode,) + - (info.file_index, info.volume_serial_number, info.number_of_links) + - stat4: - ) - - -def samefile(f1, f2): - """ - Backport of samefile from Python 3.2 with support for Windows. - """ - return posixpath.samestat(compat_stat(f1), compat_stat(f2)) - - -def get_file_info(path): - # open the file the same way CPython does in posixmodule.c - desired_access = FILE_READ_ATTRIBUTES - share_mode = 0 - security_attributes = None - creation_disposition = OPEN_EXISTING - flags_and_attributes = ( - FILE_ATTRIBUTE_NORMAL | - FILE_FLAG_BACKUP_SEMANTICS | - FILE_FLAG_OPEN_REPARSE_POINT - ) - template_file = None - - handle = CreateFile( - path, - desired_access,
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/.github/workflows/pre-commit.yml -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/.github/workflows/pre-commit.yml
Changed
@@ -10,9 +10,9 @@ runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v2 - name: set PY - run: echo "::set-env name=PY::$(python --version --version | sha256sum | cut -d' ' -f1)" + run: echo "PY=$(python --version --version | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV - uses: actions/cache@v1 with: path: ~/.cache/pre-commit
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/.github/workflows/python-tests.yml -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/.github/workflows/python-tests.yml
Changed
@@ -4,7 +4,7 @@ pull_request: push: branches: - - master + - main tags: - "v*" release: @@ -15,31 +15,30 @@ strategy: fail-fast: false matrix: - python_version: '2.7', '3.5', '3.6', '3.7', '3.8', 'pypy2', 'pypy3' + python_version: '3.6', '3.7', '3.8', '3.9', 'pypy3' os: windows-latest, ubuntu-latest #, macos-latest - exclude: - - os: windows-latest - python_version: "pypy2" include: - - os: ubuntu-latest - python_version: '3.9-dev' + - os: windows-latest + python_version: 'msys2' name: ${{ matrix.os }} - Python ${{ matrix.python_version }} steps: - uses: actions/checkout@v1 - name: Setup python uses: actions/setup-python@v2 - if: matrix.python_version != '3.9-dev' + if: matrix.python_version != 'msys2' with: python-version: ${{ matrix.python_version }} architecture: x64 - - name: Set up Python ${{ matrix.python_version }} (deadsnakes) - uses: deadsnakes/action@v1.0.0 - if: matrix.python_version == '3.9-dev' + - name: Setup MSYS2 + uses: msys2/setup-msys2@v2 + if: matrix.python_version == 'msys2' with: - python-version: ${{ matrix.python_version }} - architecture: x64 + msystem: MINGW64 + install: git mingw-w64-x86_64-python mingw-w64-x86_64-python-setuptools + update: true - run: pip install -U setuptools + if: matrix.python_version != 'msys2' - run: pip install -e .toml pytest - run: pytest @@ -48,8 +47,9 @@ strategy: fail-fast: false matrix: - python_version: '2.7', '3.5', '3.6', '3.7', '3.8', 'pypy2', 'pypy3' - name: check self install - Python ${{ matrix.python_version }} + python_version: '3.6', '3.9', 'pypy3' + installer: "pip install", easy_install + name: check self install - Python ${{ matrix.python_version }} via ${{ matrix.installer }} steps: - uses: actions/checkout@v1 - name: Setup python @@ -59,47 +59,14 @@ architecture: x64 # self install testing needs some clarity # so its being executed without any other tools running - - run: pip install -U setuptools + # setuptools smaller 52 is needed too di easy_install + - run: pip install -U "setuptools<52" - run: python setup.py egg_info - run: python setup.py sdist - - run: easy_install dist/* + - run: ${{ matrix.installer }} dist/* - run: python testing/check_self_install.py - eggs: - runs-on: ubuntu-latest - - needs: test - name: Python ${{ matrix.python_version }} eggs - strategy: - matrix: - python_version: '2.7', '3.5', '3.6', '3.7', '3.8', '3.9-dev' - steps: - - uses: actions/checkout@v1 - - name: Setup python - uses: actions/setup-python@v2 - if: matrix.python_version != '3.9-dev' - with: - python-version: ${{ matrix.python_version }} - architecture: x64 - - name: Set up Python ${{ matrix.python_version }} (deadsnakes) - uses: deadsnakes/action@v1.0.0 - if: matrix.python_version == '3.9-dev' - with: - python-version: ${{ matrix.python_version }} - architecture: x64 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install --upgrade wheel setuptools - - run: python setup.py egg_info - - name: Build package - run: python setup.py bdist_egg - - uses: actions/upload-artifact@v2 - with: - name: dist - path: dist - dist: runs-on: ubuntu-latest @@ -107,16 +74,16 @@ name: Python bdist/wheel steps: - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v2 with: python-version: "3.8" - name: Install dependencies run: | python -m pip install --upgrade pip - pip install --upgrade wheel setuptools - - run: python setup.py egg_info + pip install --upgrade wheel setuptools build + - name: Build package - run: python setup.py bdist_wheel sdist + run: python -m build -s -w -o dist/ - uses: actions/upload-artifact@v2 with: name: dist @@ -125,7 +92,7 @@ dist_check: runs-on: ubuntu-latest - needs: eggs, dist + needs: dist steps: - uses: actions/setup-python@v2 with:
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/.gitignore -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/.gitignore
Changed
@@ -32,6 +32,7 @@ # Installer logs pip-log.txt pip-delete-this-directory.txt +pip-wheel-metadata # Unit test / coverage reports htmlcov/
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/CHANGELOG.rst -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/CHANGELOG.rst
Changed
@@ -1,3 +1,49 @@ +v6.0.0 +====== + +* fix #517: drop dead python support >3.6 required +* drop dead setuptools support > 45 required (can install wheels) +* drop egg building (use wheels) +* add git node_date metadata to get the commit time-stamp of HEAD +* allow version schemes to be priority ordered lists of version schemes +* support for calendar versioning (calver) by date + +v5.0.2 +====== + +* fix #415: use git for matching prefixes to support the windows situation + +v5.0.1 +====== + +* fix #509: support ``SETUPTOOLS_SCM_PRETEND_VERSION_FOR_${DISTRIBUTION_NAME}`` for ``pyproject.toml`` + +v5.0.0 +====== + + +Breaking changes: + +* fix #339: strict errors on missing scms when parsing a scm dir to avoid false version lookups +* fix #337: if relative_to is a directory instead of a file, + consider it as direct target instead of the containing folder and print a warning + +Bugfixes: + +* fix #352: add support for generally ignoring specific vcs roots +* fix #471: better error for version bump failing on complex but accepted tag +* fix #479: raise indicative error when tags carry non-parsable information +* Add `no-guess-dev` which does no next version guessing, just adds `.post1.devN` in + case there are new commits after the tag +* add python3.9 +* enhance documentation +* consider SOURCE_DATE_EPOCH for versioning +* add a version_tuple to write_to templates +* fix #321: add support for the ``SETUPTOOLS_SCM_PRETEND_VERSION_FOR_${DISTRIBUTION_NAME}`` env var to target the pretend key +* fix #142: clearly list supported scm +* fix #213: better error message for non-zero dev numbers in tags +* fix #356: add git branch to version on describe failure + v4.1.2 ======= @@ -23,7 +69,7 @@ v4.0.0 ====== -* Add ``parentdir_project_version`` to support installs from GitHub release +* Add ``parentdir_prefix_version`` to support installs from GitHub release tarballs. * use Coordinated Universal Time (UTC) * switch to github actions for ci
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/MANIFEST.in -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/MANIFEST.in
Changed
@@ -1,5 +1,4 @@ exclude *.nix -exclude .travis.yaml exclude .pre-commit-config.yaml include *.py include testing/*.py
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/PKG-INFO -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/PKG-INFO
Changed
@@ -1,13 +1,13 @@ Metadata-Version: 2.1 Name: setuptools_scm -Version: 4.1.2 +Version: 6.0.0 Summary: the blessed package to manage your versions by scm tags Home-page: https://github.com/pypa/setuptools_scm/ Author: Ronny Pfannschmidt Author-email: opensource@ronnypfannschmidt.de License: MIT Description: setuptools_scm - =============== + ============== ``setuptools_scm`` handles managing your Python package versions in SCM metadata instead of declaring them as the version argument @@ -17,8 +17,15 @@ (i.e. it automatically adds all of the SCM-managed files to the sdist). Unwanted files must be excluded by discarding them via ``MANIFEST.in``. - .. image:: https://travis-ci.org/pypa/setuptools_scm.svg?branch=master - :target: https://travis-ci.org/pypa/setuptools_scm + ``setuptools_scm`` support the following scm out of the box: + + * git + * mercurial + + + + .. image:: https://github.com/pypa/setuptools_scm/workflows/python%20tests+artifacts+release/badge.svg + :target: https://github.com/pypa/setuptools_scm/actions .. image:: https://tidelift.com/badges/package/pypi/setuptools-scm :target: https://tidelift.com/subscription/pkg/pypi-setuptools-scm?utm_source=pypi-setuptools-scm&utm_medium=readme @@ -195,7 +202,7 @@ If you have opted not to hardcode the version number inside the package, you can retrieve it at runtime from PEP-0566_ metadata using - ``importlib.metadata`` from the standard library + ``importlib.metadata`` from the standard library (added in Python 3.8) or the `importlib_metadata`_ backport: .. code:: python @@ -203,10 +210,10 @@ from importlib.metadata import version, PackageNotFoundError try: - __version__ = version(__name__) + __version__ = version("package-name") except PackageNotFoundError: # package is not installed - pass + pass Alternatively, you can use ``pkg_resources`` which is included in ``setuptools``: @@ -216,12 +223,13 @@ from pkg_resources import get_distribution, DistributionNotFound try: - __version__ = get_distribution(__name__).version + __version__ = get_distribution("package-name").version except DistributionNotFound: # package is not installed pass - This does place a runtime dependency on ``setuptools``. + However, this does place a runtime dependency on ``setuptools`` and can add up to + a few 100ms overhead for the package import time. .. _PEP-0566: https://www.python.org/dev/peps/pep-0566/ .. _importlib_metadata: https://pypi.org/project/importlib-metadata/ @@ -246,7 +254,7 @@ prevents using needless volatile data there. Notable Plugins - ---------------- + --------------- `setuptools_scm_git_archive <https://pypi.python.org/pypi/setuptools_scm_git_archive>`_ Provides partial support for obtaining versions from git archives that @@ -256,7 +264,7 @@ Default versioning scheme - -------------------------- + ------------------------- In the standard configuration ``setuptools_scm`` takes a look at three things: @@ -278,6 +286,7 @@ The next version is calculated by adding ``1`` to the last numeric component of the tag. + For Git projects, the version relies on `git describe <https://git-scm.com/docs/git-describe>`_, so you will see an additional ``g`` prepended to the ``{revision hash}``. @@ -298,7 +307,7 @@ Builtin mechanisms for obtaining version numbers - -------------------------------------------------- + ------------------------------------------------ 1. the SCM itself (git/hg) 2. ``.hg_archival`` files (mercurial archives) @@ -443,11 +452,31 @@ its used as the primary source for the version number in which case it will be a unparsed string + + :SETUPTOOLS_SCM_PRETEND_VERSION_FOR_${UPPERCASED_DIST_NAME}: + when defined and not empty, + its used as the primary source for the version number + in which case it will be a unparsed string + + it takes precedence over ``SETUPTOOLS_SCM_PRETEND_VERSION`` + + :SETUPTOOLS_SCM_DEBUG: when defined and not empty, a lot of debug information will be printed as part of ``setuptools_scm`` operating + :SOURCE_DATE_EPOCH: + when defined, used as the timestamp from which the + ``node-and-date`` and ``node-and-timestamp`` local parts are + derived, otherwise the current time is used + (https://reproducible-builds.org/docs/source-date-epoch/) + + + :SETUPTOOLS_SCM_IGNORE_VCS_ROOTS: + when defined, a ``os.pathsep`` separated list + of directory names to ignore for root finding + Extending setuptools_scm ------------------------ @@ -488,6 +517,8 @@ :guess-next-dev: Automatically guesses the next development version (default). Guesses the upcoming release by incrementing the pre-release segment if present, otherwise by incrementing the micro segment. Then appends :code:`.devN`. + In case the tag ends with ``.dev0`` the version is not bumped + and custom ``.devN`` versions will trigger a error. :post-release: generates post release versions (adds :code:`.postN`) :python-simplified-semver: Basic semantic versioning. Guesses the upcoming release by incrementing the minor segment and setting the micro segment to zero if the @@ -499,6 +530,7 @@ that matches the most recent tag up to the minor segment. Otherwise if on a non-release branch, increments the minor segment and sets the micro segment to zero, then appends :code:`.devN`. + :no-guess-dev: Does no next version guessing, just adds :code:`.post1.devN` ``setuptools_scm.local_scheme`` Configures how the local part of a version is rendered given a @@ -548,7 +580,7 @@ Note on testing non-installed versions - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While the general advice is to test against a installed version, some environments require a test prior to install, @@ -585,9 +617,9 @@ Everyone interacting in the ``setuptools_scm`` project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the - `PyPA Code of Conduct`_. + `PSF Code of Conduct`_. - .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md Security Contact ================ @@ -601,15 +633,16 @@ Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Version Control Classifier: Topic :: System :: Software Distribution Classifier: Topic :: Utilities -Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7 +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst Provides-Extra: toml
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/README.rst -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/README.rst
Changed
@@ -1,5 +1,5 @@ setuptools_scm -=============== +============== ``setuptools_scm`` handles managing your Python package versions in SCM metadata instead of declaring them as the version argument @@ -9,8 +9,15 @@ (i.e. it automatically adds all of the SCM-managed files to the sdist). Unwanted files must be excluded by discarding them via ``MANIFEST.in``. -.. image:: https://travis-ci.org/pypa/setuptools_scm.svg?branch=master - :target: https://travis-ci.org/pypa/setuptools_scm +``setuptools_scm`` support the following scm out of the box: + +* git +* mercurial + + + +.. image:: https://github.com/pypa/setuptools_scm/workflows/python%20tests+artifacts+release/badge.svg + :target: https://github.com/pypa/setuptools_scm/actions .. image:: https://tidelift.com/badges/package/pypi/setuptools-scm :target: https://tidelift.com/subscription/pkg/pypi-setuptools-scm?utm_source=pypi-setuptools-scm&utm_medium=readme @@ -187,7 +194,7 @@ If you have opted not to hardcode the version number inside the package, you can retrieve it at runtime from PEP-0566_ metadata using -``importlib.metadata`` from the standard library +``importlib.metadata`` from the standard library (added in Python 3.8) or the `importlib_metadata`_ backport: .. code:: python @@ -195,10 +202,10 @@ from importlib.metadata import version, PackageNotFoundError try: - __version__ = version(__name__) + __version__ = version("package-name") except PackageNotFoundError: # package is not installed - pass + pass Alternatively, you can use ``pkg_resources`` which is included in ``setuptools``: @@ -208,12 +215,13 @@ from pkg_resources import get_distribution, DistributionNotFound try: - __version__ = get_distribution(__name__).version + __version__ = get_distribution("package-name").version except DistributionNotFound: # package is not installed pass -This does place a runtime dependency on ``setuptools``. +However, this does place a runtime dependency on ``setuptools`` and can add up to +a few 100ms overhead for the package import time. .. _PEP-0566: https://www.python.org/dev/peps/pep-0566/ .. _importlib_metadata: https://pypi.org/project/importlib-metadata/ @@ -238,7 +246,7 @@ prevents using needless volatile data there. Notable Plugins ----------------- +--------------- `setuptools_scm_git_archive <https://pypi.python.org/pypi/setuptools_scm_git_archive>`_ Provides partial support for obtaining versions from git archives that @@ -248,7 +256,7 @@ Default versioning scheme --------------------------- +------------------------- In the standard configuration ``setuptools_scm`` takes a look at three things: @@ -270,6 +278,7 @@ The next version is calculated by adding ``1`` to the last numeric component of the tag. + For Git projects, the version relies on `git describe <https://git-scm.com/docs/git-describe>`_, so you will see an additional ``g`` prepended to the ``{revision hash}``. @@ -290,7 +299,7 @@ Builtin mechanisms for obtaining version numbers --------------------------------------------------- +------------------------------------------------ 1. the SCM itself (git/hg) 2. ``.hg_archival`` files (mercurial archives) @@ -435,11 +444,31 @@ its used as the primary source for the version number in which case it will be a unparsed string + +:SETUPTOOLS_SCM_PRETEND_VERSION_FOR_${UPPERCASED_DIST_NAME}: + when defined and not empty, + its used as the primary source for the version number + in which case it will be a unparsed string + + it takes precedence over ``SETUPTOOLS_SCM_PRETEND_VERSION`` + + :SETUPTOOLS_SCM_DEBUG: when defined and not empty, a lot of debug information will be printed as part of ``setuptools_scm`` operating +:SOURCE_DATE_EPOCH: + when defined, used as the timestamp from which the + ``node-and-date`` and ``node-and-timestamp`` local parts are + derived, otherwise the current time is used + (https://reproducible-builds.org/docs/source-date-epoch/) + + +:SETUPTOOLS_SCM_IGNORE_VCS_ROOTS: + when defined, a ``os.pathsep`` separated list + of directory names to ignore for root finding + Extending setuptools_scm ------------------------ @@ -480,6 +509,8 @@ :guess-next-dev: Automatically guesses the next development version (default). Guesses the upcoming release by incrementing the pre-release segment if present, otherwise by incrementing the micro segment. Then appends :code:`.devN`. + In case the tag ends with ``.dev0`` the version is not bumped + and custom ``.devN`` versions will trigger a error. :post-release: generates post release versions (adds :code:`.postN`) :python-simplified-semver: Basic semantic versioning. Guesses the upcoming release by incrementing the minor segment and setting the micro segment to zero if the @@ -491,6 +522,7 @@ that matches the most recent tag up to the minor segment. Otherwise if on a non-release branch, increments the minor segment and sets the micro segment to zero, then appends :code:`.devN`. + :no-guess-dev: Does no next version guessing, just adds :code:`.post1.devN` ``setuptools_scm.local_scheme`` Configures how the local part of a version is rendered given a @@ -540,7 +572,7 @@ Note on testing non-installed versions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While the general advice is to test against a installed version, some environments require a test prior to install, @@ -577,9 +609,9 @@ Everyone interacting in the ``setuptools_scm`` project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct`_. +`PSF Code of Conduct`_. -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md Security Contact ================
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/pyproject.toml -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/pyproject.toml
Changed
@@ -1,3 +1,3 @@ build-system -requires = "setuptools>=34.4", "wheel" +requires = "setuptools>=45", "wheel" build-backend = "setuptools.build_meta"
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/setup.cfg -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/setup.cfg
Changed
@@ -1,42 +1,37 @@ metadata -license_file = LICENSE -license = MIT name = setuptools_scm +description = the blessed package to manage your versions by scm tags +long_description = file: README.rst +long_description_content_type = text/x-rst url = https://github.com/pypa/setuptools_scm/ author = Ronny Pfannschmidt author_email = opensource@ronnypfannschmidt.de -description = the blessed package to manage your versions by scm tags -long_description = file:README.rst +license = MIT +license_file = LICENSE classifiers = Development Status :: 5 - Production/Stable Intended Audience :: Developers License :: OSI Approved :: MIT License Programming Language :: Python - Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 - Programming Language :: Python :: 3.5 + Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 Topic :: Software Development :: Libraries Topic :: Software Development :: Version Control Topic :: System :: Software Distribution Topic :: Utilities options -zip_safe = true -python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -install_requires = - setuptools packages = find: +install_requires = + setuptools>=45 +python_requires = >=3.6 package_dir = =src - -options.packages.find -where = src - -options.extras_require -toml = toml +zip_safe = true options.entry_points distutils.setup_keywords = @@ -45,6 +40,14 @@ setuptools_scm = setuptools_scm.integration:find_files setuptools.finalize_distribution_options = setuptools_scm = setuptools_scm.integration:infer_version +setuptools_scm.files_command = + .hg = setuptools_scm.file_finder_hg:hg_find_files + .git = setuptools_scm.file_finder_git:git_find_files +setuptools_scm.local_scheme = + node-and-date = setuptools_scm.version:get_local_node_and_date + node-and-timestamp = setuptools_scm.version:get_local_node_and_timestamp + dirty-tag = setuptools_scm.version:get_local_dirty_tag + no-local-version = setuptools_scm.version:get_no_local_node setuptools_scm.parse_scm = .hg = setuptools_scm.hg:parse .git = setuptools_scm.git:parse @@ -53,22 +56,20 @@ PKG-INFO = setuptools_scm.hacks:parse_pkginfo pip-egg-info = setuptools_scm.hacks:parse_pip_egg_info setup.py = setuptools_scm.hacks:fallback_version -setuptools_scm.files_command = - .hg = setuptools_scm.file_finder_hg:hg_find_files - .git = setuptools_scm.file_finder_git:git_find_files setuptools_scm.version_scheme = guess-next-dev = setuptools_scm.version:guess_next_dev_version post-release = setuptools_scm.version:postrelease_version python-simplified-semver = setuptools_scm.version:simplified_semver_version release-branch-semver = setuptools_scm.version:release_branch_semver_version -setuptools_scm.local_scheme = - node-and-date = setuptools_scm.version:get_local_node_and_date - node-and-timestamp = setuptools_scm.version:get_local_node_and_timestamp - dirty-tag = setuptools_scm.version:get_local_dirty_tag - no-local-version = setuptools_scm.version:get_no_local_node + no-guess-dev = setuptools_scm.version:no_guess_dev_version + calver-by-date = setuptools_scm.version:calver_by_date -bdist_wheel -universal = 1 +options.extras_require +toml = + toml + +options.packages.find +where = src egg_info tag_build =
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/setup.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/setup.py
Changed
@@ -9,7 +9,6 @@ pip usage is recommended """ -from __future__ import print_function import os import sys import setuptools @@ -34,7 +33,7 @@ def parse(root): try: return parse_pkginfo(root) - except IOError: + except OSError: return parse_git(root) config = dict(
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm.egg-info/PKG-INFO -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm.egg-info/PKG-INFO
Changed
@@ -1,13 +1,13 @@ Metadata-Version: 2.1 Name: setuptools-scm -Version: 4.1.2 +Version: 6.0.0 Summary: the blessed package to manage your versions by scm tags Home-page: https://github.com/pypa/setuptools_scm/ Author: Ronny Pfannschmidt Author-email: opensource@ronnypfannschmidt.de License: MIT Description: setuptools_scm - =============== + ============== ``setuptools_scm`` handles managing your Python package versions in SCM metadata instead of declaring them as the version argument @@ -17,8 +17,15 @@ (i.e. it automatically adds all of the SCM-managed files to the sdist). Unwanted files must be excluded by discarding them via ``MANIFEST.in``. - .. image:: https://travis-ci.org/pypa/setuptools_scm.svg?branch=master - :target: https://travis-ci.org/pypa/setuptools_scm + ``setuptools_scm`` support the following scm out of the box: + + * git + * mercurial + + + + .. image:: https://github.com/pypa/setuptools_scm/workflows/python%20tests+artifacts+release/badge.svg + :target: https://github.com/pypa/setuptools_scm/actions .. image:: https://tidelift.com/badges/package/pypi/setuptools-scm :target: https://tidelift.com/subscription/pkg/pypi-setuptools-scm?utm_source=pypi-setuptools-scm&utm_medium=readme @@ -195,7 +202,7 @@ If you have opted not to hardcode the version number inside the package, you can retrieve it at runtime from PEP-0566_ metadata using - ``importlib.metadata`` from the standard library + ``importlib.metadata`` from the standard library (added in Python 3.8) or the `importlib_metadata`_ backport: .. code:: python @@ -203,10 +210,10 @@ from importlib.metadata import version, PackageNotFoundError try: - __version__ = version(__name__) + __version__ = version("package-name") except PackageNotFoundError: # package is not installed - pass + pass Alternatively, you can use ``pkg_resources`` which is included in ``setuptools``: @@ -216,12 +223,13 @@ from pkg_resources import get_distribution, DistributionNotFound try: - __version__ = get_distribution(__name__).version + __version__ = get_distribution("package-name").version except DistributionNotFound: # package is not installed pass - This does place a runtime dependency on ``setuptools``. + However, this does place a runtime dependency on ``setuptools`` and can add up to + a few 100ms overhead for the package import time. .. _PEP-0566: https://www.python.org/dev/peps/pep-0566/ .. _importlib_metadata: https://pypi.org/project/importlib-metadata/ @@ -246,7 +254,7 @@ prevents using needless volatile data there. Notable Plugins - ---------------- + --------------- `setuptools_scm_git_archive <https://pypi.python.org/pypi/setuptools_scm_git_archive>`_ Provides partial support for obtaining versions from git archives that @@ -256,7 +264,7 @@ Default versioning scheme - -------------------------- + ------------------------- In the standard configuration ``setuptools_scm`` takes a look at three things: @@ -278,6 +286,7 @@ The next version is calculated by adding ``1`` to the last numeric component of the tag. + For Git projects, the version relies on `git describe <https://git-scm.com/docs/git-describe>`_, so you will see an additional ``g`` prepended to the ``{revision hash}``. @@ -298,7 +307,7 @@ Builtin mechanisms for obtaining version numbers - -------------------------------------------------- + ------------------------------------------------ 1. the SCM itself (git/hg) 2. ``.hg_archival`` files (mercurial archives) @@ -443,11 +452,31 @@ its used as the primary source for the version number in which case it will be a unparsed string + + :SETUPTOOLS_SCM_PRETEND_VERSION_FOR_${UPPERCASED_DIST_NAME}: + when defined and not empty, + its used as the primary source for the version number + in which case it will be a unparsed string + + it takes precedence over ``SETUPTOOLS_SCM_PRETEND_VERSION`` + + :SETUPTOOLS_SCM_DEBUG: when defined and not empty, a lot of debug information will be printed as part of ``setuptools_scm`` operating + :SOURCE_DATE_EPOCH: + when defined, used as the timestamp from which the + ``node-and-date`` and ``node-and-timestamp`` local parts are + derived, otherwise the current time is used + (https://reproducible-builds.org/docs/source-date-epoch/) + + + :SETUPTOOLS_SCM_IGNORE_VCS_ROOTS: + when defined, a ``os.pathsep`` separated list + of directory names to ignore for root finding + Extending setuptools_scm ------------------------ @@ -488,6 +517,8 @@ :guess-next-dev: Automatically guesses the next development version (default). Guesses the upcoming release by incrementing the pre-release segment if present, otherwise by incrementing the micro segment. Then appends :code:`.devN`. + In case the tag ends with ``.dev0`` the version is not bumped + and custom ``.devN`` versions will trigger a error. :post-release: generates post release versions (adds :code:`.postN`) :python-simplified-semver: Basic semantic versioning. Guesses the upcoming release by incrementing the minor segment and setting the micro segment to zero if the @@ -499,6 +530,7 @@ that matches the most recent tag up to the minor segment. Otherwise if on a non-release branch, increments the minor segment and sets the micro segment to zero, then appends :code:`.devN`. + :no-guess-dev: Does no next version guessing, just adds :code:`.post1.devN` ``setuptools_scm.local_scheme`` Configures how the local part of a version is rendered given a @@ -548,7 +580,7 @@ Note on testing non-installed versions - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While the general advice is to test against a installed version, some environments require a test prior to install, @@ -585,9 +617,9 @@ Everyone interacting in the ``setuptools_scm`` project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the - `PyPA Code of Conduct`_. + `PSF Code of Conduct`_. - .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md Security Contact ================ @@ -601,15 +633,16 @@ Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Version Control Classifier: Topic :: System :: Software Distribution Classifier: Topic :: Utilities -Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7 +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst Provides-Extra: toml
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm.egg-info/SOURCES.txt -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm.egg-info/SOURCES.txt
Changed
@@ -23,7 +23,6 @@ src/setuptools_scm/integration.py src/setuptools_scm/utils.py src/setuptools_scm/version.py -src/setuptools_scm/win_py31_compat.py src/setuptools_scm.egg-info/PKG-INFO src/setuptools_scm.egg-info/SOURCES.txt src/setuptools_scm.egg-info/dependency_links.txt
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm.egg-info/entry_points.txt -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm.egg-info/entry_points.txt
Changed
@@ -28,7 +28,9 @@ setup.py = setuptools_scm.hacks:fallback_version setuptools_scm.version_scheme +calver-by-date = setuptools_scm.version:calver_by_date guess-next-dev = setuptools_scm.version:guess_next_dev_version +no-guess-dev = setuptools_scm.version:no_guess_dev_version post-release = setuptools_scm.version:postrelease_version python-simplified-semver = setuptools_scm.version:simplified_semver_version release-branch-semver = setuptools_scm.version:release_branch_semver_version
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm.egg-info/requires.txt -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm.egg-info/requires.txt
Changed
@@ -1,4 +1,4 @@ -setuptools +setuptools>=45 toml toml
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/__init__.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/__init__.py
Changed
@@ -11,11 +11,12 @@ DEFAULT_LOCAL_SCHEME, DEFAULT_TAG_REGEX, ) -from .utils import function_has_arg, string_types +from .utils import function_has_arg, trace from .version import format_version, meta from .discover import iter_matching_entrypoints PRETEND_KEY = "SETUPTOOLS_SCM_PRETEND_VERSION" +PRETEND_KEY_NAMED = PRETEND_KEY + "_FOR_{name}" TEMPLATES = { ".py": """\ @@ -23,6 +24,7 @@ # file generated by setuptools_scm # don't change, don't track in version control version = {version!r} +version_tuple = {version_tuple!r} """, ".txt": "{version}", } @@ -67,7 +69,7 @@ def dump_version(root, version, write_to, template=None): - assert isinstance(version, string_types) + assert isinstance(version, str) if not write_to: return target = os.path.normpath(os.path.join(root, write_to)) @@ -80,12 +82,34 @@ os.path.splitext(target)1, target ) ) + + # version_tuple: each field is converted to an int if possible or kept as string + fields = tuple(version.split(".")) + version_fields = + for field in fields: + try: + v = int(field) + except ValueError: + v = field + version_fields.append(v) + with open(target, "w") as fp: - fp.write(template.format(version=version)) + fp.write(template.format(version=version, version_tuple=tuple(version_fields))) def _do_parse(config): - pretended = os.environ.get(PRETEND_KEY) + + trace("dist name:", config.dist_name) + if config.dist_name is not None: + pretended = os.environ.get( + PRETEND_KEY_NAMED.format(name=config.dist_name.upper()) + ) + else: + pretended = None + + if pretended is None: + pretended = os.environ.get(PRETEND_KEY) + if pretended: # we use meta here since the pretended version # must adhere to the pep to begin with @@ -93,7 +117,7 @@ if config.parse: parse_result = _call_entrypoint_fn(config.absolute_root, config, config.parse) - if isinstance(parse_result, string_types): + if isinstance(parse_result, str): raise TypeError( "version parse result was a string\nplease return a parsed version" ) @@ -132,6 +156,7 @@ fallback_root=".", parse=None, git_describe_command=None, + dist_name=None, ): """ If supplied, relative_to should be a file from which root may
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/__main__.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/__main__.py
Changed
@@ -1,12 +1,9 @@ -from __future__ import print_function import sys from setuptools_scm import get_version from setuptools_scm.integration import find_files -from setuptools_scm.version import _warn_if_setuptools_outdated def main(): - _warn_if_setuptools_outdated() print("Guessed Version", get_version()) if "ls" in sys.argv: for fname in find_files("."):
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/config.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/config.py
Changed
@@ -1,5 +1,4 @@ """ configuration """ -from __future__ import print_function, unicode_literals import os import re import warnings @@ -27,17 +26,28 @@ def _check_absolute_root(root, relative_to): + trace("l", repr(locals())) if relative_to: if os.path.isabs(root) and not root.startswith(relative_to): warnings.warn( "absolute root path '%s' overrides relative_to '%s'" % (root, relative_to) ) - root = os.path.join(os.path.dirname(relative_to), root) + if os.path.isdir(relative_to): + warnings.warn( + "relative_to is expected to be a file," + " its the directory %r\n" + "assuming the parent directory was passed" % (relative_to,) + ) + trace("dir", relative_to) + root = os.path.join(relative_to, root) + else: + trace("file", relative_to) + root = os.path.join(os.path.dirname(relative_to), root) return os.path.abspath(root) -class Configuration(object): +class Configuration: """ Global configuration model """ def __init__( @@ -54,6 +64,7 @@ fallback_root=".", parse=None, git_describe_command=None, + dist_name=None, ): # TODO: self._relative_to = relative_to @@ -70,6 +81,7 @@ self.parse = parse self.tag_regex = tag_regex self.git_describe_command = git_describe_command + self.dist_name = dist_name @property def fallback_root(self): @@ -92,6 +104,7 @@ self._absolute_root = _check_absolute_root(self._root, value) self._relative_to = value trace("root", repr(self._absolute_root)) + trace("relative_to", repr(value)) @property def root(self): @@ -102,6 +115,7 @@ self._absolute_root = _check_absolute_root(value, self._relative_to) self._root = value trace("root", repr(self._absolute_root)) + trace("relative_to", repr(self._relative_to)) @property def tag_regex(self): @@ -112,7 +126,7 @@ self._tag_regex = _check_tag_regex(value) @classmethod - def from_file(cls, name="pyproject.toml"): + def from_file(cls, name="pyproject.toml", dist_name=None): """ Read Configuration from pyproject.toml (or similar). Raises exceptions when file is not found or toml is @@ -122,4 +136,4 @@ with open(name) as strm: defn = __import__("toml").load(strm) section = defn.get("tool", {})"setuptools_scm" - return cls(**section) + return cls(dist_name=dist_name, **section)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/file_finder.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/file_finder.py
Changed
@@ -1,4 +1,5 @@ import os +from .utils import trace def scm_find_files(path, scm_files, scm_dirs): @@ -53,3 +54,16 @@ res.append(os.path.join(path, os.path.relpath(fullfilename, realpath))) seen.add(realdirpath) return res + + +def is_toplevel_acceptable(toplevel): + "" + if toplevel is None: + return False + + ignored = os.environ.get("SETUPTOOLS_SCM_IGNORE_VCS_ROOTS", "").split(os.pathsep) + ignored = os.path.normcase(p) for p in ignored + + trace(toplevel, ignored) + + return toplevel not in ignored
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/file_finder_git.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/file_finder_git.py
Changed
@@ -3,6 +3,7 @@ import tarfile import logging from .file_finder import scm_find_files +from .file_finder import is_toplevel_acceptable from .utils import trace log = logging.getLogger(__name__) @@ -10,13 +11,27 @@ def _git_toplevel(path): try: + cwd = os.path.abspath(path or ".") with open(os.devnull, "wb") as devnull: out = subprocess.check_output( - "git", "rev-parse", "--show-toplevel", - cwd=(path or "."), + "git", "rev-parse", "--show-prefix", + cwd=cwd, universal_newlines=True, stderr=devnull, ) + out = out.strip():-1 # remove the trailing pathsep + if not out: + out = cwd + else: + # Here, ``out`` is a relative path to root of git. + # ``cwd`` is absolute path to current working directory. + # the below method removes the length of ``out`` from + # ``cwd``, which gives the git toplevel + assert cwd.replace("\\", "/").endswith(out) + # In windows cwd contains ``\`` which should be replaced by ``/`` + # for this assertion to work. Length of string isn't changed by replace + # ``\\`` is just and escape for `\` + out = cwd: -len(out) trace("find files toplevel", out) return os.path.normcase(os.path.realpath(out.strip())) except subprocess.CalledProcessError: @@ -60,7 +75,7 @@ def git_find_files(path=""): toplevel = _git_toplevel(path) - if not toplevel: + if not is_toplevel_acceptable(toplevel): return fullpath = os.path.abspath(os.path.normpath(path)) if not fullpath.startswith(toplevel):
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/file_finder_hg.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/file_finder_hg.py
Changed
@@ -2,6 +2,7 @@ import subprocess from .file_finder import scm_find_files +from .file_finder import is_toplevel_acceptable def _hg_toplevel(path): @@ -41,7 +42,7 @@ def hg_find_files(path=""): toplevel = _hg_toplevel(path) - if not toplevel: + if not is_toplevel_acceptable(toplevel): return hg_files, hg_dirs = _hg_ls_files_and_dirs(toplevel) return scm_find_files(path, hg_files, hg_dirs)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/git.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/git.py
Changed
@@ -1,21 +1,19 @@ from .config import Configuration -from .utils import do_ex, trace, has_command +from .utils import do_ex, trace, require_command from .version import meta - +from datetime import datetime, date +import os from os.path import isfile, join import warnings -try: - from os.path import samefile -except ImportError: - from .win_py31_compat import samefile +from os.path import samefile -DEFAULT_DESCRIBE = "git describe --dirty --tags --long --match *.*" +DEFAULT_DESCRIBE = "git describe --dirty --tags --long --match *0-9*" -class GitWorkdir(object): +class GitWorkdir: """experimental, may change at any time""" def __init__(self, path): @@ -26,9 +24,19 @@ @classmethod def from_potential_worktree(cls, wd): - real_wd, _, ret = do_ex("git rev-parse --show-toplevel", wd) + wd = os.path.abspath(wd) + real_wd, _, ret = do_ex("git rev-parse --show-prefix", wd) + real_wd = real_wd:-1 # remove the trailing pathsep if ret: return + if not real_wd: + real_wd = wd + else: + assert wd.replace("\\", "/").endswith(real_wd) + # In windows wd contains ``\`` which should be replaced by ``/`` + # for this assertion to work. Length of string isn't changed by replace + # ``\\`` is just and escape for `\` + real_wd = wd: -len(real_wd) trace("real root", real_wd) if not samefile(real_wd, wd): return @@ -46,6 +54,15 @@ return return branch + def get_head_date(self): + timestamp, err, ret = self.do_ex("git log -n 1 HEAD --format=%cI") + if ret: + trace("branch err", timestamp, err, ret) + return + # TODO, when dropping python3.6 use fromiso + date_part = timestamp.split("T")0 + return datetime.strptime(date_part, r"%Y-%m-%d").date() + def is_shallow(self): return isfile(join(self.path, ".git/shallow")) @@ -65,7 +82,7 @@ def warn_on_shallow(wd): """experimental, may change at any time""" if wd.is_shallow(): - warnings.warn('"{}" is shallow and may cause errors'.format(wd.path)) + warnings.warn(f'"{wd.path}" is shallow and may cause errors') def fetch_on_shallow(wd): @@ -92,8 +109,7 @@ if not config: config = Configuration(root=root) - if not has_command("git"): - return + require_command("git") wd = GitWorkdir.from_potential_worktree(config.absolute_root) if wd is None: @@ -105,13 +121,27 @@ describe_command = config.git_describe_command out, unused_err, ret = wd.do_ex(describe_command) + node_date = wd.get_head_date() or date.today() + if ret: # If 'git git_describe_command' failed, try to get the information otherwise. + branch, branch_err, branch_ret = wd.do_ex("git symbolic-ref --short HEAD") + + if branch_ret: + branch = None + rev_node = wd.node() dirty = wd.is_dirty() if rev_node is None: - return meta("0.0", distance=0, dirty=dirty, config=config) + return meta( + "0.0", + distance=0, + node_date=node_date, + dirty=dirty, + branch=branch, + config=config, + ) return meta( "0.0", @@ -119,6 +149,7 @@ node="g" + rev_node, dirty=dirty, branch=wd.get_branch(), + node_date=node_date, config=config, ) else: @@ -133,9 +164,17 @@ node=node, dirty=dirty, branch=branch, + node_date=node_date, ) else: - return meta(tag, config=config, node=node, dirty=dirty, branch=branch) + return meta( + tag, + config=config, + node=node, + node_date=node_date, + dirty=dirty, + branch=branch, + ) def _git_parse_describe(describe_output):
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/hg.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/hg.py
Changed
@@ -1,6 +1,6 @@ import os from .config import Configuration -from .utils import do, trace, data_from_mime, has_command +from .utils import do, trace, data_from_mime, require_command from .version import meta, tags_to_versions @@ -36,8 +36,7 @@ if not config: config = Configuration(root=root) - if not has_command("hg"): - return + require_command("hg") identity_data = do("hg id -i -b -t", config.absolute_root).split() if not identity_data: return @@ -84,7 +83,7 @@ def get_graph_distance(root, rev1, rev2="."): - cmd = "hg", "log", "-q", "-r", "{}::{}".format(rev1, rev2) + cmd = "hg", "log", "-q", "-r", f"{rev1}::{rev2}" out = do(cmd, root) return len(out.strip().splitlines()) - 1
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/integration.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/integration.py
Changed
@@ -1,19 +1,26 @@ from pkg_resources import iter_entry_points -from .version import _warn_if_setuptools_outdated -from .utils import do, trace_exception +from .utils import do, trace_exception, trace from . import _get_version, Configuration def version_keyword(dist, keyword, value): - _warn_if_setuptools_outdated() if not value: return if value is True: value = {} if getattr(value, "__call__", None): value = value() - config = Configuration(**value) + assert ( + "dist_name" not in value + ), "dist_name may not be specified in the setup keyword " + + trace( + "version keyword", + vars(dist.metadata), + ) + dist_name = dist.metadata.name + config = Configuration(dist_name=dist_name, **value) dist.metadata.version = _get_version(config) @@ -32,7 +39,7 @@ def _args_from_toml(name="pyproject.toml"): # todo: more sensible config initialization - # move this elper back to config and unify it with the code from get_config + # move this helper back to config and unify it with the code from get_config with open(name) as strm: defn = __import__("toml").load(strm) @@ -40,9 +47,13 @@ def infer_version(dist): - + trace( + "finalize hook", + vars(dist.metadata), + ) + dist_name = dist.metadata.name try: - config = Configuration.from_file() + config = Configuration.from_file(dist_name=dist_name) except Exception: return trace_exception() dist.metadata.version = _get_version(config)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/utils.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/utils.py
Changed
@@ -1,24 +1,18 @@ """ utils """ -from __future__ import print_function, unicode_literals import inspect import warnings import sys import shlex import subprocess import os -import io import platform import traceback -import datetime DEBUG = bool(os.environ.get("SETUPTOOLS_SCM_DEBUG")) IS_WINDOWS = platform.system() == "Windows" -PY2 = sys.version_info < (3,) -PY3 = sys.version_info > (3,) -string_types = (str,) if PY3 else (str, unicode) # noqa def no_git_env(env): @@ -64,7 +58,7 @@ On Windows and Python 2, environment dictionaries must be strings and not unicode. """ - if IS_WINDOWS or PY2: + if IS_WINDOWS: env_dict.update((key, str(value)) for (key, value) in env_dict.items()) return env_dict @@ -112,7 +106,7 @@ def data_from_mime(path): - with io.open(path, encoding="utf-8") as fp: + with open(path, encoding="utf-8") as fp: content = fp.read() trace("content", repr(content)) # the complex conditions come from reading pseudo-mime-messages @@ -121,35 +115,15 @@ return data -class UTC(datetime.tzinfo): - _ZERO = datetime.timedelta(0) - - def utcoffset(self, dt): - return self._ZERO - - def tzname(self, dt): - return "UTC" - - def dst(self, dt): - return self._ZERO - - -utc = UTC() - - def function_has_arg(fn, argname): assert inspect.isfunction(fn) - if PY2: - argspec = inspect.getargspec(fn).args - else: - - argspec = inspect.signature(fn).parameters + argspec = inspect.signature(fn).parameters return argname in argspec -def has_command(name): +def has_command(name, warn=True): try: p = _popen_pipes(name, "help", ".") except OSError: @@ -158,6 +132,11 @@ else: p.communicate() res = not p.returncode - if not res: - warnings.warn("%r was not found" % name) + if not res and warn: + warnings.warn("%r was not found" % name, category=RuntimeWarning) return res + + +def require_command(name): + if not has_command(name, warn=False): + raise OSError("%r was not found" % name)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/src/setuptools_scm/version.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/src/setuptools_scm/version.py
Changed
@@ -1,14 +1,21 @@ -from __future__ import print_function import datetime import warnings import re +import time +import os from .config import Configuration -from .utils import trace, string_types, utc +from .utils import trace -from pkg_resources import iter_entry_points +try: + from packaging.version import Version +except ImportError: + import pkg_resources + + Version = pkg_resources.packaging.version.Version -from pkg_resources import parse_version as pkg_parse_version + +from pkg_resources import iter_entry_points SEMVER_MINOR = 2 SEMVER_PATCH = 3 @@ -16,7 +23,7 @@ def _parse_version_tag(tag, config): - tagstring = tag if not isinstance(tag, string_types) else str(tag) + tagstring = tag if not isinstance(tag, str) else str(tag) match = config.tag_regex.match(tagstring) result = None @@ -32,34 +39,10 @@ "suffix": match.group(0)match.end(key) :, } - trace("tag '{}' parsed to {}".format(tag, result)) + trace(f"tag '{tag}' parsed to {result}") return result -def _get_version_class(): - modern_version = pkg_parse_version("1.0") - if isinstance(modern_version, tuple): - return None - else: - return type(modern_version) - - -VERSION_CLASS = _get_version_class() - - -class SetuptoolsOutdatedWarning(Warning): - pass - - -# append so integrators can disable the warning -warnings.simplefilter("error", SetuptoolsOutdatedWarning, append=True) - - -def _warn_if_setuptools_outdated(): - if VERSION_CLASS is None: - warnings.warn("your setuptools is too old (<12)", SetuptoolsOutdatedWarning) - - def callable_or_entrypoint(group, callable_or_name): trace("ep", (group, callable_or_name)) @@ -83,7 +66,7 @@ tagdict = _parse_version_tag(tag, config) if not isinstance(tagdict, dict) or not tagdict.get("version", None): - warnings.warn("tag {!r} no version found".format(tag)) + warnings.warn(f"tag {tag!r} no version found") return None version = tagdict"version" @@ -96,9 +79,8 @@ ) ) - if VERSION_CLASS is not None: - version = pkg_parse_version(version) - trace("version", repr(version)) + version = Version(version) + trace("version", repr(version)) return version @@ -117,7 +99,7 @@ return result -class ScmVersion(object): +class ScmVersion: def __init__( self, tag_version, @@ -127,7 +109,8 @@ preformatted=False, branch=None, config=None, - **kw + node_date=None, + **kw, ): if kw: trace("unknown args", kw) @@ -136,7 +119,10 @@ distance = 0 self.distance = distance self.node = node - self.time = datetime.datetime.now(utc) + self.node_date = node_date + self.time = datetime.datetime.utcfromtimestamp( + int(os.environ.get("SOURCE_DATE_EPOCH", time.time())) + ) self._extra = kw self.dirty = dirty self.preformatted = preformatted @@ -169,7 +155,8 @@ node=self.node, dirty=self.dirty, branch=self.branch, - **kw + node_date=self.node_date, + **kw, ) def format_choice(self, clean_format, dirty_format, **kw): @@ -183,7 +170,7 @@ def _parse_tag(tag, preformatted, config): if preformatted: return tag - if VERSION_CLASS is None or not isinstance(tag, VERSION_CLASS): + if not isinstance(tag, Version): tag = tag_to_version(tag, config) return tag @@ -196,7 +183,7 @@ preformatted=False, branch=None, config=None, - **kw + **kw, ): if not config: warnings.warn( @@ -205,7 +192,7 @@ ) parsed_version = _parse_tag(tag, preformatted, config) trace("version", tag, "->", parsed_version) - assert parsed_version is not None, "cant parse version %s" % tag + assert parsed_version is not None, "Can't parse version %s" % tag return ScmVersion( parsed_version, distance, node, dirty, preformatted, branch, config, **kw ) @@ -226,13 +213,26 @@ return prefix, tail = version.rsplit(".dev", 1) - assert tail == "0", "own dev numbers are unsupported" + if tail != "0": + raise ValueError( + "choosing custom numbers for the `.devX` distance " + "is not supported.\n " + "The {version} can't be bumped\n" + "Please drop the tag or create a new supported one".format(version=version) + ) return prefix def _bump_regex(version): - prefix, tail = re.match(r"(.*?)(\d+)$", version).groups() - return "%s%d" % (prefix, int(tail) + 1) + match = re.match(r"(.*?)(\d+)$", version) + if match is None: + raise ValueError( + "{version} does not end with a number to bump, " + "please correct or use a custom version scheme".format(version=version) + ) + else: + prefix, tail = match.groups() + return "%s%d" % (prefix, int(tail) + 1) def guess_next_dev_version(version): @@ -243,7 +243,10 @@ def guess_next_simple_semver(version, retain, increment=True): - parts = int(i) for i in str(version).split("."):retain + try: + parts = int(i) for i in str(version).split("."):retain + except ValueError: + raise ValueError(f"{version} can't be parsed as numeric version") while len(parts) < retain:
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/conftest.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/conftest.py
Changed
@@ -1,8 +1,9 @@ import os import itertools import pytest -import six +# 2009-02-13T23:31:30+00:00 +os.environ"SOURCE_DATE_EPOCH" = "1234567890" os.environ"SETUPTOOLS_SCM_DEBUG" = "1" VERSION_PKGS = "setuptools", "setuptools_scm" @@ -14,16 +15,16 @@ for pkg in VERSION_PKGS: version = pkg_resources.get_distribution(pkg).version path = __import__(pkg).__file__ - res.append("{} version {} from {!r}".format(pkg, version, path)) + res.append(f"{pkg} version {version} from {path!r}") return res -class Wd(object): +class Wd: commit_command = None add_command = None def __repr__(self): - return "<WD {cwd}>".format(cwd=self.cwd) + return f"<WD {self.cwd}>" def __init__(self, cwd): self.cwd = cwd @@ -40,10 +41,10 @@ filename = self.cwd / name if kw: value = value.format(**kw) - if isinstance(value, six.text_type): - filename.write_text(value) - else: + if isinstance(value, bytes): filename.write_bytes(value) + else: + filename.write_text(value) return filename def _reason(self, given_reason): @@ -80,7 +81,7 @@ return self.get_version() -@pytest.yield_fixture(autouse=True) +@pytest.fixture(autouse=True) def debug_mode(): from setuptools_scm import utils
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_basic_api.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_basic_api.py
Changed
@@ -90,10 +90,14 @@ assert setuptools_scm.get_version() == version -def test_root_relative_to(monkeypatch, tmpdir): - assert_root(monkeypatch, tmpdir.join("alt").strpath) - __file__ = tmpdir.join("module/file.py").strpath - setuptools_scm.get_version(root="../alt", relative_to=__file__) +def test_root_relative_to(monkeypatch, tmp_path): + assert_root(monkeypatch, str(tmp_path / "alt")) + module = tmp_path / "module/file.py" + module.parent.mkdir() + module.touch() + setuptools_scm.get_version(root="../alt", relative_to=str(module)) + with pytest.warns(UserWarning, match="relative_to is expected to be a file.*"): + setuptools_scm.get_version(root="../alt", relative_to=str(module.parent)) def test_dump_version(tmpdir): @@ -101,9 +105,13 @@ dump_version(sp, "1.0", "first.txt") assert tmpdir.join("first.txt").read() == "1.0" - dump_version(sp, "1.0", "first.py") + + dump_version(sp, "1.0.dev42", "first.py") content = tmpdir.join("first.py").read() - assert repr("1.0") in content + lines = content.splitlines() + assert "version = '1.0.dev42'" in lines + assert "version_tuple = (1, 0, 'dev42')" in lines + import ast ast.parse(content)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_config.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_config.py
Changed
@@ -1,5 +1,3 @@ -from __future__ import unicode_literals - from setuptools_scm.config import Configuration import re import pytest
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_file_finder.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_file_finder.py
Changed
@@ -9,8 +9,6 @@ @pytest.fixture(params="git", "hg") def inwd(request, wd, monkeypatch): if request.param == "git": - if sys.platform == "win32" and sys.version_info0 < 3: - pytest.skip("Long/short path names supported on Windows Python 2.7") try: wd("git init") except OSError: @@ -126,6 +124,12 @@ assert set(find_files("adir")) == _sep({"adir/filea"}) +@pytest.mark.parametrize("path_add", "{cwd}", "{cwd}" + os.pathsep + "broken") +def test_ignore_root(inwd, monkeypatch, path_add): + monkeypatch.setenv("SETUPTOOLS_SCM_IGNORE_VCS_ROOTS", path_add.format(cwd=inwd.cwd)) + assert find_files() == + + def test_empty_root(inwd): subdir = inwd.cwd / "cdir" / "subdir" subdir.mkdir(parents=True)
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_functions.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_functions.py
Changed
@@ -1,5 +1,4 @@ import pytest -import sys import pkg_resources from setuptools_scm import dump_version, get_version, PRETEND_KEY from setuptools_scm.version import ( @@ -12,13 +11,6 @@ from setuptools_scm.config import Configuration from setuptools_scm.utils import has_command -PY3 = sys.version_info > (2,) - - -class MockTime(object): - def __format__(self, *k): - return "time" - @pytest.mark.parametrize( "tag, expected", @@ -51,21 +43,20 @@ ("exact", "guess-next-dev node-and-date", "1.1"), ("zerodistance", "guess-next-dev node-and-date", "1.2.dev0"), ("zerodistance", "guess-next-dev no-local-version", "1.2.dev0"), - ("dirty", "guess-next-dev node-and-date", "1.2.dev0+dtime"), + ("dirty", "guess-next-dev node-and-date", "1.2.dev0+d20090213"), ("dirty", "guess-next-dev no-local-version", "1.2.dev0"), ("distance", "guess-next-dev node-and-date", "1.2.dev3"), - ("distancedirty", "guess-next-dev node-and-date", "1.2.dev3+dtime"), + ("distancedirty", "guess-next-dev node-and-date", "1.2.dev3+d20090213"), ("distancedirty", "guess-next-dev no-local-version", "1.2.dev3"), ("exact", "post-release node-and-date", "1.1"), ("zerodistance", "post-release node-and-date", "1.1.post0"), - ("dirty", "post-release node-and-date", "1.1.post0+dtime"), + ("dirty", "post-release node-and-date", "1.1.post0+d20090213"), ("distance", "post-release node-and-date", "1.1.post3"), - ("distancedirty", "post-release node-and-date", "1.1.post3+dtime"), + ("distancedirty", "post-release node-and-date", "1.1.post3+d20090213"), , ) -def test_format_version(version, monkeypatch, scheme, expected): +def test_format_version(version, scheme, expected): version = VERSIONSversion - monkeypatch.setattr(version, "time", MockTime()) vs, ls = scheme.split() assert format_version(version, version_scheme=vs, local_scheme=ls) == expected
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_git.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_git.py
Changed
@@ -1,5 +1,5 @@ import sys - +import os from setuptools_scm import integration from setuptools_scm.utils import do, has_command from setuptools_scm import git @@ -7,21 +7,14 @@ from datetime import datetime from os.path import join as opj from setuptools_scm.file_finder_git import git_find_files -import warnings +from datetime import date -skip_if_win_27 = pytest.mark.skipif( - sys.platform == "win32" and sys.version_info0 < 3, - reason="Not supported on Windows + Python 2.7", +pytestmark = pytest.mark.skipif( + not has_command("git", warn=False), reason="git executable not found" ) -with warnings.catch_warnings(): - warnings.filterwarnings("ignore") - if not has_command("git"): - pytestmark = pytest.mark.skip(reason="git executable not found") - - @pytest.fixture def wd(wd, monkeypatch): monkeypatch.delenv("HOME", raising=False) @@ -50,7 +43,7 @@ p = wd.cwd.joinpath("sub/package") p.mkdir(parents=True) p.joinpath("setup.py").write_text( - u"""from setuptools import setup + """from setuptools import setup setup(use_scm_version={"root": "../..", "relative_to": __file__}) """ @@ -59,6 +52,12 @@ assert res == "0.1.dev0" +def test_git_gone(wd, monkeypatch): + monkeypatch.setenv("PATH", str(wd.cwd / "not-existing")) + with pytest.raises(EnvironmentError, match="'git' was not found"): + git.parse(str(wd.cwd), git.DEFAULT_DESCRIBE) + + @pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/298") @pytest.mark.issue(403) def test_file_finder_no_history(wd, caplog): @@ -76,6 +75,8 @@ def test_version_from_git(wd): assert wd.version == "0.1.dev0" + assert git.parse(str(wd.cwd), git.DEFAULT_DESCRIBE).branch == "master" + wd.commit_testfile() assert wd.version.startswith("0.1.dev1+g") assert not wd.version.endswith("1-") @@ -121,15 +122,21 @@ @pytest.mark.issue(86) -def test_git_dirty_notag(wd): +@pytest.mark.parametrize("today", False, True) +def test_git_dirty_notag(today, wd, monkeypatch): + if today: + monkeypatch.delenv("SOURCE_DATE_EPOCH", raising=False) wd.commit_testfile() wd.write("test.txt", "test2") wd("git add test.txt") assert wd.version.startswith("0.1.dev1") - # the date on the tag is in UTC - today = datetime.utcnow().date() + if today: + # the date on the tag is in UTC + tag = datetime.utcnow().date().strftime(".d%Y%m%d") + else: + tag = ".d20090213" # we are dirty, check for the tag - assert today.strftime(".d%Y%m%d") in wd.version + assert tag in wd.version @pytest.mark.issue(193) @@ -192,7 +199,6 @@ assert wd.version.startswith("0.1.dev1+g") -@skip_if_win_27 def test_git_archive_export_ignore(wd, monkeypatch): wd.write("test1.txt", "test") wd.write("test2.txt", "test") @@ -208,7 +214,6 @@ assert integration.find_files(".") == opj(".", "test1.txt") -@skip_if_win_27 @pytest.mark.issue(228) def test_git_archive_subdirectory(wd, monkeypatch): wd("mkdir foobar") @@ -219,7 +224,6 @@ assert integration.find_files(".") == opj(".", "foobar", "test1.txt") -@skip_if_win_27 @pytest.mark.issue(251) def test_git_archive_run_from_subdirectory(wd, monkeypatch): wd("mkdir foobar") @@ -262,12 +266,44 @@ assert wd.get_version().startswith("2") +def test_non_dotted_version_with_updated_regex(wd): + wd.commit_testfile() + wd("git tag apache-arrow-1") + wd.commit_testfile() + assert wd.get_version(tag_regex=r"^apache-arrow-(\.0-9+)$").startswith("2") + + +def test_non_dotted_tag_no_version_match(wd): + wd.commit_testfile() + wd("git tag apache-arrow-0.11.1") + wd.commit_testfile() + wd("git tag apache-arrow") + wd.commit_testfile() + assert wd.get_version().startswith("0.11.2.dev2") + + @pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/381") def test_gitdir(monkeypatch, wd): - """ - """ + """""" wd.commit_testfile() normal = wd.version # git hooks set this and break subsequent setuptools_scm unless we clean monkeypatch.setenv("GIT_DIR", __file__) assert wd.version == normal + + +def test_git_getdate(wd): + # TODO: case coverage for git wd parse + today = date.today() + + def parse_date(): + return git.parse(os.fspath(wd.cwd)).node_date + + git_wd = git.GitWorkdir(os.fspath(wd.cwd)) + assert git_wd.get_head_date() is None + assert parse_date() == today + + wd.commit_testfile() + assert git_wd.get_head_date() == today + meta = git.parse(os.fspath(wd.cwd)) + assert meta.node_date == today
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_integration.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_integration.py
Changed
@@ -3,15 +3,12 @@ import pytest from setuptools_scm.utils import do +from setuptools_scm import PRETEND_KEY, PRETEND_KEY_NAMED @pytest.fixture def wd(wd): - try: - wd("git init") - except OSError: - pytest.skip("git executable not found") - + wd("git init") wd("git config user.email test@example.com") wd('git config user.name "a test"') wd.add_command = "git add ." @@ -34,9 +31,40 @@ def test_pyproject_support_with_git(tmpdir, monkeypatch, wd): - monkeypatch.delenv("SETUPTOOLS_SCM_DEBUG") + pytest.importorskip("toml") pkg = tmpdir.join("wd") pkg.join("pyproject.toml").write("""tool.setuptools_scm""") - pkg.join("setup.py").write("__import__('setuptools').setup()") + pkg.join("setup.py").write( + "__import__('setuptools').setup(name='setuptools_scm_example')" + ) res = do((sys.executable, "setup.py", "--version"), pkg) - assert res == "0.1.dev0" + assert res.endswith("0.1.dev0") + + +def test_pretend_version(tmpdir, monkeypatch, wd): + monkeypatch.setenv(PRETEND_KEY, "1.0.0") + + assert wd.get_version() == "1.0.0" + assert wd.get_version(dist_name="ignored") == "1.0.0" + + +def test_pretend_version_named_pyproject_integration(tmpdir, monkeypatch, wd): + test_pyproject_support_with_git(tmpdir, monkeypatch, wd) + monkeypatch.setenv( + PRETEND_KEY_NAMED.format(name="setuptools_scm_example".upper()), "3.2.1" + ) + res = do((sys.executable, "setup.py", "--version"), tmpdir / "wd") + assert res.endswith("3.2.1") + + +def test_pretend_version_named(tmpdir, monkeypatch, wd): + monkeypatch.setenv(PRETEND_KEY_NAMED.format(name="test".upper()), "1.0.0") + monkeypatch.setenv(PRETEND_KEY_NAMED.format(name="test2".upper()), "2.0.0") + assert wd.get_version(dist_name="test") == "1.0.0" + assert wd.get_version(dist_name="test2") == "2.0.0" + + +def test_pretend_version_name_takes_precedence(tmpdir, monkeypatch, wd): + monkeypatch.setenv(PRETEND_KEY_NAMED.format(name="test".upper()), "1.0.0") + monkeypatch.setenv(PRETEND_KEY, "2.0.0") + assert wd.get_version(dist_name="test") == "1.0.0"
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_mercurial.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_mercurial.py
Changed
@@ -4,13 +4,11 @@ from setuptools_scm.config import Configuration from setuptools_scm.utils import has_command import pytest -import warnings -with warnings.catch_warnings(): - warnings.filterwarnings("ignore") - if not has_command("hg"): - pytestmark = pytest.mark.skip(reason="hg executable not found") +pytestmark = pytest.mark.skipif( + not has_command("hg", warn=False), reason="hg executable not found" +) @pytest.fixture @@ -46,6 +44,12 @@ ) +def test_hg_gone(wd, monkeypatch): + monkeypatch.setenv("PATH", str(wd.cwd / "not-existing")) + with pytest.raises(EnvironmentError, match="'hg' was not found"): + parse(str(wd.cwd)) + + def test_find_files_stop_at_root_hg(wd, monkeypatch): wd.commit_testfile() project = wd.cwd / "project" @@ -152,8 +156,7 @@ @pytest.mark.usefixtures("version_1_0") def test_version_bump_from_commit_including_hgtag_mods(wd): - """ Test the case where a commit includes changes to .hgtags and other files - """ + """Test the case where a commit includes changes to .hgtags and other files""" with wd.cwd.joinpath(".hgtags").open("ab") as tagfile: tagfile.write(b"0 0\n") wd.write("branchfile", "branchtext") @@ -166,7 +169,7 @@ @pytest.mark.issue(229) @pytest.mark.usefixtures("version_1_0") def test_latest_tag_detection(wd): - """ Tests that tags not containing a "." are ignored, the same as for git. + """Tests that tags not containing a "." are ignored, the same as for git. Note that will be superceded by the fix for pypa/setuptools_scm/issues/235 """ wd('hg tag some-random-tag -u test -d "0 0"')
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_setuptools_support.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_setuptools_support.py
Changed
@@ -6,16 +6,6 @@ import subprocess import pytest -pytestmark = - pytest.mark.skipif( - "sys.version_info >= (3,6,0)", - reason="integration with old versions no longer needed on py3.6+", - ), - pytest.mark.xfail( - sys.platform == "win32", reason="path behaves unexpected on windows ci" - ), - - @pytest.fixture(scope="session") def get_setuptools_packagedir(request): @@ -56,7 +46,7 @@ old_pythonpath = os.environ.get("PYTHONPATH") if old_pythonpath: - pythonpath = "{}:{}".format(old_pythonpath, packagedir) + pythonpath = f"{old_pythonpath}:{packagedir}" else: pythonpath = str(packagedir) subprocess.check_call( @@ -65,19 +55,6 @@ ) -def test_old_setuptools_fails(get_setuptools_packagedir): - packagedir = get_setuptools_packagedir("0.9.8") - with pytest.raises(subprocess.CalledProcessError): - check(packagedir, "0.9.8") - - -def test_old_setuptools_allows_with_warnings(get_setuptools_packagedir): - - packagedir = get_setuptools_packagedir("0.9.8") - # filter using warning since in the early python startup - check(packagedir, "0.9.8", PYTHONWARNINGS="once::Warning") - - def test_distlib_setuptools_works(get_setuptools_packagedir): - packagedir = get_setuptools_packagedir("12.0.1") - check(packagedir, "12.0.1") + packagedir = get_setuptools_packagedir("45.0.0") + check(packagedir, "45.0.0")
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/testing/test_version.py -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/testing/test_version.py
Changed
@@ -1,3 +1,5 @@ +from datetime import date, timedelta + import pytest from setuptools_scm.config import Configuration from setuptools_scm.version import ( @@ -5,6 +7,10 @@ simplified_semver_version, release_branch_semver_version, tags_to_versions, + no_guess_dev_version, + guess_next_version, + format_version, + calver_by_date, ) @@ -48,6 +54,15 @@ assert computed == expected_next +def test_next_semver_bad_tag(): + + version = meta("1.0.0-foo", preformatted=True, config=c) + with pytest.raises( + ValueError, match="1.0.0-foo can't be parsed as numeric version" + ): + simplified_semver_version(version) + + @pytest.mark.parametrize( "version, expected_next", @@ -85,6 +100,47 @@ @pytest.mark.parametrize( + "version, expected_next", + + pytest.param( + meta("1.0.0", distance=2, branch="default", config=c), + "1.0.0.post1.dev2", + id="dev_distance", + ), + pytest.param( + meta("1.0", distance=2, branch="default", config=c), + "1.0.post1.dev2", + id="dev_distance_short_tag", + ), + pytest.param( + meta("1.0.0", distance=None, branch="default", config=c), + "1.0.0", + id="no_dev_distance", + ), + , +) +def test_no_guess_version(version, expected_next): + computed = no_guess_dev_version(version) + assert computed == expected_next + + +def test_bump_dev_version_zero(): + guess_next_version("1.0.dev0") + + +def test_bump_dev_version_nonzero_raises(): + with pytest.raises(ValueError) as excinfo: + guess_next_version("1.0.dev1") + + assert str(excinfo.value) == ( + "choosing custom numbers for the `.devX` distance " + "is not supported.\n " + "The 1.0.dev1 can't be bumped\n" + "Please drop the tag or create a new supported one" + ) + + +@pytest.mark.parametrize( "tag, expected", pytest.param("v1.0.0", "1.0.0"), @@ -93,19 +149,132 @@ , ) def test_tag_regex1(tag, expected): - config = Configuration() if "+" in tag: # pytest bug wrt cardinality with pytest.warns(UserWarning): - result = meta(tag, config=config) + result = meta(tag, config=c) else: - result = meta(tag, config=config) + result = meta(tag, config=c) assert result.tag.public == expected @pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/286") def test_tags_to_versions(): - config = Configuration() - versions = tags_to_versions("1.0", "2.0", "3.0", config=config) + versions = tags_to_versions("1.0", "2.0", "3.0", config=c) assert isinstance(versions, list) # enable subscription + + +@pytest.mark.issue("https://github.com/pypa/setuptools_scm/issues/471") +def test_version_bump_bad(): + with pytest.raises( + ValueError, + match=".*does not end with a number to bump, " + "please correct or use a custom version scheme", + ): + + guess_next_version(tag_version="2.0.0-alpha.5-PMC") + + +def test_format_version_schemes(): + version = meta("1.0", config=c) + format_version( + version, + local_scheme="no-local-version", + version_scheme=lambda v: None, "guess-next-dev", + ) + + +def date_to_str(date_=None, days_offset=0, fmt="{dt:%y}.{dt.month}.{dt.day}"): + date_ = date_ or date.today() + date_ = date_ - timedelta(days=days_offset) + return fmt.format(dt=date_) + + +@pytest.mark.parametrize( + "version, expected_next", + + pytest.param( + meta(date_to_str(days_offset=3), config=c), + date_to_str(days_offset=3), + id="exact", + ), + pytest.param( + meta(date_to_str() + ".1", config=c), date_to_str() + ".1", id="exact patch" + ), + pytest.param( + meta(date_to_str(fmt="20.01.02"), config=c), + "20.1.2", + id="leading 0s", + ), + pytest.param( + meta(date_to_str(days_offset=3), config=c, dirty=True), + date_to_str() + ".0.dev0", + id="dirty other day", + ), + pytest.param( + meta(date_to_str(), config=c, distance=2, branch="default"), + date_to_str() + ".1.dev2", + id="normal branch", + ), + pytest.param( + meta(date_to_str(fmt="{dt:%Y}.{dt.month}.{dt.day}"), config=c), + date_to_str(fmt="{dt:%Y}.{dt.month}.{dt.day}"), + id="4 digits year", + ), + pytest.param( + meta(date_to_str(), config=c, distance=2, branch="release-2021.05.06"), + "2021.05.06", + id="release branch", + ), + pytest.param( + meta(date_to_str() + ".2", config=c, distance=2, branch="release-21.5.1"), + "21.5.1", + id="release branch short", + ), + pytest.param( + meta( + date_to_str(days_offset=3) + ".2", + config=c, + node_date=date.today() - timedelta(days=2), + ), + date_to_str(days_offset=3) + ".2", + id="node date clean", + ), + pytest.param( + meta( + date_to_str(days_offset=2) + ".2", + config=c, + distance=2, + node_date=date.today() - timedelta(days=2), + ), + date_to_str(date.today() - timedelta(days=2)) + ".3.dev2", + id="node date distance", + ), + , +) +def test_calver_by_date(version, expected_next): + computed = calver_by_date(version) + assert computed == expected_next + + +@pytest.mark.parametrize(
View file
_service:tar_scm:setuptools_scm-4.1.2.tar.gz/tox.ini -> _service:tar_scm:setuptools_scm-6.0.0.tar.gz/tox.ini
Changed
@@ -1,11 +1,13 @@ tox -envlist=py{27,34,35,36,37,38}-test,flake8,check_readme,py{27,37}-selfcheck +envlist=py{27,34,35,36,37,38,39}-test,flake8,check_readme,check-dist,py{27,37}-selfcheck,docs pytest testpaths=testing filterwarnings=error markers= issue(id): reference to github issue +# disable unraisable until investigated +addopts = -p no:unraisableexception flake8 max-complexity = 10 @@ -18,7 +20,7 @@ .venv, .pytest_cache, __pycache__, - ./setuptools_scm/win_py31_compat.py + ./src/setuptools_scm/win_py31_compat.py testenv usedevelop=True @@ -28,6 +30,7 @@ deps= pytest setuptools >= 42 + toml commands= test: pytest selfcheck: python setup.py --version @@ -40,27 +43,28 @@ flake8 mccabe commands = - flake8 src/setuptools_scm/ testing/ setup.py --exclude=setuptools_scm/win_py31_compat.py + flake8 src/setuptools_scm/ testing/ setup.py --exclude=src/setuptools_scm/win_py31_compat.py testenv:check_readme skip_install=True setenv = SETUPTOOLS_SCM_PRETEND_VERSION=2.0 deps= - readme check-manifest + docutils + pygments commands= - python setup.py check -r rst2html.py README.rst {envlogdir}/README.html --strict check-manifest -testenv:upload +testenv:check_dist deps= wheel twine commands= - python setup.py clean --all rotate -k - -m .whl,.tar.gz,.zip + python setup.py clean --all rotate -k 0 -m .whl,.tar.gz,.zip python setup.py -q egg_info - python setup.py -q sdist --formats zip bdist_wheel register + python setup.py -q sdist --formats zip bdist_wheel + twine check dist/*
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2