diff -Nru python-bids-validator-1.8.2/bids_validator/__init__.py python-bids-validator-1.9.2/bids_validator/__init__.py --- python-bids-validator-1.8.2/bids_validator/__init__.py 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator/__init__.py 2022-02-16 17:34:02.000000000 +0000 @@ -1,6 +1,6 @@ """BIDS validator common Python package.""" -from ._version import get_versions from .bids_validator import BIDSValidator -__version__ = get_versions()['version'] __all__ = ['BIDSValidator'] -del get_versions + +from . import _version +__version__ = _version.get_versions()['version'] diff -Nru python-bids-validator-1.8.2/bids_validator/rules/file_level_rules.json python-bids-validator-1.9.2/bids_validator/rules/file_level_rules.json --- python-bids-validator-1.8.2/bids_validator/rules/file_level_rules.json 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator/rules/file_level_rules.json 2022-02-16 17:34:02.000000000 +0000 @@ -394,6 +394,7 @@ "Other", "Pixels", "ACPC", + "ScanRAS", "ICBM452AirSpace", "ICBM452Warp5Space", "IXI549Space", @@ -522,5 +523,70 @@ "tokens": { "@@@_pet_ext_@@@": ["blood\\.tsv\\.gz", "blood\\.tsv", "blood\\.json"] } + }, + + "microscopy": { + "regexp": "^[\\/\\\\](sub-[a-zA-Z0-9]+)[\\/\\\\](?:(ses-[a-zA-Z0-9]+)[\\/\\\\])?micr[\\/\\\\](sub-[a-zA-Z0-9]+)(?:(_ses-[a-zA-Z0-9]+))?(?:_sample-[a-zA-Z0-9]+)(?:_acq-[a-zA-Z0-9]+)?(?:_stain-[a-zA-Z0-9]+)?(?:_run-[0-9]+)?(?:_chunk-[0-9]+)?((@@@_microscopy_type_@@@)(@@@_microscopy_ext_@@@))$", + "tokens": { + "@@@_microscopy_type_@@@": [ + "_TEM", + "_SEM", + "_uCT", + "_BF", + "_DF", + "_PC", + "_DIC", + "_FLUO", + "_CONF", + "_PLI", + "_CARS", + "_2PE", + "_MPE", + "_SR", + "_NLO", + "_OCT", + "_SPIM" + ], + "@@@_microscopy_ext_@@@": [ + ".ome\\.tif", + ".ome\\.btf", + ".tif", + ".png" + ] + } + }, + "microscopy_photo": { + "regexp": "^[\\/\\\\](sub-[a-zA-Z0-9]+)[\\/\\\\](?:(ses-[a-zA-Z0-9]+)[\\/\\\\])?micr[\\/\\\\](sub-[a-zA-Z0-9]+)(?:(_ses-[a-zA-Z0-9]+))?(?:_sample-[a-zA-Z0-9]+)(?:_acq-[a-zA-Z0-9]+)?(@@@_photo_ext_@@@)$", + "tokens":{ + "@@@_photo_ext_@@@": [ + "_photo\\.jpg", + "_photo\\.png", + "_photo\\.tif" + ] + } + }, + "microscopy_json": { + "regexp": "^[\\/\\\\](sub-[a-zA-Z0-9]+)[\\/\\\\](?:(ses-[a-zA-Z0-9]+)[\\/\\\\])?micr[\\/\\\\](sub-[a-zA-Z0-9]+)(?:(_ses-[a-zA-Z0-9]+))?(?:_sample-[a-zA-Z0-9]+)?(?:_acq-[a-zA-Z0-9]+)?(?:_stain-[a-zA-Z0-9]+)?(?:_run-[0-9]+)?(?:_chunk-[0-9]+)?(@@@_microscopy_type_@@@)\\.json$", + "tokens": { + "@@@_microscopy_type_@@@": [ + "_TEM", + "_SEM", + "_uCT", + "_BF", + "_DF", + "_PC", + "_DIC", + "_FLUO", + "_CONF", + "_PLI", + "_CARS", + "_2PE", + "_MPE", + "_SR", + "_NLO", + "_OCT", + "_SPIM" + ] + } } } diff -Nru python-bids-validator-1.8.2/bids_validator/rules/session_level_rules.json python-bids-validator-1.9.2/bids_validator/rules/session_level_rules.json --- python-bids-validator-1.8.2/bids_validator/rules/session_level_rules.json 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator/rules/session_level_rules.json 2022-02-16 17:34:02.000000000 +0000 @@ -162,6 +162,7 @@ "Other", "Pixels", "ACPC", + "ScanRAS", "ICBM452AirSpace", "ICBM452Warp5Space", "IXI549Space", @@ -200,5 +201,30 @@ "UNCInfant2V23" ] } + }, + + "microscopy_ses": { + "regexp": "^[\\/\\\\](sub-[a-zA-Z0-9]+)[\\/\\\\](?:(ses-[a-zA-Z0-9]+)[\\/\\\\])?\\1(_\\2)?(?:_sample-[a-zA-Z0-9]+)?(?:_acq-[a-zA-Z0-9]+)?(?:_stain-[a-zA-Z0-9]+)?(?:_run-[0-9]+_)?(?:_chunk-[0-9]+)?(@@@_microscopy_ses_type_@@@)$", + "tokens": { + "@@@_microscopy_ses_type_@@@": [ + "_TEM.json", + "_SEM.json", + "_uCT.json", + "_BF.json", + "_DF.json", + "_PC.json", + "_DIC.json", + "_FLUO.json", + "_CONF.json", + "_PLI.json", + "_CARS.json", + "_2PE.json", + "_MPE.json", + "_SR.json", + "_NLO.json", + "_OCT.json", + "_SPIM.json" + ] + } } } diff -Nru python-bids-validator-1.8.2/bids_validator/rules/top_level_rules.json python-bids-validator-1.9.2/bids_validator/rules/top_level_rules.json --- python-bids-validator-1.8.2/bids_validator/rules/top_level_rules.json 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator/rules/top_level_rules.json 2022-02-16 17:34:02.000000000 +0000 @@ -15,7 +15,9 @@ "phase2.json", "fieldmap.json", "events.json", - "scans.json" + "scans.json", + "samples.json", + "samples.tsv" ] } }, @@ -133,5 +135,30 @@ "tokens": { "@@@_other_top_files_ext_@@@": ["physio\\.json", "stim\\.json"] } + }, + + "microscopy_top": { + "regexp": "^[\\/\\\\](?:ses-[a-zA-Z0-9]+_)?(?:_sample-[a-zA-Z0-9]+)?(?:_acq-[a-zA-Z0-9]+)?(?:_stain-[a-zA-Z0-9]+)?(?:_run-[0-9]+)?(?:_chunk-[0-9]+)?(?:@@@_microscopy_top_ext_@@@)$", + "tokens": { + "@@@_microscopy_top_ext_@@@": [ + "_TEM\\.json", + "_SEM\\.json", + "_uCT\\.json", + "_BF\\.json", + "_DF\\.json", + "_PC\\.json", + "_DIC\\.json", + "_FLUO\\.json", + "_CONF\\.json", + "_PLI\\.json", + "_CARS\\.json", + "_2PE\\.json", + "_MPE\\.json", + "_SR\\.json", + "_NLO\\.json", + "_OCT\\.json", + "_SPIM\\.json" + ] + } } } diff -Nru python-bids-validator-1.8.2/bids_validator/test_bids_validator.py python-bids-validator-1.9.2/bids_validator/test_bids_validator.py --- python-bids-validator-1.8.2/bids_validator/test_bids_validator.py 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator/test_bids_validator.py 2022-02-16 17:34:02.000000000 +0000 @@ -14,7 +14,9 @@ HOME = os.path.expanduser('~') TEST_DATA_DICT = { - 'eeg_matchingpennies': 'https://github.com/sappelhoff/eeg_matchingpennies' + 'eeg_matchingpennies': ( + 'https://gin.g-node.org/sappelhoff/eeg_matchingpennies' + ), } EXCLUDE_KEYWORDS = ['git', 'datalad', 'sourcedata', 'bidsignore'] diff -Nru python-bids-validator-1.8.2/bids_validator/_version.py python-bids-validator-1.9.2/bids_validator/_version.py --- python-bids-validator-1.8.2/bids_validator/_version.py 2021-08-17 21:46:12.714265800 +0000 +++ python-bids-validator-1.9.2/bids_validator/_version.py 2022-02-16 17:34:42.812397700 +0000 @@ -1,5 +1,5 @@ -# This file was generated by 'versioneer.py' (0.18) from +# This file was generated by 'versioneer.py' (0.20) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. @@ -8,11 +8,11 @@ version_json = ''' { - "date": "2021-08-17T16:40:40-0500", + "date": "2022-02-16T11:30:39-0600", "dirty": false, "error": null, - "full-revisionid": "0ec1a3c998ea1d170eab360907981b788eaa119b", - "version": "1.8.2" + "full-revisionid": "6a0e5845360eb1b013aee09bfd99c596877d26cd", + "version": "1.9.2" } ''' # END VERSION_JSON diff -Nru python-bids-validator-1.8.2/bids_validator.egg-info/PKG-INFO python-bids-validator-1.9.2/bids_validator.egg-info/PKG-INFO --- python-bids-validator-1.8.2/bids_validator.egg-info/PKG-INFO 2021-08-17 21:46:12.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator.egg-info/PKG-INFO 2022-02-16 17:34:42.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: bids-validator -Version: 1.8.2 +Version: 1.9.2 Summary: Validator for the Brain Imaging Data Structure Home-page: https://github.com/bids-standard/bids-validator Author: PyBIDS developers @@ -17,6 +17,7 @@ Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Description-Content-Type: text/markdown +License-File: LICENSE [![CircleCI](https://circleci.com/gh/bids-standard/bids-validator.svg?style=shield&circle-token=:circle-token)](https://circleci.com/gh/bids-standard/bids-validator) [![Gitlab pipeline status](https://img.shields.io/gitlab/pipeline/bids-standard/bids-validator?logo=GitLab)](https://gitlab.com/bids-standard/bids-validator/pipelines) @@ -56,7 +57,7 @@ couple of minutes please open [developer tools ](https://developer.chrome.com/devtools) and report the error at [https://github.com/bids-standard/bids-validator/issues](https://github.com/bids-standard/bids-validator/issues). 1. Command line version: - 1. Install [Node.js](https://nodejs.org) (at least version 10.11.0) + 1. Install [Node.js](https://nodejs.org) (at least version 12.12.0) 1. Update `npm` to be at least version 7 (`npm install --global npm@^7`) 1. From a terminal run `npm install -g bids-validator` 1. Run `bids-validator` to start validating datasets. @@ -93,9 +94,7 @@ ## Maintainers and Contributors - -[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-) - +[![All Contributors](https://img.shields.io/badge/all_contributors-43-orange.svg?style=flat-square)](#contributors-) This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. @@ -114,54 +113,57 @@
Adam Li

