Projects
openEuler:Mainline
python-setuptools_scm
Sign Up
Log In
Username
Password
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, - share_mode, - security_attributes, - creation_disposition, - flags_and_attributes, - template_file, - ) - - if handle == INVALID_HANDLE_VALUE: - raise WindowsError() - - info = BY_HANDLE_FILE_INFORMATION() - res = GetFileInformationByHandle(handle, info) - handle_nonzero_success(res) - - return info
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: parts.append(0) if increment: @@ -296,6 +299,78 @@ return release_branch_semver_version(version) +def no_guess_dev_version(version): + if version.exact: + return version.format_with("{tag}") + else: + return version.format_with("{tag}.post1.dev{distance}") + + +def date_ver_match(ver): + match = re.match( + ( + r"^(?P<date>(?P<year>\d{2}|\d{4})(?:\.\d{1,2}){2})" + r"(?:\.(?P<patch>\d*)){0,1}?$" + ), + str(ver), + ) + return match + + +def guess_next_date_ver(version, node_date=None, date_fmt=None): + """ + same-day -> patch +1 + other-day -> today + + distance is always added as .devX + """ + match = date_ver_match(version) + if match is None: + raise ValueError( + "{version} does not correspond to a valid versioning date, " + "please correct or use a custom version scheme".format(version=version) + ) + # deduct date format if not provided + if date_fmt is None: + date_fmt = "%Y.%m.%d" if len(match.group("year")) == 4 else "%y.%m.%d" + head_date = node_date or datetime.date.today() + # compute patch + tag_date = datetime.datetime.strptime(match.group("date"), date_fmt).date() + if tag_date == head_date: + patch = match.group("patch") or "0" + patch = int(patch) + 1 + else: + if tag_date > head_date: + # warn on future times + warnings.warn( + "your previous tag ({}) is ahead your node date ({})".format( + tag_date, head_date + ) + ) + patch = 0 + next_version = "{node_date:{date_fmt}}.{patch}".format( + node_date=head_date, date_fmt=date_fmt, patch=patch + ) + # rely on the Version object to ensure consistency (e.g. remove leading 0s) + # TODO: support for intentionally non-normalized date versions + next_version = str(Version(next_version)) + return next_version + + +def calver_by_date(version): + if version.exact and not version.dirty: + return version.format_with("{tag}") + # TODO: move the release-X check to a new scheme + if version.branch is not None and version.branch.startswith("release-"): + branch_ver = _parse_version_tag(version.branch.split("-")-1, version.config) + if branch_ver is not None: + ver = branch_ver"version" + match = date_ver_match(ver) + if match: + return ver + return version.format_next_version(guess_next_date_ver, node_date=version.node_date) + + def _format_local_with_time(version, time_format): if version.exact or version.node is None: @@ -331,19 +406,47 @@ return version.format_with("{tag}.post{distance}") +def _get_ep(group, name): + for ep in iter_entry_points(group, name): + trace("ep found:", ep.name) + return ep.load() + + +def _iter_version_schemes(entrypoint, scheme_value, _memo=None): + if _memo is None: + _memo = set() + if isinstance(scheme_value, str): + scheme_value = _get_ep(entrypoint, scheme_value) + + if isinstance(scheme_value, (list, tuple)): + for variant in scheme_value: + if variant not in _memo: + _memo.add(variant) + yield from _iter_version_schemes(entrypoint, variant, _memo=_memo) + elif callable(scheme_value): + yield scheme_value + + +def _call_version_scheme(version, entypoint, given_value, default): + for scheme in _iter_version_schemes(entypoint, given_value): + result = scheme(version) + if result is not None: + return result + return default + + def format_version(version, **config): trace("scm version", version) trace("config", config) if version.preformatted: return version.tag - version_scheme = callable_or_entrypoint( - "setuptools_scm.version_scheme", config"version_scheme" - ) - local_scheme = callable_or_entrypoint( - "setuptools_scm.local_scheme", config"local_scheme" + main_version = _call_version_scheme( + version, "setuptools_scm.version_scheme", config"version_scheme", None ) - main_version = version_scheme(version) trace("version", main_version) - local_version = local_scheme(version) + assert main_version is not None + local_version = _call_version_scheme( + version, "setuptools_scm.local_scheme", config"local_scheme", "+unknown" + ) trace("local_version", local_version) - return version_scheme(version) + local_scheme(version) + return main_version + local_version
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( + "version, expected_next", + + pytest.param(meta("1.0.0", config=c), "1.0.0", id="SemVer exact"), + pytest.param( + meta("1.0.0", config=c, dirty=True), + "1.0.0", + id="SemVer dirty", + marks=pytest.mark.xfail, + ), + , +) +def test_calver_by_date_semver(version, expected_next): + computed = calver_by_date(version) + assert computed == expected_next + + +def test_calver_by_date_future_warning(): + with pytest.warns(UserWarning, match="your previous tag*"): + calver_by_date(meta(date_to_str(days_offset=-2), config=c, distance=2))
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