Skip to content

Commit 84a672b

Browse files
authored
Merge pull request #136 from templateflow/maint/circleci
MAINT: Overdue updates and revision of CircleCI
2 parents c96b2cb + 58054df commit 84a672b

File tree

17 files changed

+431
-442
lines changed

17 files changed

+431
-442
lines changed

.circleci/config.yml

Lines changed: 131 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,85 @@
1-
version: 2
1+
version: 2.1
2+
orbs:
3+
docker: circleci/[email protected]
4+
codecov: codecov/[email protected]
5+
python: circleci/[email protected]
6+
27
jobs:
3-
tests:
4-
docker:
5-
- image: cimg/python:3.11
6-
auth:
7-
username: $DOCKER_USER
8-
password: $DOCKER_PAT
9-
working_directory: /tmp/tests
10-
environment:
11-
- OSF_MIRROR_PATH: /tmp/data/templateflow
12-
steps:
13-
- checkout:
14-
path: /tmp/src/templateflow
8+
build:
9+
executor:
10+
name: python/default
11+
tag: '3.12'
12+
13+
# docker:
14+
# - auth:
15+
# username: $DOCKER_USERNAME
16+
# password: $DOCKER_PASSWORD
1517

18+
steps:
19+
- checkout
1620
- run:
17-
name: Generate requirements.txt
1821
command: |
19-
python /tmp/src/templateflow/.maint/update_requirements.py
20-
21-
- restore_cache:
22-
keys:
23-
- deps-v11-{{ checksum "/tmp/src/templateflow/dev-requirements.txt"}}-{{ epoch }}
24-
- deps-v11-{{ checksum "/tmp/src/templateflow/dev-requirements.txt"}}-
25-
- deps-v11-
22+
echo 'build' > requirements.txt
23+
echo 'wheel' >> requirements.txt
24+
echo 'twine' >> requirements.txt
25+
- python/install-packages:
26+
pkg-manager: pip
27+
cache-version: build-v1
2628
- run:
27-
name: Prepare environment
2829
command: |
29-
python -m venv /tmp/venv
30-
source /tmp/venv/bin/activate
31-
python -m pip install -U pip
32-
python -m pip install -r /tmp/src/templateflow/dev-requirements.txt
33-
python -m pip install -U "datalad ~= 0.19.0"
34-
python -m pip install -U build hatch twine pkginfo codecov
30+
python -m build
31+
python -m twine check dist/*
32+
name: Test packaging
33+
- persist_to_workspace:
34+
root: ~/project
35+
paths:
36+
- .
37+
38+
deploy_pypi:
39+
executor:
40+
name: python/default
41+
tag: '3.12'
42+
43+
# docker:
44+
# - auth:
45+
# username: $DOCKER_USERNAME
46+
# password: $DOCKER_PASSWORD
47+
48+
steps:
49+
- attach_workspace:
50+
at: ~/project
51+
52+
- python/install-packages:
53+
args: twine
54+
pkg-manager: pip
3555

56+
- run:
57+
command: python -m twine upload dist/*
58+
name: Upload to Pypi
59+
60+
tests:
61+
executor:
62+
name: python/default
63+
tag: '3.12'
64+
65+
# docker:
66+
# - auth:
67+
# username: $DOCKER_USERNAME
68+
# password: $DOCKER_PASSWORD
69+
70+
environment:
71+
- OSF_MIRROR_PATH: /tmp/data/templateflow
72+
steps:
73+
- restore_cache:
74+
keys:
75+
- annex-v1-{{ epoch }}
76+
- annex-v1-
3677
- run:
3778
name: Install git and git-annex
3879
command: |
3980
if [[ ! -e "/tmp/cache/git-annex-standalone.tar.gz" ]]; then
4081
wget -O- http://neuro.debian.net/lists/focal.us-ca.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list
41-
sudo apt-key add /tmp/src/templateflow/.neurodebian/neurodebian.gpg
82+
sudo apt-key add .neurodebian/neurodebian.gpg
4283
sudo apt-key adv --recv-keys --keyserver hkps://keys.openpgp.org 0xA5D32F012649A5A9 || true
4384
sudo apt update && sudo apt-get install -y --no-install-recommends git-annex-standalone
4485
mkdir -p /tmp/cache
@@ -50,83 +91,80 @@ jobs:
5091
git config --global user.email "[email protected]"
5192
5293
- save_cache:
53-
key: deps-v11-{{ checksum "/tmp/src/templateflow/dev-requirements.txt"}}-{{ epoch }}
94+
key: annex-v1-{{ epoch }}
5495
paths:
5596
- "/tmp/cache"
56-
- "/tmp/venv"
97+
98+
- attach_workspace:
99+
at: ~/project
57100

58101
- run:
59-
name: Test packaging
60102
command: |
61-
source /tmp/venv/bin/activate
62-
cd /tmp/src/templateflow
63-
python -m build
64-
python -m twine check dist/*
103+
python .maint/update_requirements.py
104+
name: Generate requirements.txt
105+
106+
- python/install-packages:
107+
pip-dependency-file: dev-requirements.txt
108+
pkg-manager: pip
109+
cache-version: v1
65110

66111
- run:
67-
name: Run tests (w/ DataLad)
112+
name: Run tests (config and others)
68113
command: |
69-
source /tmp/venv/bin/activate
70-
export TEMPLATEFLOW_USE_DATALAD=on
71-
pytest --junit-xml=/tmp/tests/datalad.xml --cov templateflow --cov-report xml:/tmp/cov_api_dl.xml \
72-
--doctest-modules /tmp/src/templateflow/templateflow
114+
python -m pytest \
115+
--junit-xml=~/tests/conftests.xml --cov templateflow --cov-report xml:~/coverage/cov_config.xml \
116+
templateflow/tests/
117+
118+
- codecov/upload:
119+
file: ~/coverage/cov_config.xml
120+
flags: config
121+
upload_name: General
73122

74123
- run:
75-
name: Submit api test coverage
124+
name: Run tests (w/ DataLad)
76125
command: |
77-
source /tmp/venv/bin/activate
78-
codecov --file /tmp/cov_api_dl.xml --root /tmp/src/templateflow \
79-
--flags api,datalad -e CIRCLE_JOB
126+
mkdir -p ~/tests/ ~/coverage/
127+
export TEMPLATEFLOW_USE_DATALAD=on
128+
python -m pytest \
129+
--junit-xml=~/tests/datalad.xml --cov templateflow --cov-report xml:~/coverage/cov_api_dl.xml \
130+
--doctest-modules templateflow/api.py
131+
132+
- codecov/upload:
133+
file: ~/coverage/cov_api_dl.xml
134+
flags: api,datalad
135+
upload_name: Datalad tests
80136

81137
- run:
82138
name: Run tests (pulling from S3)
83139
command: |
84-
source /tmp/venv/bin/activate
85140
export TEMPLATEFLOW_USE_DATALAD=off
86141
export TEMPLATEFLOW_HOME=$HOME/templateflow-s3
87-
pytest --junit-xml=/tmp/tests/s3.xml --cov templateflow --cov-report xml:/tmp/cov_api_s3.xml \
88-
--doctest-modules /tmp/src/templateflow/templateflow/api.py
142+
python -m pytest \
143+
--junit-xml=~/tests/s3.xml --cov templateflow --cov-report xml:~/coverage/cov_api_s3.xml \
144+
--doctest-modules templateflow/api.py
89145
90-
- run:
91-
name: Submit api test coverage
92-
command: |
93-
source /tmp/venv/bin/activate
94-
codecov --file /tmp/cov_api_s3.xml --root /tmp/src/templateflow \
95-
--flags api,s3 -e CIRCLE_JOB
146+
- codecov/upload:
147+
file: ~/coverage/cov_api_s3.xml
148+
flags: api,s3
149+
upload_name: S3 tests
96150

97151
- run:
98152
name: Run tests (w/ DataLad, bypassed via S3)
99153
command: |
100-
source /tmp/venv/bin/activate
101154
export TEMPLATEFLOW_USE_DATALAD=off
102155
export TEMPLATEFLOW_HOME=$HOME/templateflow-clean
103156
datalad install -r -s https://github.com/templateflow/templateflow $TEMPLATEFLOW_HOME
104-
pytest --junit-xml=/tmp/tests/dl+s3.xml --cov templateflow --cov-report xml:/tmp/cov_api_dl_s3.xml \
105-
--doctest-modules /tmp/src/templateflow/templateflow/api.py
157+
python -m pytest \
158+
--junit-xml=~/tests/dl+s3.xml --cov templateflow --cov-report xml:~/coverage/cov_api_dl_s3.xml \
159+
--doctest-modules templateflow/api.py
106160
107-
- run:
108-
name: Submit api test coverage
109-
command: |
110-
source /tmp/venv/bin/activate
111-
codecov --file /tmp/cov_api_dl_s3.xml --root /tmp/src/templateflow \
112-
--flags api,dls3 -e CIRCLE_JOB
113-
114-
- run:
115-
name: Run tests (config, parameterized TEMPLATEFLOW_USE_DATALAD)
116-
command: |
117-
source /tmp/venv/bin/activate
118-
pytest --junit-xml=/tmp/tests/conftests.xml --cov templateflow --cov-report xml:/tmp/cov_config.xml \
119-
/tmp/src/templateflow/templateflow/conf/tests/test_conf.py
120-
121-
- run:
122-
name: Submit config test coverage
123-
command: |
124-
source /tmp/venv/bin/activate
125-
codecov --file /tmp/cov_config.xml --root /tmp/src/templateflow \
126-
--flags config -e CIRCLE_JOB
161+
- codecov/upload:
162+
file: ~/coverage/cov_api_dl_s3.xml
163+
flags: api,dls3
164+
upload_name: Datalad-S3-bypass
127165

128166
- store_test_results:
129-
path: /tmp/tests
167+
path: ~/tests
130168

131169
build_docs:
132170
machine:
@@ -179,54 +217,38 @@ jobs:
179217
- store_artifacts:
180218
path: ~/html
181219

182-
deploy_pypi:
183-
docker:
184-
- image: cimg/python:3.9
185-
working_directory: /tmp/src/templateflow
186-
steps:
187-
- attach_workspace:
188-
at: /tmp
189-
190-
- checkout:
191-
path: /tmp/src/templateflow
192-
193-
- run:
194-
name: Generate requirements.txt
195-
command: |
196-
python /tmp/src/templateflow/.maint/update_requirements.py
197-
198-
- restore_cache:
199-
keys:
200-
- deps-v11-{{ checksum "/tmp/src/templateflow/dev-requirements.txt"}}-{{ epoch }}
201-
- deps-v11-{{ checksum "/tmp/src/templateflow/dev-requirements.txt"}}-
202-
- deps-v11-
203-
204-
- run:
205-
name: Deploy to PyPi
206-
command: |
207-
source /tmp/venv/bin/activate
208-
python -m pip install build -U twine pkginfo
209-
python -m build
210-
python -m twine check dist/*
211-
python -m twine upload dist/*
212-
213220
workflows:
214221
version: 2
215222
build_test_deploy:
216223
jobs:
224+
- build:
225+
context:
226+
- nipreps-common
227+
filters:
228+
branches:
229+
ignore:
230+
- /docs?\/.*/
231+
tags:
232+
only: /.*/
233+
217234
- tests:
218235
context:
219236
- nipreps-common
237+
requires:
238+
- build
220239
filters:
221240
branches:
222241
ignore:
223242
- /docs?\/.*/
224243
tags:
225244
only: /.*/
245+
226246
- deploy_pypi:
227247
context:
228248
- nipreps-common
229249
requires:
250+
- build
251+
- tests
230252
- build_docs
231253
filters:
232254
branches:

.maint/update_requirements.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
reqs_dev = repo_root / 'dev-requirements.txt'
1717

1818
requirements = [
19-
Requirement(req)
20-
for req in loads(pyproject.read_text())['project']['dependencies']
19+
Requirement(req) for req in loads(pyproject.read_text())['project']['dependencies']
2120
]
2221

2322
requirements_dev = [
2423
Requirement(req)
25-
for req in loads(pyproject.read_text())['project']['optional-dependencies']['test']
24+
for group in ('test', 'datalad')
25+
for req in loads(pyproject.read_text())['project']['optional-dependencies'][group]
2626
]
2727

2828
script_name = Path(__file__).relative_to(repo_root)

pyproject.toml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,15 @@ Documentation = "https://www.templateflow.org/python-client/"
3737

3838
[project.optional-dependencies]
3939
test = [
40+
"coverage ~= 5.0.0",
4041
"pytest",
42+
"pytest-cov",
43+
"pytest-env",
4144
"pytest-xdist",
42-
"pytest-cov == 2.5.1",
43-
"coverage",
45+
"toml",
4446
]
4547
datalad = [
46-
"datalad ~= 0.19.0"
48+
"datalad ~= 1.0.0"
4749
]
4850
doc = [
4951
"nbsphinx",
@@ -113,15 +115,15 @@ per-file-ignores = [
113115

114116
[tool.pytest.ini_options]
115117
norecursedirs = [".git"]
116-
addopts = "-svx --doctest-modules"
118+
addopts = "-svx"
117119
doctest_optionflags = "ALLOW_UNICODE NORMALIZE_WHITESPACE ELLIPSIS"
118120
env = "PYTHONHASHSEED=0"
119121
filterwarnings = ["ignore::DeprecationWarning"]
120122
junit_family = "xunit2"
121123

122124
[tool.coverage.run]
123125
branch = true
124-
concurrency = 'multiprocessing'
126+
concurrency = ['multiprocessing']
125127
omit = [
126128
'*/tests/*',
127129
'*/conftest.py',

templateflow/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
# https://www.nipreps.org/community/licensing/
2222
#
2323
"""TemplateFlow is the Zone of Templates."""
24+
2425
from datetime import datetime as _dt
2526
from datetime import timezone as _tz
2627

@@ -30,6 +31,7 @@
3031
from ._version import __version__
3132
except ModuleNotFoundError:
3233
from importlib.metadata import PackageNotFoundError, version
34+
3335
try:
3436
__version__ = version(__packagename__)
3537
except PackageNotFoundError:

templateflow/_loader.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
2525
.. autoclass:: Loader
2626
"""
27+
2728
from __future__ import annotations
2829

2930
import atexit

0 commit comments

Comments
 (0)