πŸ’» ⚠️ πŸ““ πŸ›
Adam Thomas

πŸ“–
Alexander Jones

πŸ’» ⚠️ πŸ€” +
Ben Beasley

πŸ“¦
Chris Gorgolewski

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Chris Holdgraf

πŸ’»
Chris Markiewicz

πŸ’» ⚠️ πŸ€” πŸ› πŸ’¬ πŸ”§ 🚧 -
David Nishikawa

πŸ’» ⚠️ +
David Nishikawa

πŸ’» ⚠️
Dimitri Papadopoulos Orfanos

πŸ’»
Duncan Macleod

πŸš‡
Franklin Feingold

πŸ“–
Gregory noack

πŸ’» ⚠️
Horea Christian

πŸ’»
Jakub Kaczmarzyk

πŸš‡ -
Joke Durnez

πŸ’» +
Joke Durnez

πŸ’»
Mainak Jas

πŸ’» ⚠️ πŸ€” πŸ‘€ πŸ““
Marco Castellaro

πŸ’» ⚠️
Max

πŸ’» πŸ›
Michael Hanke

πŸ“–
Mikael Naveau

πŸ’»
Nell Hardcastle

πŸ’» πŸ€” πŸš‡ πŸ’¬ πŸ‘€ -
Nicolas Traut

πŸ’» +
Nicolas Traut

πŸ’»
Parul Sethi

πŸ’» ⚠️
Patricia Clement

πŸ’»
Remi Gau

πŸ’» πŸ“– πŸ““
Richard HΓΆchenberger

πŸ’» πŸ““ ⚠️ πŸ›
Robert Oostenveld

πŸ’» πŸ€” πŸ› ⚠️
Rohan Goyal

πŸ’» -
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️ +
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️
Russ Poldrack

πŸ’» πŸ’΅ πŸ”
Soichi Hayashi

πŸ›
Stefan Appelhoff

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Suyash

πŸ’»
Taylor Salo

πŸ’»
Teal Hobson-Lowther

πŸ’» ⚠️ -
Travis Riddle

πŸ› +
Travis Riddle

πŸ›
VisLab

πŸ€” πŸ’»
Wazeer Zulfikar

πŸ“–
Yaroslav Halchenko

πŸ€” πŸ’» πŸ“– πŸ““
constellates

πŸ’» ⚠️
dewarrn1

πŸ’»
dkp

πŸ’» + +
goldmund

