From ec0f257801839034303ea1e9994040e9313d0819 Mon Sep 17 00:00:00 2001 From: Nick Guenther Date: Mon, 5 Apr 2021 21:45:52 -0400 Subject: [PATCH 01/48] Template for packaging spinalcordtoolbox datasets in pip. --- .github/workflows/build.yml | 24 ++++++++++ .github/workflows/release.yml | 44 +++++++++++++++++++ .gitignore | 6 +++ README.md | 41 +++++++++++++++++ pyproject.toml | 3 ++ setup.py | 44 +++++++++++++++++++ .../data/dataset/__init__.py | 2 + 7 files changed, 164 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 pyproject.toml create mode 100644 setup.py create mode 100644 src/spinalcordtoolbox/data/dataset/__init__.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..93e519a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,24 @@ +name: Test the Build + +on: + # test on PRs and double-test on merges to master, or manually. + pull_request: + push: + branches: + - master + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Build tools + run: | + python -m pip install --upgrade pip + pip install build + - name: Build + run: | + python -m build --wheel --sdist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e6b1fa3 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,44 @@ +name: Publish + +on: + # publish from the Releases page: + release: + types: [published] + # publish from the Actions page: + workflow_dispatch: + inputs: + version: + description: 'Version (e.g. 2.0.3)' + required: true + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Build tools + run: | + python -m pip install --upgrade pip + pip install build + - name: Build + run: | + python -m build --wheel --sdist + ### TODO: can the uploads be parallelized? + - name: Publish to Github + uses: softprops/action-gh-release@v1 + with: + files: 'dist/*' + fail_on_unmatched_files: true + tag_name: ${{ github.event.inputs.version }} # in the workflow_dispatch case, make a new tag from the given input; in the published release case, this will be empty and will fall back to updating that release. + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + #password: ${{ secrets.PYPI_PASSWORD }} + # DEBUG: + password: ${{ secrets.TEST_PYPI_API_TOKEN }} + repository_url: https://test.pypi.org/legacy/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92148bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +dist/ +build/ + +*.whl +*.egg-info +__pycache__ diff --git a/README.md b/README.md index e69de29..791fe29 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,41 @@ +# template + +Part of [`spinalcordtoolbox`](https://github.com/neuropoly/spinalcordtoolbox). + + +## Usage + +1. Clone this repo. + + ``` + git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} + cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} + vi setup.py # to edit name= and url= + vi README.md # to edit the title and *remove* this usage section + git add . + git commit + git remote add origin git@github.com:neuropoly/spinalcordtoolbox-data-${dataset_name} + git push + ``` + +2. Go to https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/releases + + 1. Click "Draft Release" + 2. Fill in a version tag. We use [this versioning policy](TODO) + 3. Click "Publish Release" + 4. Wait a few minutes; + 5. Monitor the progress at https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/actions/workflows/release.yml + 6. The release should appear on https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/releases + with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. + +### Troubleshooting + +You can test the repo locally with + +``` +pip install build && +python -m build --wheel --sdist && +pip install dist/*.whl +``` + +This should give you enough clues hopefully to track down any problems. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1ce1d64 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +# this ensures builds are done reliably +[build-system] +requires = ["setuptools>=40.8.0", "setuptools_scm[toml]", "wheel"] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..5eaee53 --- /dev/null +++ b/setup.py @@ -0,0 +1,44 @@ +from setuptools import setup, find_packages, find_namespace_packages +import pathlib + +here = pathlib.Path(__file__).parent.resolve() + +# workaround a bug introduced by pyproject.toml +# https://github.com/pypa/pip/issues/7953#issuecomment-645133255 +import site, sys; site.ENABLE_USER_SITE = True + +setup( + name='spinalcordtoolbox-data-', + description='Part of https://github.com/neuropoly/spinalcordtoolbox', + long_description=(here / 'README.md').read_text(encoding='utf-8'), + long_description_content_type='text/markdown', + author='Neuropoly', + author_email='neuropoly@googlegroups.com', + url='https://spinalcordtoolbox.com/', + project_urls={ + 'Source': 'https://github.com/sct-data/', + #'Documentation': '', + }, + #license='CC-BY-NC', ?? + #license_files=[ ... ] # TODO? + + packages=find_namespace_packages('src/'), + package_dir={"":"src/"}, + + # with setuptools_scm, means it includes non-python files if they're under git + include_package_data=True, + + # with setuptools_scm, get the version out of the most recent git tag. + # the tags must be formatted as semver. + use_scm_version=True, + + # pyproject.toml::build-system.requires is supposed to supersede this, but it's still very new so we duplicate it. + setup_requires=[ + 'setuptools', + 'setuptools_scm[toml]', + 'wheel', + ], + + zip_safe=False, # guarantees that importlib.resources.path() is safe +) + diff --git a/src/spinalcordtoolbox/data/dataset/__init__.py b/src/spinalcordtoolbox/data/dataset/__init__.py new file mode 100644 index 0000000..ead4c67 --- /dev/null +++ b/src/spinalcordtoolbox/data/dataset/__init__.py @@ -0,0 +1,2 @@ +# empty __init__.py to enable importlib.resources +# see < TODO > From cbbac731a75a02c36303117b535a174b4eba7a13 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:16:51 -0400 Subject: [PATCH 02/48] Update README.md feedback: * https://github.com/spinalcordtoolbox/spinalcordtoolbox-data-template/pull/1/files#r608804968 --- README.md | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 791fe29..ad0475f 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,50 @@ -# template +# `${dataset_name}` Part of [`spinalcordtoolbox`](https://github.com/neuropoly/spinalcordtoolbox). -## Usage - -1. Clone this repo. +## Using the Template +1. Go to https://github.com/new and make a repo using this one as its template; name it `spinalcordtoolbox/data-${dataset_name}` where `${dataset_name}` is something descriptive +2. Download the new repo + ``` - git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} - cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} + git clone git@github.com:spinalcordtoolbox/data-${dataset_name} + cd data-${dataset_name} + ``` + +1. Fill with initial metadata + + ``` + git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} vi setup.py # to edit name= and url= - vi README.md # to edit the title and *remove* this usage section + vi README.md # 1. *remove* this Using the Template section + # 2. change remaining ${dataset_name}s to the name you picked + git add -u + git commit -m "Initial commit" + ``` + +1. Fill with initial data and upload + + ``` + cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} git add . git commit - git remote add origin git@github.com:neuropoly/spinalcordtoolbox-data-${dataset_name} git push ``` -2. Go to https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/releases + +## How to update this dataset + +1. Edit and commit the files in `src/spinalcordtoolbox/data/` +2. Go to https://github.com/spinalcordtoolbox/data-${dataset_name}/releases 1. Click "Draft Release" 2. Fill in a version tag. We use [this versioning policy](TODO) 3. Click "Publish Release" 4. Wait a few minutes; - 5. Monitor the progress at https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/actions/workflows/release.yml - 6. The release should appear on https://github.com/neuropoly/spinalcordtoolbox-data-${dataset_name}/releases + 5. Monitor the progress at https://github.com/spinalcordtoolbox/data-${dataset_name}/actions/workflows/release.yml + 6. The release should appear on https://github.com/spinalcordtoolbox/data-${dataset_name}/releases with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. ### Troubleshooting From dbcd1e3c5af9d369e5592464a330571b42b19114 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:20:23 -0400 Subject: [PATCH 03/48] Add files via upload --- data-template-new.png | Bin 0 -> 47606 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data-template-new.png diff --git a/data-template-new.png b/data-template-new.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c462d2b1b023c066f940225bbbe3f7f9c0ce02 GIT binary patch literal 47606 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ࡱ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 literal 0 HcmV?d00001 From 7173954fbbb59b9fd17fa420ca5eda77c83161e8 Mon Sep 17 00:00:00 2001 From: b Date: Tue, 13 Jul 2021 17:21:32 -0400 Subject: [PATCH 04/48] Yep --- data-template-new.png => .data-template-new.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename data-template-new.png => .data-template-new.png (100%) diff --git a/data-template-new.png b/.data-template-new.png similarity index 100% rename from data-template-new.png rename to .data-template-new.png From 24ba7f239edfbb825294ee17e5ca319883681584 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:22:32 -0400 Subject: [PATCH 05/48] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ad0475f..d47bc61 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,11 @@ Part of [`spinalcordtoolbox`](https://github.com/neuropoly/spinalcordtoolbox). ## Using the Template -1. Go to https://github.com/new and make a repo using this one as its template; name it `spinalcordtoolbox/data-${dataset_name}` where `${dataset_name}` is something descriptive -2. Download the new repo +1. Go to https://github.com/new and make a repo using this one as its template; name it `spinalcordtoolbox/data-${dataset_name}` where `${dataset_name}` is something usefully descriptive: + + ![data-template-new](./.data-template-new.png) + +3. Download the new repo ``` git clone git@github.com:spinalcordtoolbox/data-${dataset_name} @@ -47,7 +50,7 @@ Part of [`spinalcordtoolbox`](https://github.com/neuropoly/spinalcordtoolbox). 6. The release should appear on https://github.com/spinalcordtoolbox/data-${dataset_name}/releases with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. -### Troubleshooting +## Troubleshooting You can test the repo locally with From 68fb7ff290b98df0cb9f9da1cb75fe4b3d17df74 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:22:49 -0400 Subject: [PATCH 06/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d47bc61..c3c89a6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # `${dataset_name}` -Part of [`spinalcordtoolbox`](https://github.com/neuropoly/spinalcordtoolbox). +Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). ## Using the Template From 305fb5ee0339a3e964b857d0e82eaea6d4e27d56 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:23:33 -0400 Subject: [PATCH 07/48] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3c89a6..23c5501 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). ## Using the Template -1. Go to https://github.com/new and make a repo using this one as its template; name it `spinalcordtoolbox/data-${dataset_name}` where `${dataset_name}` is something usefully descriptive: +1. Make a [new repo](https://github.com/new) using this as its template. + + Name it `spinalcordtoolbox/data-${dataset_name}` where `${dataset_name}` is something usefully descriptive: ![data-template-new](./.data-template-new.png) From 2b0291a0d47bf22d811ac7b3ccfe2ee89201a63c Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 17:49:39 -0400 Subject: [PATCH 08/48] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 23c5501..9bcc0ee 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,10 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). ``` git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} - vi setup.py # to edit name= and url= - vi README.md # 1. *remove* this Using the Template section + vi README.md # 1. remove this 'Using the Template' section # 2. change remaining ${dataset_name}s to the name you picked + vi setup.py # 1. set name=spinalcordtoolbox-data-${dataset_name} + # 2. set url=https://github.com/spinalcordtoolbox/data-${dataset_name} git add -u git commit -m "Initial commit" ``` From f4d8f1e69fab6d37d11081f5a5a3033cb6355145 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 18:03:57 -0400 Subject: [PATCH 09/48] Update setup.py --- setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 5eaee53..c25145a 100644 --- a/setup.py +++ b/setup.py @@ -1,14 +1,14 @@ -from setuptools import setup, find_packages, find_namespace_packages +from setuptools import setup, find_namespace_packages import pathlib here = pathlib.Path(__file__).parent.resolve() # workaround a bug introduced by pyproject.toml # https://github.com/pypa/pip/issues/7953#issuecomment-645133255 -import site, sys; site.ENABLE_USER_SITE = True +import site; site.ENABLE_USER_SITE = True setup( - name='spinalcordtoolbox-data-', + name='spinalcordtoolbox-data-${dataset_name}', description='Part of https://github.com/neuropoly/spinalcordtoolbox', long_description=(here / 'README.md').read_text(encoding='utf-8'), long_description_content_type='text/markdown', @@ -16,7 +16,7 @@ author_email='neuropoly@googlegroups.com', url='https://spinalcordtoolbox.com/', project_urls={ - 'Source': 'https://github.com/sct-data/', + 'Source': 'https://github.com/spinalcordtoolbox/data-${dataset_name}', #'Documentation': '', }, #license='CC-BY-NC', ?? From b828e8696ec646c565947888d16118e5e0512646 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 13 Jul 2021 18:06:56 -0400 Subject: [PATCH 10/48] `setup.py`: Add link to front page for 'documentation' --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c25145a..e40c73f 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ url='https://spinalcordtoolbox.com/', project_urls={ 'Source': 'https://github.com/spinalcordtoolbox/data-${dataset_name}', - #'Documentation': '', + 'Documentation': 'https://spinalcordtoolbox.com/', }, #license='CC-BY-NC', ?? #license_files=[ ... ] # TODO? From 2521744b8032b6ca055dc196cd23a2b85cbf0179 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 18:23:05 -0400 Subject: [PATCH 11/48] Update setup.py --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index e40c73f..d70530b 100644 --- a/setup.py +++ b/setup.py @@ -19,8 +19,8 @@ 'Source': 'https://github.com/spinalcordtoolbox/data-${dataset_name}', 'Documentation': 'https://spinalcordtoolbox.com/', }, - #license='CC-BY-NC', ?? - #license_files=[ ... ] # TODO? + license='CC-BY-4.0', ?? + license_files=[ 'LICENSE.txt' ] # TODO? packages=find_namespace_packages('src/'), package_dir={"":"src/"}, From f4beed74cc16d9db997c5e9cd3e9fea51a9802de Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 18:27:25 -0400 Subject: [PATCH 12/48] Create LICENSE.txt --- LICENSE.txt | 317 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..49ce653 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,317 @@ +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. From 97683bc461a5512b792c7ab4869236501e3020cb Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jul 2021 18:29:16 -0400 Subject: [PATCH 13/48] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d70530b..1e899eb 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ 'Source': 'https://github.com/spinalcordtoolbox/data-${dataset_name}', 'Documentation': 'https://spinalcordtoolbox.com/', }, - license='CC-BY-4.0', ?? + license='CC-BY-4.0', license_files=[ 'LICENSE.txt' ] # TODO? packages=find_namespace_packages('src/'), From cc38cc647c23b5d26d310b9a9c5f2855faa2b043 Mon Sep 17 00:00:00 2001 From: Taowa Rosetwig Date: Sun, 18 Jul 2021 22:46:12 -0400 Subject: [PATCH 14/48] add a missing comma to setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1e899eb..ef8dba9 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ 'Documentation': 'https://spinalcordtoolbox.com/', }, license='CC-BY-4.0', - license_files=[ 'LICENSE.txt' ] # TODO? + license_files=[ 'LICENSE.txt' ], # TODO? packages=find_namespace_packages('src/'), package_dir={"":"src/"}, From f45045b1352a77474986c208cc54ba416ec40d5b Mon Sep 17 00:00:00 2001 From: Taowa Rosetwig Date: Fri, 30 Jul 2021 11:23:09 -0400 Subject: [PATCH 15/48] replace the name string during builds for testing --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93e519a..2bf3844 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,4 +21,5 @@ jobs: pip install build - name: Build run: | + perl -pi -e 's/\${dataset_name}/sample-dataset/' setup.py python -m build --wheel --sdist From 8dde7fda29d63f99022de814d83871ea92ef6cb8 Mon Sep 17 00:00:00 2001 From: Taowa Rosetwig Date: Wed, 1 Sep 2021 09:40:49 -0400 Subject: [PATCH 16/48] replace google group email with a forwarder @neuropoly.org --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ef8dba9..63a2a48 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ long_description=(here / 'README.md').read_text(encoding='utf-8'), long_description_content_type='text/markdown', author='Neuropoly', - author_email='neuropoly@googlegroups.com', + author_email='pip@neuropoly.org', url='https://spinalcordtoolbox.com/', project_urls={ 'Source': 'https://github.com/spinalcordtoolbox/data-${dataset_name}', From 4410d0e5cc558df4600ace83fcbb7bbb2dbf82e9 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 09:20:13 -0400 Subject: [PATCH 17/48] `README.md`: Fix numbering --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9bcc0ee..955b900 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,14 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). ![data-template-new](./.data-template-new.png) -3. Download the new repo +2. Download the new repo ``` git clone git@github.com:spinalcordtoolbox/data-${dataset_name} cd data-${dataset_name} ``` -1. Fill with initial metadata +3. Fill with initial metadata ``` git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} @@ -30,7 +30,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). git commit -m "Initial commit" ``` -1. Fill with initial data and upload +4. Fill with initial data and upload ``` cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} From 4fe54cce30a9c00ef871c86e9681ba54241b0c57 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 09:29:46 -0400 Subject: [PATCH 18/48] `README.md`: Improve readability of CLI steps --- README.md | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 955b900..a48eeb6 100644 --- a/README.md +++ b/README.md @@ -13,27 +13,39 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 2. Download the new repo - ``` + ```bash git clone git@github.com:spinalcordtoolbox/data-${dataset_name} cd data-${dataset_name} ``` 3. Fill with initial metadata - ``` + ```bash + # 1. Rename the repo's `dataset` folder to match the repo name git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} - vi README.md # 1. remove this 'Using the Template' section - # 2. change remaining ${dataset_name}s to the name you picked - vi setup.py # 1. set name=spinalcordtoolbox-data-${dataset_name} - # 2. set url=https://github.com/spinalcordtoolbox/data-${dataset_name} + + # 2. Edit the `README.md` file to: + # - Delete the 'Using the Template' section + # - Find and replace ${dataset_name} with the name you picked + vi README.md + + # 3. Edit the `setup.py` file to: + # - set `name=` to `name=spinalcordtoolbox-data-${dataset_name}` + # - set `url=` to `url=https://github.com/spinalcordtoolbox/data-${dataset_name}` + vi setup.py + + # 4. Commit the changes git add -u git commit -m "Initial commit" ``` 4. Fill with initial data and upload - ``` - cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} + ```bash + # 1. Copy over the data files to the dataset folder in this repo + cp ${data_files} src/spinalcordtoolbox/data/${dataset_name} + + # 2. Add, commit, and push the newly-added files git add . git commit git push From 7bbc02dcd520c770d612d1e35a61c968e217f4d1 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 09:33:19 -0400 Subject: [PATCH 19/48] `README.md`: Split "Remove this section" step into its own last step --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a48eeb6..6abd3f9 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,6 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} # 2. Edit the `README.md` file to: - # - Delete the 'Using the Template' section # - Find and replace ${dataset_name} with the name you picked vi README.md @@ -48,6 +47,17 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). # 2. Add, commit, and push the newly-added files git add . git commit + ``` + +5. Remove the "Using this template" section from `README.md`, since it is now no longer needed. + + ```bash + # Delete the 'Using the Template' section from `README.md + vi README.md + + # Add, commit, and push the changes + git add README.md + git commit -m "Removing template section from README.md" git push ``` From 3b2c4ef3de9b795a39ecf1632e1665e7e320d622 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 09:34:57 -0400 Subject: [PATCH 20/48] `README.md`: Add clearer git commit messages --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6abd3f9..d5223c8 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,8 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). # 4. Commit the changes git add -u - git commit -m "Initial commit" + git commit -m "Setting ${dataset_name} package metadata" + git push ``` 4. Fill with initial data and upload @@ -46,7 +47,8 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). # 2. Add, commit, and push the newly-added files git add . - git commit + git commit -m "Copy over data files to dataset folder" + git push ``` 5. Remove the "Using this template" section from `README.md`, since it is now no longer needed. From b9e31cb0f429080094c56c976d171d9d8492b316 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 09:52:35 -0400 Subject: [PATCH 21/48] `README.md`: Add clarifying indentation --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5223c8..72ba162 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ You can test the repo locally with ``` pip install build && -python -m build --wheel --sdist && -pip install dist/*.whl + python -m build --wheel --sdist && + pip install dist/*.whl ``` This should give you enough clues hopefully to track down any problems. From 0f1e9fa70c489868aff7f0a64fd46e5bb27aab2e Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:10:10 -0400 Subject: [PATCH 22/48] `README.md`: Use date-based release versioning This wasn't formally agreed upon, however it *is* the de facto default in the NeuroPoly lab, so I wanted to start out by using what we already know and use. We can discuss changing this in the future. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 72ba162..b7b4c74 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 2. Go to https://github.com/spinalcordtoolbox/data-${dataset_name}/releases 1. Click "Draft Release" - 2. Fill in a version tag. We use [this versioning policy](TODO) + 2. Fill in a version tag. We use date-based release names (e.g. `r20200101, `r20220518`, etc.) 3. Click "Publish Release" 4. Wait a few minutes; 5. Monitor the progress at https://github.com/spinalcordtoolbox/data-${dataset_name}/actions/workflows/release.yml From c521774d0a46d0caae330ecbf8c79336d5071b0c Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:14:37 -0400 Subject: [PATCH 23/48] `README.md`: Fixup `data-${dataset_name}` instances --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7b4c74..7b85117 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# `${dataset_name}` +# `data-${dataset_name}` Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). @@ -35,7 +35,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). # 4. Commit the changes git add -u - git commit -m "Setting ${dataset_name} package metadata" + git commit -m "Setting data-${dataset_name} package metadata" git push ``` From 19f2765d8c57c06f28c73269291671b2db3f83bb Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:17:08 -0400 Subject: [PATCH 24/48] `README.md`: Use `perl -pi -e` in README.md, too --- README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7b85117..8d3acd1 100644 --- a/README.md +++ b/README.md @@ -24,16 +24,11 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). # 1. Rename the repo's `dataset` folder to match the repo name git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} - # 2. Edit the `README.md` file to: - # - Find and replace ${dataset_name} with the name you picked - vi README.md - - # 3. Edit the `setup.py` file to: - # - set `name=` to `name=spinalcordtoolbox-data-${dataset_name}` - # - set `url=` to `url=https://github.com/spinalcordtoolbox/data-${dataset_name}` - vi setup.py + # 2. Find and replace ${dataset_name} with the name you picked (e.g. `supercats`) + perl -pi -e 's/\${dataset_name}/supercats/' README.md + perl -pi -e 's/\${dataset_name}/supercats/' setup.py - # 4. Commit the changes + # 3. Commit the changes git add -u git commit -m "Setting data-${dataset_name} package metadata" git push From e74cf6ac2a0d559b44564a9f53a189487425068e Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:19:25 -0400 Subject: [PATCH 25/48] `README.md`: Swap steps 1 and 2 in metadata This allows the find and replace step to update the following git step --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8d3acd1..58da757 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 3. Fill with initial metadata ```bash - # 1. Rename the repo's `dataset` folder to match the repo name - git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} - - # 2. Find and replace ${dataset_name} with the name you picked (e.g. `supercats`) + # 1. Find and replace ${dataset_name} with the name you picked (e.g. `supercats`) perl -pi -e 's/\${dataset_name}/supercats/' README.md perl -pi -e 's/\${dataset_name}/supercats/' setup.py + # 2. Rename the repo's `dataset` folder to match the repo name + git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} + # 3. Commit the changes git add -u git commit -m "Setting data-${dataset_name} package metadata" From 4a09c4d5cc3011281376488030c5e1d9906bcdd4 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:21:43 -0400 Subject: [PATCH 26/48] `README.md`: Fix typos with `$dataset-name`/`$dataset_name` --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 58da757..3b14238 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,12 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 3. Fill with initial metadata ```bash - # 1. Find and replace ${dataset_name} with the name you picked (e.g. `supercats`) + # 1. Find and replace ${dataset-name} with the name you picked (e.g. `supercats`) perl -pi -e 's/\${dataset_name}/supercats/' README.md perl -pi -e 's/\${dataset_name}/supercats/' setup.py # 2. Rename the repo's `dataset` folder to match the repo name - git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset-name} + git mv src/spinalcordtoolbox/data/dataset src/spinalcordtoolbox/data/${dataset_name} # 3. Commit the changes git add -u From 2afa7c3b3c81a1218f04095777ea4408040ff70f Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:45:22 -0400 Subject: [PATCH 27/48] `README.md`: Improve readability of the `Troubleshooting` section --- README.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3b14238..c8891ea 100644 --- a/README.md +++ b/README.md @@ -72,14 +72,32 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 6. The release should appear on https://github.com/spinalcordtoolbox/data-${dataset_name}/releases with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. -## Troubleshooting -You can test the repo locally with +## How to test this repo locally -``` -pip install build && - python -m build --wheel --sdist && - pip install dist/*.whl +If you've encountered an error during the GitHub Actions workflow, you can use the following steps to test the repo locally: + +```bash +# Create a virtual environment +python -m venv venv +source venv/bin/activate + +# Install the `build` package (which is necessary to build pip packages) +pip install build + +# Build the pip package, which will generate: +# 1. A build folder (containing a copy of the files to be packaged) +# 2. A packaged wheel (stored in ./dist/${package-name}.whl) +# 3. A packaged source distribution (stored in ./dist/${package-name}.tar.gz) +# 4. Package metadata (stored in ./src/${package-name}.egg-info +python -m build --wheel --sdist + +# Install the generated wheel. +# As a result, the contents of ./src/ will be installed to: +# ./venv/lib/python3.7/site-packages/spinalcordtoolbox/data/${dataset_name} +# This means that the installed data package will coexist alongside the +# installed `spinalcordtoolbox` pip package. +pip install dist/*.whl ``` -This should give you enough clues hopefully to track down any problems. +This should give you enough clues to hopefully to track down any problems. From eaea4c2d4bd8dfbda3dda86ea21cd0f34c843ae0 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Tue, 24 May 2022 10:47:28 -0400 Subject: [PATCH 28/48] `README.md`: Add missing `.git` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c8891ea..231282e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 2. Download the new repo ```bash - git clone git@github.com:spinalcordtoolbox/data-${dataset_name} + git clone git@github.com:spinalcordtoolbox/data-${dataset_name}.git cd data-${dataset_name} ``` From 525ea88e4b9733b1565b52b45ae0b1312800e7ce Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 11:38:32 -0400 Subject: [PATCH 29/48] `release.yml`: Remove "parallelized" TODO Answer to TODO: No, steps cannot be parallelized. However, *jobs* can run in parallel. But, to do so would require uploading files as artifacts, then spinning up entirely new VM instances, then downloading the artifacts. And, at that point, the setup of these VMs would probably take longer and use more resources than just running the steps sequentially. --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e6b1fa3..547fca2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,6 @@ jobs: - name: Build run: | python -m build --wheel --sdist - ### TODO: can the uploads be parallelized? - name: Publish to Github uses: softprops/action-gh-release@v1 with: From fe246fc8a2dc9a527673e4ec53f22a306e892bc9 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 12:01:04 -0400 Subject: [PATCH 30/48] `release.yml`: Update PYPI_API_TOKEN The existing values were copied over from ivadomed. Here, in SCT, I've added a temporary new token (until we can sort out NeuroPoly's PyPI accounts). --- .github/workflows/release.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 547fca2..0d50f87 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,8 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ - #password: ${{ secrets.PYPI_PASSWORD }} - # DEBUG: - password: ${{ secrets.TEST_PYPI_API_TOKEN }} + # TODO: Replace this personal API token with one that: + # - Points at pypi.org, not test.pypi.org + # - Is generated by the NeuroPoly PyPI account (https://github.com/neuropoly/onboarding/issues/140) + password: ${{ secrets.TEST_PYPI_API_TOKEN_JOSHUACWNEWTON }} repository_url: https://test.pypi.org/legacy/ From 65021c26ef16acb24d2d385859a252ff4955925d Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 12:02:35 -0400 Subject: [PATCH 31/48] `release.yml`: Test publishing on PRs for `ng/template` --- .github/workflows/release.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0d50f87..88ca85d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,10 @@ on: version: description: 'Version (e.g. 2.0.3)' required: true + # test publishing just for this PR + pull_request: + branches: + - ng/template jobs: publish: @@ -30,7 +34,7 @@ jobs: with: files: 'dist/*' fail_on_unmatched_files: true - tag_name: ${{ github.event.inputs.version }} # in the workflow_dispatch case, make a new tag from the given input; in the published release case, this will be empty and will fall back to updating that release. + tag_name: 2.0.3 # ${{ github.event.inputs.version }} # in the workflow_dispatch case, make a new tag from the given input; in the published release case, this will be empty and will fall back to updating that release. env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish to PyPI From dfb1e5c0470cafd8526d862c16dd7a5dce486644 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 12:04:42 -0400 Subject: [PATCH 32/48] `release.yml`: Remove `branches: ng/template` from test I think this is meant to specify the target branch (i.e. `trunk`, not the branch used for the PR.) --- .github/workflows/release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 88ca85d..04fee2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,8 +12,6 @@ on: required: true # test publishing just for this PR pull_request: - branches: - - ng/template jobs: publish: From 0053d783027629868f944dec388126802e72c76d Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 12:12:12 -0400 Subject: [PATCH 33/48] `release.yml`: Add missing perl -pi -e --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04fee2c..90fee3e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,6 +24,9 @@ jobs: run: | python -m pip install --upgrade pip pip install build + - name: Replace dummy values in `setup.py` (only for `data-template`) + if: ${{ github.event.repository.name }} == "data-template" + run: perl -pi -e 's/\${dataset_name}/template/' setup.py - name: Build run: | python -m build --wheel --sdist From 73f9b339b34197eed87796ffd0e67123bab3235c Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 12:31:49 -0400 Subject: [PATCH 34/48] `release.yml`: Try tagging release prior to build --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90fee3e..4a48f36 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Tag current commit + uses: rickstaa/action-create-tag@v1 + with: + tag: 2.0.3 + message: "Test tag creation prior to build" - name: Set up Python uses: actions/setup-python@v1 - name: Build tools From 9d6f082b5e876303aeadfdc4faea1c5901941222 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 14:17:24 -0400 Subject: [PATCH 35/48] Revert "`release.yml`: Try tagging release prior to build" This reverts commit 73f9b339b34197eed87796ffd0e67123bab3235c. --- .github/workflows/release.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a48f36..90fee3e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,11 +18,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Tag current commit - uses: rickstaa/action-create-tag@v1 - with: - tag: 2.0.3 - message: "Test tag creation prior to build" - name: Set up Python uses: actions/setup-python@v1 - name: Build tools From 7394563013ef93f838d40e1addf545b004e3de89 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 14:25:11 -0400 Subject: [PATCH 36/48] `release.yml`: Explicitly set `version=` instead of using setuptools_scm --- .github/workflows/release.yml | 3 +++ setup.py | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90fee3e..46b15fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,9 @@ jobs: - name: Replace dummy values in `setup.py` (only for `data-template`) if: ${{ github.event.repository.name }} == "data-template" run: perl -pi -e 's/\${dataset_name}/template/' setup.py + - name: Replace version string in `setup.py` + # TODO: Replace 2.0.3 with ${{ github.event.inputs.version }} + run: perl -pi -e 's/version="dev"/version="2.0.3"/' setup.py - name: Build run: | python -m build --wheel --sdist diff --git a/setup.py b/setup.py index 63a2a48..1578777 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,7 @@ setup( name='spinalcordtoolbox-data-${dataset_name}', + version="dev", description='Part of https://github.com/neuropoly/spinalcordtoolbox', long_description=(here / 'README.md').read_text(encoding='utf-8'), long_description_content_type='text/markdown', @@ -28,14 +29,9 @@ # with setuptools_scm, means it includes non-python files if they're under git include_package_data=True, - # with setuptools_scm, get the version out of the most recent git tag. - # the tags must be formatted as semver. - use_scm_version=True, - # pyproject.toml::build-system.requires is supposed to supersede this, but it's still very new so we duplicate it. setup_requires=[ 'setuptools', - 'setuptools_scm[toml]', 'wheel', ], From 804b5104e56347ff1cd7f35fdde809824f6b1cdb Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 14:41:16 -0400 Subject: [PATCH 37/48] `release.yml`: Make `VERSION_NUMBER` more explicit * Stop repeating version number * Use || to make fallback case more explicit --- .github/workflows/release.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 46b15fd..98fca66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,11 @@ on: # test publishing just for this PR pull_request: + # In the workflow_dispatch case, make a new tag from the given input; in the published release case, + # the first variable will be empty, and so this will fall back to using the release's tag. +env: + VERSION_NUMBER: ${{ github.event.inputs.version || github.event.release.tag_name || '2.0.4' }} # TODO: Remove 2.0.4 + jobs: publish: runs-on: ubuntu-latest @@ -28,8 +33,7 @@ jobs: if: ${{ github.event.repository.name }} == "data-template" run: perl -pi -e 's/\${dataset_name}/template/' setup.py - name: Replace version string in `setup.py` - # TODO: Replace 2.0.3 with ${{ github.event.inputs.version }} - run: perl -pi -e 's/version="dev"/version="2.0.3"/' setup.py + run: perl -pi -e 's/version="dev"/version="${{ env.VERSION_NUMBER }}"/' setup.py - name: Build run: | python -m build --wheel --sdist @@ -38,7 +42,7 @@ jobs: with: files: 'dist/*' fail_on_unmatched_files: true - tag_name: 2.0.3 # ${{ github.event.inputs.version }} # in the workflow_dispatch case, make a new tag from the given input; in the published release case, this will be empty and will fall back to updating that release. + tag_name: ${{ env.VERSION_NUMBER }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish to PyPI From 7ed3fe376d1a60ffd796f772ba6c9598213008ff Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 15:03:00 -0400 Subject: [PATCH 38/48] `release.yml`: Drop `workflow_dispatch` It's more straightforward to just have a single "correct" way of doing things, and the release UI has a lot of other nice usage benefits, too (e.g. checking if you're duplicating a tag name). --- .github/workflows/release.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 98fca66..bf5c428 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,19 +4,11 @@ on: # publish from the Releases page: release: types: [published] - # publish from the Actions page: - workflow_dispatch: - inputs: - version: - description: 'Version (e.g. 2.0.3)' - required: true # test publishing just for this PR pull_request: - # In the workflow_dispatch case, make a new tag from the given input; in the published release case, - # the first variable will be empty, and so this will fall back to using the release's tag. env: - VERSION_NUMBER: ${{ github.event.inputs.version || github.event.release.tag_name || '2.0.4' }} # TODO: Remove 2.0.4 + VERSION_NUMBER: ${{ github.event.release.tag_name || '2.0.5' }} # TODO: Remove 2.0.5 jobs: publish: From 3f67509075a1405e892c81b844593757126a26e0 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 15:10:25 -0400 Subject: [PATCH 39/48] `release.yml`: Drop test build workflow, and use only 1 workflow The `startsWith(github.ref, 'refs/tags/')` pattern is recommended by: * https://github.com/softprops/action-gh-release * https://github.com/pypa/gh-action-pypi-publish --- .github/workflows/build.yml | 25 ------------------------- .github/workflows/release.yml | 6 ++++-- 2 files changed, 4 insertions(+), 27 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 2bf3844..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Test the Build - -on: - # test on PRs and double-test on merges to master, or manually. - pull_request: - push: - branches: - - master - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v1 - - name: Build tools - run: | - python -m pip install --upgrade pip - pip install build - - name: Build - run: | - perl -pi -e 's/\${dataset_name}/sample-dataset/' setup.py - python -m build --wheel --sdist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf5c428..1c3780d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,11 +4,11 @@ on: # publish from the Releases page: release: types: [published] - # test publishing just for this PR + # test building only on PRs pull_request: env: - VERSION_NUMBER: ${{ github.event.release.tag_name || '2.0.5' }} # TODO: Remove 2.0.5 + VERSION_NUMBER: ${{ github.event.release.tag_name }} jobs: publish: @@ -30,6 +30,7 @@ jobs: run: | python -m build --wheel --sdist - name: Publish to Github + if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: files: 'dist/*' @@ -38,6 +39,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish to PyPI + if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ From 2fb6da077398aab5b1aeef0104b5548659d29ef2 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 20:31:04 -0400 Subject: [PATCH 40/48] README.md: Fix typo (missing `) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 231282e..9e0b109 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 2. Go to https://github.com/spinalcordtoolbox/data-${dataset_name}/releases 1. Click "Draft Release" - 2. Fill in a version tag. We use date-based release names (e.g. `r20200101, `r20220518`, etc.) + 2. Fill in a version tag. We use date-based release names (e.g. `r20200101`, `r20220518`, etc.) 3. Click "Publish Release" 4. Wait a few minutes; 5. Monitor the progress at https://github.com/spinalcordtoolbox/data-${dataset_name}/actions/workflows/release.yml From 12a97d227406b5afcf8fc6c572bd76fa1c456ef3 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 20:36:21 -0400 Subject: [PATCH 41/48] `release.yml`: Test version tag `r20220603` --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c3780d..88bc118 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: pull_request: env: - VERSION_NUMBER: ${{ github.event.release.tag_name }} + VERSION_NUMBER: ${{ github.event.release.tag_name || r20220603 }} jobs: publish: @@ -30,7 +30,7 @@ jobs: run: | python -m build --wheel --sdist - name: Publish to Github - if: startsWith(github.ref, 'refs/tags/') + # if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: files: 'dist/*' @@ -39,7 +39,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish to PyPI - if: startsWith(github.ref, 'refs/tags/') + # if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ From ffeb99724b1f53b385e33421841f17d5e4059800 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Fri, 3 Jun 2022 20:36:45 -0400 Subject: [PATCH 42/48] `release.yml`: Test version tag `2022.06.03` --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 88bc118..f8baeb7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: pull_request: env: - VERSION_NUMBER: ${{ github.event.release.tag_name || r20220603 }} + VERSION_NUMBER: ${{ github.event.release.tag_name || 2022.06.03 }} jobs: publish: From 07ca8563924bdecb6ba6ab1e88363a645ecb0c85 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 15:59:55 -0400 Subject: [PATCH 43/48] `release.yml`: Use quotes for version string --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8baeb7..32b2b92 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: pull_request: env: - VERSION_NUMBER: ${{ github.event.release.tag_name || 2022.06.03 }} + VERSION_NUMBER: ${{ github.event.release.tag_name || "2022.06.03" }} jobs: publish: From eb91ae066ed12586289a028ae669e9fbaa19ddef Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 16:02:13 -0400 Subject: [PATCH 44/48] `release.yml`: Temporarily stop using `||` I just want to see how pip will use date-based versions! GitHub Actions, pls stop being so finicky. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 32b2b92..1483466 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: pull_request: env: - VERSION_NUMBER: ${{ github.event.release.tag_name || "2022.06.03" }} + VERSION_NUMBER: "2022.06.03" # ${{ github.event.release.tag_name }} jobs: publish: From a383f68817753ffda7b32e2a76abc4686eca0b05 Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 16:06:06 -0400 Subject: [PATCH 45/48] `README.md`: Fix typo (missing `) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e0b109..f87fecf 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 5. Remove the "Using this template" section from `README.md`, since it is now no longer needed. ```bash - # Delete the 'Using the Template' section from `README.md + # Delete the 'Using the Template' section from `README.md` vi README.md # Add, commit, and push the changes From 1322a884531fdbc3464b348db00955aa8a03b09f Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 16:08:34 -0400 Subject: [PATCH 46/48] `release.yml`: Revert back to using release tag --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1483466..8585125 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: pull_request: env: - VERSION_NUMBER: "2022.06.03" # ${{ github.event.release.tag_name }} + VERSION_NUMBER: ${{ github.event.release.tag_name }} jobs: publish: From 6aae1ca46a251843cc2458ebfb7e8f0220da3c0e Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 16:09:07 -0400 Subject: [PATCH 47/48] `release.yml`: Re-enable 'publish' if statements --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8585125..1c3780d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: run: | python -m build --wheel --sdist - name: Publish to Github - # if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: files: 'dist/*' @@ -39,7 +39,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Publish to PyPI - # if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ From 3746beac9fe94adb0f26df2d836984c42572f20c Mon Sep 17 00:00:00 2001 From: Joshua Newton Date: Mon, 6 Jun 2022 16:14:08 -0400 Subject: [PATCH 48/48] `README.md`: Clarify date-based version numbering --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f87fecf..0396b23 100644 --- a/README.md +++ b/README.md @@ -63,14 +63,16 @@ Part of [`spinalcordtoolbox`](https://github.com/spinalcordtoolbox). 1. Edit and commit the files in `src/spinalcordtoolbox/data/` 2. Go to https://github.com/spinalcordtoolbox/data-${dataset_name}/releases +3. Click "Draft Release" +4. Fill in a version tag. We recommend using date-based releases (e.g. `2020.1.1`, `2022.5.18`, etc.). - 1. Click "Draft Release" - 2. Fill in a version tag. We use date-based release names (e.g. `r20200101`, `r20220518`, etc.) - 3. Click "Publish Release" - 4. Wait a few minutes; - 5. Monitor the progress at https://github.com/spinalcordtoolbox/data-${dataset_name}/actions/workflows/release.yml - 6. The release should appear on https://github.com/spinalcordtoolbox/data-${dataset_name}/releases - with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. + **Note**: The version must be formatted in a way that complies with [PEP 440](https://peps.python.org/pep-0440/). The easiest way to do this is to use a numerical version number in the form of X.Y.Z, but there is [some flexibility](https://peps.python.org/pep-0440/#final-releases) here. + +5. Click "Publish Release" +6. Wait a few minutes; +7. Monitor the progress at https://github.com/spinalcordtoolbox/data-${dataset_name}/actions/workflows/release.yml +8. The release should appear on https://github.com/spinalcordtoolbox/data-${dataset_name}/releases + with the .tar.gz (sdist) and .whl (wheel) formats attached momentarily. ## How to test this repo locally