πŸ’» ⚠️ @@ -347,7 +349,7 @@ The BIDS Validator currently works in the browser with [browserify](http://browserify.org/) or [webpack](https://webpack.js.org/). You can add it to a project by cloning the validator and requiring it with browserify syntax -`var validate = require('bids-validator');` or an ES2015 webpack import +`const validate = require('bids-validator');` or an ES2015 webpack import `import validate from 'bids-validator'`. ### On the Server @@ -426,6 +428,10 @@ Please see the [CONTRIBUTING.md](../CONTRIBUTING.md) for additional details. +### Bundling + +bids-validator is bundled with esbuild. While developing, the script `bids-validator/bin/bids-validator` will automatically bundle the project each time it is run. To test a build without publishing it `npm -w bids-validator run build`. This will generate a bids-validator/dist directory containing the local build and `bids-validator/bin/bids-validator` will use this build. To return to automatic bundling on each run, remove the dist directory. + ### Running Locally in a Browser A note about OS X, the dependencies for the browser require a npm package called @@ -455,6 +461,14 @@ To run the linter which checks code conventions run `npm run lint`. +### Install globally from a development branch + +Global installs are not recommended for development because of the possibility of package conflicts with other Node.js projects. If you do need to test with a global install from a development tree, follow these steps to generate the NPM package without publishing it and install the package locally. + +1. `npm -w bids-validator run build` +2. `npm -w bids-validator pack` +3. `npm install -g bids-validator-*.tgz` + ### Publishing Publishing is done with [Lerna](https://github.com/lerna/lerna). Use the command `npx lerna publish` and follow instructions to set a new version. diff -Nru python-bids-validator-1.8.2/bids_validator.egg-info/SOURCES.txt python-bids-validator-1.9.2/bids_validator.egg-info/SOURCES.txt --- python-bids-validator-1.8.2/bids_validator.egg-info/SOURCES.txt 2021-08-17 21:46:12.000000000 +0000 +++ python-bids-validator-1.9.2/bids_validator.egg-info/SOURCES.txt 2022-02-16 17:34:42.000000000 +0000 @@ -1,3 +1,4 @@ +LICENSE MANIFEST.in README.md setup.cfg diff -Nru python-bids-validator-1.8.2/debian/changelog python-bids-validator-1.9.2/debian/changelog --- python-bids-validator-1.8.2/debian/changelog 2021-08-25 13:57:32.000000000 +0000 +++ python-bids-validator-1.9.2/debian/changelog 2022-02-17 19:29:47.000000000 +0000 @@ -1,3 +1,11 @@ +python-bids-validator (1.9.2-1) unstable; urgency=medium + + * Team upload. + * d/watch: Do not report development versions, just real releases + * Standards-Version: 4.6.0 (routine-update) + + -- Andreas Tille Thu, 17 Feb 2022 20:29:47 +0100 + python-bids-validator (1.8.2-1) unstable; urgency=medium * New upstream version 1.8.2 diff -Nru python-bids-validator-1.8.2/debian/control python-bids-validator-1.9.2/debian/control --- python-bids-validator-1.8.2/debian/control 2021-07-16 17:01:07.000000000 +0000 +++ python-bids-validator-1.9.2/debian/control 2022-02-17 19:29:47.000000000 +0000 @@ -8,7 +8,7 @@ python3-setuptools, python3-all, debhelper-compat (= 13) -Standards-Version: 4.5.1 +Standards-Version: 4.6.0 Vcs-Browser: https://salsa.debian.org/med-team/python-bids-validator Vcs-Git: https://salsa.debian.org/med-team/python-bids-validator.git Homepage: https://github.com/bids-standard/bids-validator diff -Nru python-bids-validator-1.8.2/debian/watch python-bids-validator-1.9.2/debian/watch --- python-bids-validator-1.8.2/debian/watch 2021-07-16 16:35:08.000000000 +0000 +++ python-bids-validator-1.9.2/debian/watch 2022-02-17 19:29:47.000000000 +0000 @@ -1,4 +1,4 @@ # please also check http://pypi.debian.net/bids-validator/watch version=4 opts=uversionmangle=s/(rc|a|b|c)/~$1/,uversionmangle=s|\.dev|~dev| \ -https://pypi.debian.net/bids-validator/bids-validator-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) +https://pypi.debian.net/bids-validator/bids-validator-(\d[.\d]+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) diff -Nru python-bids-validator-1.8.2/LICENSE python-bids-validator-1.9.2/LICENSE --- python-bids-validator-1.8.2/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ python-bids-validator-1.9.2/LICENSE 2022-02-16 17:34:02.000000000 +0000 @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2015 The Board of Trustees of the Leland Stanford Junior University + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff -Nru python-bids-validator-1.8.2/MANIFEST.in python-bids-validator-1.9.2/MANIFEST.in --- python-bids-validator-1.8.2/MANIFEST.in 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/MANIFEST.in 2022-02-16 17:34:02.000000000 +0000 @@ -1,3 +1,3 @@ -include CODE_OF_CONDUCT.md LICENSE MANIFEST.in README.md +include LICENSE MANIFEST.in README.md include versioneer.py include bids_validator/_version.py diff -Nru python-bids-validator-1.8.2/PKG-INFO python-bids-validator-1.9.2/PKG-INFO --- python-bids-validator-1.8.2/PKG-INFO 2021-08-17 21:46:12.714265800 +0000 +++ python-bids-validator-1.9.2/PKG-INFO 2022-02-16 17:34:42.812397700 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: bids-validator -Version: 1.8.2 +Version: 1.9.2 Summary: Validator for the Brain Imaging Data Structure Home-page: https://github.com/bids-standard/bids-validator Author: PyBIDS developers @@ -17,6 +17,7 @@ Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Description-Content-Type: text/markdown +License-File: LICENSE [![CircleCI](https://circleci.com/gh/bids-standard/bids-validator.svg?style=shield&circle-token=:circle-token)](https://circleci.com/gh/bids-standard/bids-validator) [![Gitlab pipeline status](https://img.shields.io/gitlab/pipeline/bids-standard/bids-validator?logo=GitLab)](https://gitlab.com/bids-standard/bids-validator/pipelines) @@ -56,7 +57,7 @@ couple of minutes please open [developer tools ](https://developer.chrome.com/devtools) and report the error at [https://github.com/bids-standard/bids-validator/issues](https://github.com/bids-standard/bids-validator/issues). 1. Command line version: - 1. Install [Node.js](https://nodejs.org) (at least version 10.11.0) + 1. Install [Node.js](https://nodejs.org) (at least version 12.12.0) 1. Update `npm` to be at least version 7 (`npm install --global npm@^7`) 1. From a terminal run `npm install -g bids-validator` 1. Run `bids-validator` to start validating datasets. @@ -93,9 +94,7 @@ ## Maintainers and Contributors - -[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-) - +[![All Contributors](https://img.shields.io/badge/all_contributors-43-orange.svg?style=flat-square)](#contributors-) This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. @@ -114,54 +113,57 @@
Adam Li

πŸ’» ⚠️ πŸ““ πŸ›
Adam Thomas

πŸ“–
Alexander Jones

πŸ’» ⚠️ πŸ€” +
Ben Beasley

πŸ“¦
Chris Gorgolewski

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Chris Holdgraf

πŸ’»
Chris Markiewicz

πŸ’» ⚠️ πŸ€” πŸ› πŸ’¬ πŸ”§ 🚧 -
David Nishikawa

πŸ’» ⚠️ +
David Nishikawa

πŸ’» ⚠️
Dimitri Papadopoulos Orfanos

πŸ’»
Duncan Macleod

πŸš‡
Franklin Feingold

πŸ“–
Gregory noack

πŸ’» ⚠️
Horea Christian

πŸ’»
Jakub Kaczmarzyk

πŸš‡ -
Joke Durnez

πŸ’» +
Joke Durnez

πŸ’»
Mainak Jas

πŸ’» ⚠️ πŸ€” πŸ‘€ πŸ““
Marco Castellaro

πŸ’» ⚠️
Max

πŸ’» πŸ›
Michael Hanke

πŸ“–
Mikael Naveau

πŸ’»
Nell Hardcastle

πŸ’» πŸ€” πŸš‡ πŸ’¬ πŸ‘€ -
Nicolas Traut

πŸ’» +
Nicolas Traut

πŸ’»
Parul Sethi

πŸ’» ⚠️
Patricia Clement

πŸ’»
Remi Gau

πŸ’» πŸ“– πŸ““
Richard HΓΆchenberger

πŸ’» πŸ““ ⚠️ πŸ›
Robert Oostenveld

πŸ’» πŸ€” πŸ› ⚠️
Rohan Goyal

πŸ’» -
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️ +
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️
Russ Poldrack

πŸ’» πŸ’΅ πŸ”
Soichi Hayashi

πŸ›
Stefan Appelhoff

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Suyash

πŸ’»
Taylor Salo

πŸ’»
Teal Hobson-Lowther

πŸ’» ⚠️ -
Travis Riddle

πŸ› +
Travis Riddle

πŸ›
VisLab

πŸ€” πŸ’»
Wazeer Zulfikar

πŸ“–
Yaroslav Halchenko

πŸ€” πŸ’» πŸ“– πŸ““
constellates

πŸ’» ⚠️
dewarrn1

πŸ’»
dkp

πŸ’» + +
goldmund

πŸ’» ⚠️ @@ -347,7 +349,7 @@ The BIDS Validator currently works in the browser with [browserify](http://browserify.org/) or [webpack](https://webpack.js.org/). You can add it to a project by cloning the validator and requiring it with browserify syntax -`var validate = require('bids-validator');` or an ES2015 webpack import +`const validate = require('bids-validator');` or an ES2015 webpack import `import validate from 'bids-validator'`. ### On the Server @@ -426,6 +428,10 @@ Please see the [CONTRIBUTING.md](../CONTRIBUTING.md) for additional details. +### Bundling + +bids-validator is bundled with esbuild. While developing, the script `bids-validator/bin/bids-validator` will automatically bundle the project each time it is run. To test a build without publishing it `npm -w bids-validator run build`. This will generate a bids-validator/dist directory containing the local build and `bids-validator/bin/bids-validator` will use this build. To return to automatic bundling on each run, remove the dist directory. + ### Running Locally in a Browser A note about OS X, the dependencies for the browser require a npm package called @@ -455,6 +461,14 @@ To run the linter which checks code conventions run `npm run lint`. +### Install globally from a development branch + +Global installs are not recommended for development because of the possibility of package conflicts with other Node.js projects. If you do need to test with a global install from a development tree, follow these steps to generate the NPM package without publishing it and install the package locally. + +1. `npm -w bids-validator run build` +2. `npm -w bids-validator pack` +3. `npm install -g bids-validator-*.tgz` + ### Publishing Publishing is done with [Lerna](https://github.com/lerna/lerna). Use the command `npx lerna publish` and follow instructions to set a new version. diff -Nru python-bids-validator-1.8.2/README.md python-bids-validator-1.9.2/README.md --- python-bids-validator-1.8.2/README.md 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/README.md 2022-02-16 17:34:02.000000000 +0000 @@ -36,7 +36,7 @@ couple of minutes please open [developer tools ](https://developer.chrome.com/devtools) and report the error at [https://github.com/bids-standard/bids-validator/issues](https://github.com/bids-standard/bids-validator/issues). 1. Command line version: - 1. Install [Node.js](https://nodejs.org) (at least version 10.11.0) + 1. Install [Node.js](https://nodejs.org) (at least version 12.12.0) 1. Update `npm` to be at least version 7 (`npm install --global npm@^7`) 1. From a terminal run `npm install -g bids-validator` 1. Run `bids-validator` to start validating datasets. @@ -73,9 +73,7 @@ ## Maintainers and Contributors - -[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-) - +[![All Contributors](https://img.shields.io/badge/all_contributors-43-orange.svg?style=flat-square)](#contributors-) This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. @@ -94,54 +92,57 @@
Adam Li

πŸ’» ⚠️ πŸ““ πŸ›
Adam Thomas

πŸ“–
Alexander Jones

πŸ’» ⚠️ πŸ€” +
Ben Beasley

πŸ“¦
Chris Gorgolewski

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Chris Holdgraf

πŸ’»
Chris Markiewicz

πŸ’» ⚠️ πŸ€” πŸ› πŸ’¬ πŸ”§ 🚧 -
David Nishikawa

πŸ’» ⚠️ +
David Nishikawa

πŸ’» ⚠️
Dimitri Papadopoulos Orfanos

πŸ’»
Duncan Macleod

πŸš‡
Franklin Feingold

πŸ“–
Gregory noack

πŸ’» ⚠️
Horea Christian

πŸ’»
Jakub Kaczmarzyk

πŸš‡ -
Joke Durnez

πŸ’» +
Joke Durnez

πŸ’»
Mainak Jas

πŸ’» ⚠️ πŸ€” πŸ‘€ πŸ““
Marco Castellaro

πŸ’» ⚠️
Max

πŸ’» πŸ›
Michael Hanke

πŸ“–
Mikael Naveau

πŸ’»
Nell Hardcastle

πŸ’» πŸ€” πŸš‡ πŸ’¬ πŸ‘€ -
Nicolas Traut

πŸ’» +
Nicolas Traut

πŸ’»
Parul Sethi

πŸ’» ⚠️
Patricia Clement

πŸ’»
Remi Gau

πŸ’» πŸ“– πŸ““
Richard HΓΆchenberger

πŸ’» πŸ““ ⚠️ πŸ›
Robert Oostenveld

πŸ’» πŸ€” πŸ› ⚠️
Rohan Goyal

πŸ’» -
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️ +
Ross Blair

🚧 πŸ€” πŸ’» πŸ› πŸš‡ πŸ“† πŸ’¬ πŸ‘€ πŸ”§ ⚠️
Russ Poldrack

πŸ’» πŸ’΅ πŸ”
Soichi Hayashi

πŸ›
Stefan Appelhoff

πŸ› πŸ’» πŸ”£ πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ βœ… πŸ“’ πŸ““
Suyash

πŸ’»
Taylor Salo

πŸ’»
Teal Hobson-Lowther

πŸ’» ⚠️ -
Travis Riddle

πŸ› +
Travis Riddle

πŸ›
VisLab

πŸ€” πŸ’»
Wazeer Zulfikar

πŸ“–
Yaroslav Halchenko

πŸ€” πŸ’» πŸ“– πŸ““
constellates

πŸ’» ⚠️
dewarrn1

πŸ’»
dkp

πŸ’» + +
goldmund

πŸ’» ⚠️ @@ -327,7 +328,7 @@ The BIDS Validator currently works in the browser with [browserify](http://browserify.org/) or [webpack](https://webpack.js.org/). You can add it to a project by cloning the validator and requiring it with browserify syntax -`var validate = require('bids-validator');` or an ES2015 webpack import +`const validate = require('bids-validator');` or an ES2015 webpack import `import validate from 'bids-validator'`. ### On the Server @@ -406,6 +407,10 @@ Please see the [CONTRIBUTING.md](../CONTRIBUTING.md) for additional details. +### Bundling + +bids-validator is bundled with esbuild. While developing, the script `bids-validator/bin/bids-validator` will automatically bundle the project each time it is run. To test a build without publishing it `npm -w bids-validator run build`. This will generate a bids-validator/dist directory containing the local build and `bids-validator/bin/bids-validator` will use this build. To return to automatic bundling on each run, remove the dist directory. + ### Running Locally in a Browser A note about OS X, the dependencies for the browser require a npm package called @@ -435,6 +440,14 @@ To run the linter which checks code conventions run `npm run lint`. +### Install globally from a development branch + +Global installs are not recommended for development because of the possibility of package conflicts with other Node.js projects. If you do need to test with a global install from a development tree, follow these steps to generate the NPM package without publishing it and install the package locally. + +1. `npm -w bids-validator run build` +2. `npm -w bids-validator pack` +3. `npm install -g bids-validator-*.tgz` + ### Publishing Publishing is done with [Lerna](https://github.com/lerna/lerna). Use the command `npx lerna publish` and follow instructions to set a new version. diff -Nru python-bids-validator-1.8.2/setup.cfg python-bids-validator-1.9.2/setup.cfg --- python-bids-validator-1.8.2/setup.cfg 2021-08-17 21:46:12.714265800 +0000 +++ python-bids-validator-1.9.2/setup.cfg 2022-02-16 17:34:42.812397700 +0000 @@ -29,8 +29,18 @@ [bdist_wheel] universal = 1 +[tool:pytest] +ignore = + versioneer.py + _version.py + +[flake8] +exclude = + versioneer.py + _version.py + [versioneer] -vcs = git +VCS = git style = pep440 versionfile_source = bids_validator/_version.py versionfile_build = bids_validator/_version.py diff -Nru python-bids-validator-1.8.2/versioneer.py python-bids-validator-1.9.2/versioneer.py --- python-bids-validator-1.8.2/versioneer.py 2021-08-17 21:44:00.000000000 +0000 +++ python-bids-validator-1.9.2/versioneer.py 2022-02-16 17:34:02.000000000 +0000 @@ -1,5 +1,5 @@ -# Version: 0.18 +# Version: 0.20 """The Versioneer - like a rocketeer, but for versions. @@ -7,16 +7,12 @@ ============== * like a rocketeer, but for versions! -* https://github.com/warner/python-versioneer +* https://github.com/python-versioneer/python-versioneer * Brian Warner * License: Public Domain -* Compatible With: python2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, and pypy -* [![Latest Version] -(https://pypip.in/version/versioneer/badge.svg?style=flat) -](https://pypi.python.org/pypi/versioneer/) -* [![Build Status] -(https://travis-ci.org/warner/python-versioneer.png?branch=master) -](https://travis-ci.org/warner/python-versioneer) +* Compatible with: Python 3.6, 3.7, 3.8, 3.9 and pypy3 +* [![Latest Version][pypi-image]][pypi-url] +* [![Build Status][travis-image]][travis-url] This is a tool for managing a recorded version number in distutils-based python projects. The goal is to remove the tedious and error-prone "update @@ -27,9 +23,10 @@ ## Quick Install -* `pip install versioneer` to somewhere to your $PATH -* add a `[versioneer]` section to your setup.cfg (see below) +* `pip install versioneer` to somewhere in your $PATH +* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md)) * run `versioneer install` in your source tree, commit the results +* Verify version information with `python setup.py version` ## Version Identifiers @@ -61,7 +58,7 @@ for example `git describe --tags --dirty --always` reports things like "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has -uncommitted changes. +uncommitted changes). The version identifier is used for multiple purposes: @@ -166,7 +163,7 @@ Some situations are known to cause problems for Versioneer. This details the most significant ones. More can be found on Github -[issues page](https://github.com/warner/python-versioneer/issues). +[issues page](https://github.com/python-versioneer/python-versioneer/issues). ### Subprojects @@ -180,7 +177,7 @@ `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI distributions (and upload multiple independently-installable tarballs). * Source trees whose main purpose is to contain a C library, but which also - provide bindings to Python (and perhaps other langauges) in subdirectories. + provide bindings to Python (and perhaps other languages) in subdirectories. Versioneer will look for `.git` in parent directories, and most operations should get the right version string. However `pip` and `setuptools` have bugs @@ -194,9 +191,9 @@ Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in some later version. -[Bug #38](https://github.com/warner/python-versioneer/issues/38) is tracking +[Bug #38](https://github.com/python-versioneer/python-versioneer/issues/38) is tracking this issue. The discussion in -[PR #61](https://github.com/warner/python-versioneer/pull/61) describes the +[PR #61](https://github.com/python-versioneer/python-versioneer/pull/61) describes the issue from the Versioneer side in more detail. [pip PR#3176](https://github.com/pypa/pip/pull/3176) and [pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve @@ -224,22 +221,10 @@ cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into a different virtualenv), so this can be surprising. -[Bug #83](https://github.com/warner/python-versioneer/issues/83) describes +[Bug #83](https://github.com/python-versioneer/python-versioneer/issues/83) describes this one, but upgrading to a newer version of setuptools should probably resolve it. -### Unicode version strings - -While Versioneer works (and is continually tested) with both Python 2 and -Python 3, it is not entirely consistent with bytes-vs-unicode distinctions. -Newer releases probably generate unicode version strings on py2. It's not -clear that this is wrong, but it may be surprising for applications when then -write these strings to a network connection or include them in bytes-oriented -APIs like cryptographic checksums. - -[Bug #71](https://github.com/warner/python-versioneer/issues/71) investigates -this question. - ## Updating Versioneer @@ -265,6 +250,14 @@ direction and include code from all supported VCS systems, reducing the number of intermediate scripts. +## Similar projects + +* [setuptools_scm](https://github.com/pypa/setuptools_scm/) - a non-vendored build-time + dependency +* [minver](https://github.com/jbweston/miniver) - a lightweight reimplementation of + versioneer +* [versioningit](https://github.com/jwodder/versioningit) - a PEP 518-based setuptools + plugin ## License @@ -274,13 +267,15 @@ Dedication" license (CC0-1.0), as described in https://creativecommons.org/publicdomain/zero/1.0/ . +[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg +[pypi-url]: https://pypi.python.org/pypi/versioneer/ +[travis-image]: +https://img.shields.io/travis/com/python-versioneer/python-versioneer.svg +[travis-url]: https://travis-ci.com/github/python-versioneer/python-versioneer + """ -from __future__ import print_function -try: - import configparser -except ImportError: - import ConfigParser as configparser +import configparser import errno import json import os @@ -289,7 +284,7 @@ import sys -class VersioneerConfig: +class VersioneerConfig: # pylint: disable=too-few-public-methods # noqa """Container for Versioneer configuration parameters.""" @@ -321,12 +316,12 @@ # module-import table will cache the first one. So we can't use # os.path.dirname(__file__), as that will find whichever # versioneer.py was first imported, even in later projects. - me = os.path.realpath(os.path.abspath(__file__)) - me_dir = os.path.normcase(os.path.splitext(me)[0]) + my_path = os.path.realpath(os.path.abspath(__file__)) + me_dir = os.path.normcase(os.path.splitext(my_path)[0]) vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) if me_dir != vsr_dir: print("Warning: build in %s is using versioneer.py from %s" - % (os.path.dirname(me), versioneer_py)) + % (os.path.dirname(my_path), versioneer_py)) except NameError: pass return root @@ -339,25 +334,25 @@ # configparser.NoOptionError (if it lacks "VCS="). See the docstring at # the top of versioneer.py for instructions on writing your setup.cfg . setup_cfg = os.path.join(root, "setup.cfg") - parser = configparser.SafeConfigParser() - with open(setup_cfg, "r") as f: - parser.readfp(f) + parser = configparser.ConfigParser() + with open(setup_cfg, "r") as cfg_file: + parser.read_file(cfg_file) VCS = parser.get("versioneer", "VCS") # mandatory - def get(parser, name): - if parser.has_option("versioneer", name): - return parser.get("versioneer", name) - return None + # Dict-like interface for non-mandatory entries + section = parser["versioneer"] + + # pylint:disable=attribute-defined-outside-init # noqa cfg = VersioneerConfig() cfg.VCS = VCS - cfg.style = get(parser, "style") or "" - cfg.versionfile_source = get(parser, "versionfile_source") - cfg.versionfile_build = get(parser, "versionfile_build") - cfg.tag_prefix = get(parser, "tag_prefix") + cfg.style = section.get("style", "") + cfg.versionfile_source = section.get("versionfile_source") + cfg.versionfile_build = section.get("versionfile_build") + cfg.tag_prefix = section.get("tag_prefix") if cfg.tag_prefix in ("''", '""'): cfg.tag_prefix = "" - cfg.parentdir_prefix = get(parser, "parentdir_prefix") - cfg.verbose = get(parser, "verbose") + cfg.parentdir_prefix = section.get("parentdir_prefix") + cfg.verbose = section.get("verbose") return cfg @@ -371,29 +366,28 @@ def register_vcs_handler(vcs, method): # decorator - """Decorator to mark a method as the handler for a particular VCS.""" + """Create decorator to mark a method as the handler of a VCS.""" def decorate(f): """Store f in HANDLERS[vcs][method].""" - if vcs not in HANDLERS: - HANDLERS[vcs] = {} - HANDLERS[vcs][method] = f + HANDLERS.setdefault(vcs, {})[method] = f return f return decorate +# pylint:disable=too-many-arguments,consider-using-with # noqa def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) - p = None - for c in commands: + process = None + for command in commands: try: - dispcmd = str([c] + args) + dispcmd = str([command] + args) # remember shell=False, so use git.cmd on windows, not just git - p = subprocess.Popen([c] + args, cwd=cwd, env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None)) + process = subprocess.Popen([command] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) break except EnvironmentError: e = sys.exc_info()[1] @@ -407,18 +401,16 @@ if verbose: print("unable to find command, tried %s" % (commands,)) return None, None - stdout = p.communicate()[0].strip() - if sys.version_info[0] >= 3: - stdout = stdout.decode() - if p.returncode != 0: + stdout = process.communicate()[0].strip().decode() + if process.returncode != 0: if verbose: print("unable to run %s (error)" % dispcmd) print("stdout was %s" % stdout) - return None, p.returncode - return stdout, p.returncode + return None, process.returncode + return stdout, process.returncode -LONG_VERSION_PY['git'] = ''' +LONG_VERSION_PY['git'] = r''' # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build @@ -426,7 +418,7 @@ # that just contains the computed version number. # This file is released into the public domain. Generated by -# versioneer-0.18 (https://github.com/warner/python-versioneer) +# versioneer-0.20 (https://github.com/python-versioneer/python-versioneer) """Git implementation of _version.py.""" @@ -450,7 +442,7 @@ return keywords -class VersioneerConfig: +class VersioneerConfig: # pylint: disable=too-few-public-methods """Container for Versioneer configuration parameters.""" @@ -477,7 +469,7 @@ def register_vcs_handler(vcs, method): # decorator - """Decorator to mark a method as the handler for a particular VCS.""" + """Create decorator to mark a method as the handler of a VCS.""" def decorate(f): """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: @@ -487,19 +479,20 @@ return decorate +# pylint:disable=too-many-arguments,consider-using-with # noqa def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) - p = None - for c in commands: + process = None + for command in commands: try: - dispcmd = str([c] + args) + dispcmd = str([command] + args) # remember shell=False, so use git.cmd on windows, not just git - p = subprocess.Popen([c] + args, cwd=cwd, env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr - else None)) + process = subprocess.Popen([command] + args, cwd=cwd, env=env, + stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) break except EnvironmentError: e = sys.exc_info()[1] @@ -513,15 +506,13 @@ if verbose: print("unable to find command, tried %%s" %% (commands,)) return None, None - stdout = p.communicate()[0].strip() - if sys.version_info[0] >= 3: - stdout = stdout.decode() - if p.returncode != 0: + stdout = process.communicate()[0].strip().decode() + if process.returncode != 0: if verbose: print("unable to run %%s (error)" %% dispcmd) print("stdout was %%s" %% stdout) - return None, p.returncode - return stdout, p.returncode + return None, process.returncode + return stdout, process.returncode def versions_from_parentdir(parentdir_prefix, root, verbose): @@ -533,15 +524,14 @@ """ rootdirs = [] - for i in range(3): + for _ in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} - else: - rootdirs.append(root) - root = os.path.dirname(root) # up a level + rootdirs.append(root) + root = os.path.dirname(root) # up a level if verbose: print("Tried directories %%s but none started with prefix %%s" %% @@ -558,21 +548,20 @@ # _version.py. keywords = {} try: - f = open(versionfile_abs, "r") - for line in f.readlines(): - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - f.close() + with open(versionfile_abs, "r") as fobj: + for line in fobj: + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) except EnvironmentError: pass return keywords @@ -581,10 +570,14 @@ @register_vcs_handler("git", "keywords") def git_versions_from_keywords(keywords, tag_prefix, verbose): """Get version information from git keywords.""" - if not keywords: - raise NotThisMethod("no keywords at all, weird") + if "refnames" not in keywords: + raise NotThisMethod("Short version file found") date = keywords.get("date") if date is not None: + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because @@ -597,11 +590,11 @@ if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = set([r.strip() for r in refnames.strip("()").split(",")]) + refs = {r.strip() for r in refnames.strip("()").split(",")} # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " - tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %%d @@ -610,7 +603,7 @@ # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". - tags = set([r for r in refs if re.search(r'\d', r)]) + tags = {r for r in refs if re.search(r'\d', r)} if verbose: print("discarding '%%s', no digits" %% ",".join(refs - tags)) if verbose: @@ -619,6 +612,11 @@ # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] + # Filter out refs that exactly match prefix or that don't start + # with a number once the prefix is stripped (mostly a concern + # when prefix is '') + if not re.match(r'\d', r): + continue if verbose: print("picking %%s" %% r) return {"version": r, @@ -634,7 +632,7 @@ @register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): +def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* @@ -645,8 +643,8 @@ if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] - out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, - hide_stderr=True) + _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) if rc != 0: if verbose: print("Directory %%s not under git control" %% root) @@ -654,15 +652,15 @@ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", - "--always", "--long", - "--match", "%%s*" %% tag_prefix], - cwd=root) + describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%%s*" %% tag_prefix], + cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() - full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() @@ -672,6 +670,39 @@ pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None + branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], + cwd=root) + # --abbrev-ref was added in git-1.6.3 + if rc != 0 or branch_name is None: + raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") + branch_name = branch_name.strip() + + if branch_name == "HEAD": + # If we aren't exactly on a branch, pick a branch which represents + # the current commit. If all else fails, we are on a branchless + # commit. + branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) + # --contains was added in git-1.5.4 + if rc != 0 or branches is None: + raise NotThisMethod("'git branch --contains' returned error") + branches = branches.split("\n") + + # Remove the first line if we're running detached + if "(" in branches[0]: + branches.pop(0) + + # Strip off the leading "* " from the list of branches. + branches = [branch[2:] for branch in branches] + if "master" in branches: + branch_name = "master" + elif not branches: + branch_name = None + else: + # Pick the first branch that is returned. Good or bad. + branch_name = branches[0] + + pieces["branch"] = branch_name + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out @@ -688,7 +719,7 @@ # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: - # unparseable. Maybe git-describe is misbehaving? + # unparsable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%%s'" %% describe_out) return pieces @@ -713,13 +744,14 @@ else: # HEX: no tags pieces["closest-tag"] = None - count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], - cwd=root) + count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = run_command(GITS, ["show", "-s", "--format=%%ci", "HEAD"], - cwd=root)[0].strip() + date = runner(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces @@ -757,19 +789,49 @@ return rendered +def render_pep440_branch(pieces): + """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . + + The ".dev0" means not master branch. Note that .dev0 sorts backwards + (a feature branch will appear "older" than the master branch). + + Exceptions: + 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0" + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+untagged.%%d.g%%s" %% (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + def render_pep440_pre(pieces): - """TAG[.post.devDISTANCE] -- No -dirty. + """TAG[.post0.devDISTANCE] -- No -dirty. Exceptions: - 1: no tags. 0.post.devDISTANCE + 1: no tags. 0.post0.devDISTANCE """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: - rendered += ".post.dev%%d" %% pieces["distance"] + rendered += ".post0.dev%%d" %% pieces["distance"] else: # exception #1 - rendered = "0.post.dev%%d" %% pieces["distance"] + rendered = "0.post0.dev%%d" %% pieces["distance"] return rendered @@ -800,12 +862,41 @@ return rendered +def render_pep440_post_branch(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . + + The ".dev0" means not master branch. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%%d" %% pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%%s" %% pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0.post%%d" %% pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+g%%s" %% pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + def render_pep440_old(pieces): """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. - Eexceptions: + Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: @@ -876,10 +967,14 @@ if style == "pep440": rendered = render_pep440(pieces) + elif style == "pep440-branch": + rendered = render_pep440_branch(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) + elif style == "pep440-post-branch": + rendered = render_pep440_post_branch(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": @@ -915,7 +1010,7 @@ # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. - for i in cfg.versionfile_source.split('/'): + for _ in cfg.versionfile_source.split('/'): root = os.path.dirname(root) except NameError: return {"version": "0+unknown", "full-revisionid": None, @@ -950,21 +1045,20 @@ # _version.py. keywords = {} try: - f = open(versionfile_abs, "r") - for line in f.readlines(): - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - f.close() + with open(versionfile_abs, "r") as fobj: + for line in fobj: + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + if line.strip().startswith("git_date ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["date"] = mo.group(1) except EnvironmentError: pass return keywords @@ -973,10 +1067,14 @@ @register_vcs_handler("git", "keywords") def git_versions_from_keywords(keywords, tag_prefix, verbose): """Get version information from git keywords.""" - if not keywords: - raise NotThisMethod("no keywords at all, weird") + if "refnames" not in keywords: + raise NotThisMethod("Short version file found") date = keywords.get("date") if date is not None: + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] + # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because @@ -989,11 +1087,11 @@ if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = set([r.strip() for r in refnames.strip("()").split(",")]) + refs = {r.strip() for r in refnames.strip("()").split(",")} # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " - tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + tags = {r[len(TAG):] for r in refs if r.startswith(TAG)} if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d @@ -1002,7 +1100,7 @@ # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". - tags = set([r for r in refs if re.search(r'\d', r)]) + tags = {r for r in refs if re.search(r'\d', r)} if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: @@ -1011,6 +1109,11 @@ # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] + # Filter out refs that exactly match prefix or that don't start + # with a number once the prefix is stripped (mostly a concern + # when prefix is '') + if not re.match(r'\d', r): + continue if verbose: print("picking %s" % r) return {"version": r, @@ -1026,7 +1129,7 @@ @register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): +def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* @@ -1037,8 +1140,8 @@ if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] - out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, - hide_stderr=True) + _, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root, + hide_stderr=True) if rc != 0: if verbose: print("Directory %s not under git control" % root) @@ -1046,15 +1149,15 @@ # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", - "--always", "--long", - "--match", "%s*" % tag_prefix], - cwd=root) + describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty", + "--always", "--long", + "--match", "%s*" % tag_prefix], + cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() - full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() @@ -1064,6 +1167,39 @@ pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None + branch_name, rc = runner(GITS, ["rev-parse", "--abbrev-ref", "HEAD"], + cwd=root) + # --abbrev-ref was added in git-1.6.3 + if rc != 0 or branch_name is None: + raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") + branch_name = branch_name.strip() + + if branch_name == "HEAD": + # If we aren't exactly on a branch, pick a branch which represents + # the current commit. If all else fails, we are on a branchless + # commit. + branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) + # --contains was added in git-1.5.4 + if rc != 0 or branches is None: + raise NotThisMethod("'git branch --contains' returned error") + branches = branches.split("\n") + + # Remove the first line if we're running detached + if "(" in branches[0]: + branches.pop(0) + + # Strip off the leading "* " from the list of branches. + branches = [branch[2:] for branch in branches] + if "master" in branches: + branch_name = "master" + elif not branches: + branch_name = None + else: + # Pick the first branch that is returned. Good or bad. + branch_name = branches[0] + + pieces["branch"] = branch_name + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out @@ -1080,7 +1216,7 @@ # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: - # unparseable. Maybe git-describe is misbehaving? + # unparsable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%s'" % describe_out) return pieces @@ -1105,13 +1241,14 @@ else: # HEX: no tags pieces["closest-tag"] = None - count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], - cwd=root) + count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], - cwd=root)[0].strip() + date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() + # Use only the last line. Previous lines may contain GPG signature + # information. + date = date.splitlines()[-1] pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces @@ -1130,27 +1267,26 @@ if ipy: files.append(ipy) try: - me = __file__ - if me.endswith(".pyc") or me.endswith(".pyo"): - me = os.path.splitext(me)[0] + ".py" - versioneer_file = os.path.relpath(me) + my_path = __file__ + if my_path.endswith(".pyc") or my_path.endswith(".pyo"): + my_path = os.path.splitext(my_path)[0] + ".py" + versioneer_file = os.path.relpath(my_path) except NameError: versioneer_file = "versioneer.py" files.append(versioneer_file) present = False try: - f = open(".gitattributes", "r") - for line in f.readlines(): - if line.strip().startswith(versionfile_source): - if "export-subst" in line.strip().split()[1:]: - present = True - f.close() + with open(".gitattributes", "r") as fobj: + for line in fobj: + if line.strip().startswith(versionfile_source): + if "export-subst" in line.strip().split()[1:]: + present = True + break except EnvironmentError: pass if not present: - f = open(".gitattributes", "a+") - f.write("%s export-subst\n" % versionfile_source) - f.close() + with open(".gitattributes", "a+") as fobj: + fobj.write(f"{versionfile_source} export-subst\n") files.append(".gitattributes") run_command(GITS, ["add", "--"] + files) @@ -1164,15 +1300,14 @@ """ rootdirs = [] - for i in range(3): + for _ in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} - else: - rootdirs.append(root) - root = os.path.dirname(root) # up a level + rootdirs.append(root) + root = os.path.dirname(root) # up a level if verbose: print("Tried directories %s but none started with prefix %s" % @@ -1181,7 +1316,7 @@ SHORT_VERSION_PY = """ -# This file was generated by 'versioneer.py' (0.18) from +# This file was generated by 'versioneer.py' (0.20) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. @@ -1258,19 +1393,49 @@ return rendered +def render_pep440_branch(pieces): + """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . + + The ".dev0" means not master branch. Note that .dev0 sorts backwards + (a feature branch will appear "older" than the master branch). + + Exceptions: + 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0" + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + def render_pep440_pre(pieces): - """TAG[.post.devDISTANCE] -- No -dirty. + """TAG[.post0.devDISTANCE] -- No -dirty. Exceptions: - 1: no tags. 0.post.devDISTANCE + 1: no tags. 0.post0.devDISTANCE """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: - rendered += ".post.dev%d" % pieces["distance"] + rendered += ".post0.dev%d" % pieces["distance"] else: # exception #1 - rendered = "0.post.dev%d" % pieces["distance"] + rendered = "0.post0.dev%d" % pieces["distance"] return rendered @@ -1301,12 +1466,41 @@ return rendered +def render_pep440_post_branch(pieces): + """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . + + The ".dev0" means not master branch. + + Exceptions: + 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] + """ + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["branch"] != "master": + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + def render_pep440_old(pieces): """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. - Eexceptions: + Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: @@ -1377,10 +1571,14 @@ if style == "pep440": rendered = render_pep440(pieces) + elif style == "pep440-branch": + rendered = render_pep440_branch(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) + elif style == "pep440-post-branch": + rendered = render_pep440_post_branch(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": @@ -1480,8 +1678,12 @@ return get_versions()["version"] -def get_cmdclass(): - """Get the custom setuptools/distutils subclasses used by Versioneer.""" +def get_cmdclass(cmdclass=None): + """Get the custom setuptools/distutils subclasses used by Versioneer. + + If the package uses a different cmdclass (e.g. one from numpy), it + should be provide as an argument. + """ if "versioneer" in sys.modules: del sys.modules["versioneer"] # this fixes the "python setup.py develop" case (also 'install' and @@ -1495,9 +1697,9 @@ # parent is protected against the child's "import versioneer". By # removing ourselves from sys.modules here, before the child build # happens, we protect the child from the parent's versioneer too. - # Also see https://github.com/warner/python-versioneer/issues/52 + # Also see https://github.com/python-versioneer/python-versioneer/issues/52 - cmds = {} + cmds = {} if cmdclass is None else cmdclass.copy() # we add "version" to both distutils and setuptools from distutils.core import Command @@ -1539,7 +1741,9 @@ # setup.py egg_info -> ? # we override different "build_py" commands for both environments - if "setuptools" in sys.modules: + if 'build_py' in cmds: + _build_py = cmds['build_py'] + elif "setuptools" in sys.modules: from setuptools.command.build_py import build_py as _build_py else: from distutils.command.build_py import build_py as _build_py @@ -1559,6 +1763,33 @@ write_to_version_file(target_versionfile, versions) cmds["build_py"] = cmd_build_py + if 'build_ext' in cmds: + _build_ext = cmds['build_ext'] + elif "setuptools" in sys.modules: + from setuptools.command.build_ext import build_ext as _build_ext + else: + from distutils.command.build_ext import build_ext as _build_ext + + class cmd_build_ext(_build_ext): + def run(self): + root = get_root() + cfg = get_config_from_root(root) + versions = get_versions() + _build_ext.run(self) + if self.inplace: + # build_ext --inplace will only build extensions in + # build/lib<..> dir with no _version.py to write to. + # As in place builds will already have a _version.py + # in the module dir, we do not need to write one. + return + # now locate _version.py in the new build/ directory and replace + # it with an updated value + target_versionfile = os.path.join(self.build_lib, + cfg.versionfile_build) + print("UPDATING %s" % target_versionfile) + write_to_version_file(target_versionfile, versions) + cmds["build_ext"] = cmd_build_ext + if "cx_Freeze" in sys.modules: # cx_freeze enabled? from cx_Freeze.dist import build_exe as _build_exe # nczeczulin reports that py2exe won't like the pep440-style string @@ -1592,10 +1823,7 @@ del cmds["build_py"] if 'py2exe' in sys.modules: # py2exe enabled? - try: - from py2exe.distutils_buildexe import py2exe as _py2exe # py3 - except ImportError: - from py2exe.build_exe import py2exe as _py2exe # py2 + from py2exe.distutils_buildexe import py2exe as _py2exe class cmd_py2exe(_py2exe): def run(self): @@ -1620,7 +1848,9 @@ cmds["py2exe"] = cmd_py2exe # we override different "sdist" commands for both environments - if "setuptools" in sys.modules: + if 'sdist' in cmds: + _sdist = cmds['sdist'] + elif "setuptools" in sys.modules: from setuptools.command.sdist import sdist as _sdist else: from distutils.command.sdist import sdist as _sdist @@ -1628,6 +1858,7 @@ class cmd_sdist(_sdist): def run(self): versions = get_versions() + # pylint:disable=attribute-defined-outside-init # noqa self._versioneer_generated_versions = versions # unless we update this, the command will keep using the old # version @@ -1687,15 +1918,20 @@ """ -INIT_PY_SNIPPET = """ +OLD_SNIPPET = """ from ._version import get_versions __version__ = get_versions()['version'] del get_versions """ +INIT_PY_SNIPPET = """ +from . import {0} +__version__ = {0}.get_versions()['version'] +""" + def do_setup(): - """Main VCS-independent setup function for installing Versioneer.""" + """Do main VCS-independent setup function for installing Versioneer.""" root = get_root() try: cfg = get_config_from_root(root) @@ -1727,10 +1963,16 @@ old = f.read() except EnvironmentError: old = "" - if INIT_PY_SNIPPET not in old: + module = os.path.splitext(os.path.basename(cfg.versionfile_source))[0] + snippet = INIT_PY_SNIPPET.format(module) + if OLD_SNIPPET in old: + print(" replacing boilerplate in %s" % ipy) + with open(ipy, "w") as f: + f.write(old.replace(OLD_SNIPPET, snippet)) + elif snippet not in old: print(" appending to %s" % ipy) with open(ipy, "a") as f: - f.write(INIT_PY_SNIPPET) + f.write(snippet) else: print(" %s unmodified" % ipy) else: