fabrictestbed_extensions 1.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. fabrictestbed_extensions-1.9.0/.github/workflows/build.yml +49 -0
  2. fabrictestbed_extensions-1.9.0/.github/workflows/check_docstring_coverage.yml +42 -0
  3. fabrictestbed_extensions-1.9.0/.github/workflows/check_format.yml +50 -0
  4. fabrictestbed_extensions-1.9.0/.github/workflows/check_signed_commits.yml +32 -0
  5. fabrictestbed_extensions-1.9.0/.github/workflows/publish.yml +68 -0
  6. fabrictestbed_extensions-1.9.0/.github/workflows/test.yml +85 -0
  7. fabrictestbed_extensions-1.9.0/.gitignore +133 -0
  8. fabrictestbed_extensions-1.9.0/.readthedocs.yaml +25 -0
  9. fabrictestbed_extensions-1.9.0/CHANGELOG.md +323 -0
  10. fabrictestbed_extensions-1.9.0/CONTRIBUTING.md +170 -0
  11. fabrictestbed_extensions-1.9.0/LICENSE +21 -0
  12. fabrictestbed_extensions-1.9.0/PKG-INFO +134 -0
  13. fabrictestbed_extensions-1.9.0/README.md +93 -0
  14. fabrictestbed_extensions-1.9.0/docs/Makefile +20 -0
  15. fabrictestbed_extensions-1.9.0/docs/make.bat +35 -0
  16. fabrictestbed_extensions-1.9.0/docs/source/_static/.empty +0 -0
  17. fabrictestbed_extensions-1.9.0/docs/source/artifact.rst +10 -0
  18. fabrictestbed_extensions-1.9.0/docs/source/artifact_manager_ui.rst +10 -0
  19. fabrictestbed_extensions-1.9.0/docs/source/component.rst +10 -0
  20. fabrictestbed_extensions-1.9.0/docs/source/conf.py +68 -0
  21. fabrictestbed_extensions-1.9.0/docs/source/fablib.rst +10 -0
  22. fabrictestbed_extensions-1.9.0/docs/source/facility_port.rst +10 -0
  23. fabrictestbed_extensions-1.9.0/docs/source/index.rst +148 -0
  24. fabrictestbed_extensions-1.9.0/docs/source/interface.rst +9 -0
  25. fabrictestbed_extensions-1.9.0/docs/source/network_service.rst +10 -0
  26. fabrictestbed_extensions-1.9.0/docs/source/node.rst +10 -0
  27. fabrictestbed_extensions-1.9.0/docs/source/resources.rst +20 -0
  28. fabrictestbed_extensions-1.9.0/docs/source/site.rst +17 -0
  29. fabrictestbed_extensions-1.9.0/docs/source/slice.rst +9 -0
  30. fabrictestbed_extensions-1.9.0/docs/source/switch.rst +10 -0
  31. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/__init__.py +28 -0
  32. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/editors/__init__.py +1 -0
  33. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/editors/abc_topology_editor.py +523 -0
  34. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/editors/cytoscape_topology_editor.py +187 -0
  35. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/editors/geo_topology_editor.py +1909 -0
  36. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/__init__.py +0 -0
  37. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/artifact.py +107 -0
  38. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/attestable_switch.py +812 -0
  39. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/component.py +768 -0
  40. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/config/__init__.py +0 -0
  41. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/config/config.py +925 -0
  42. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/config/fabric_rc +23 -0
  43. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/config/fabric_rc.yml +46 -0
  44. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/constants.py +270 -0
  45. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/fablib.py +3250 -0
  46. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/facility_port.py +302 -0
  47. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/interface.py +1433 -0
  48. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/network_service.py +1567 -0
  49. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/node.py +3887 -0
  50. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/resources.py +1124 -0
  51. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/site.py +1238 -0
  52. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/slice.py +3324 -0
  53. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/fablib/switch.py +397 -0
  54. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/images/__init__.py +1 -0
  55. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/images/fabric_logo.png +0 -0
  56. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/images/server.png +0 -0
  57. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/images/slice_rack.png +0 -0
  58. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/ui/__init__.py +0 -0
  59. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/ui/artifact_manager_ui.py +275 -0
  60. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/utils/__init__.py +1 -0
  61. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/utils/abc_utils.py +84 -0
  62. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/utils/node.py +89 -0
  63. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/utils/slice.py +234 -0
  64. fabrictestbed_extensions-1.9.0/fabrictestbed_extensions/utils/utils.py +89 -0
  65. fabrictestbed_extensions-1.9.0/pyproject.toml +89 -0
  66. fabrictestbed_extensions-1.9.0/tests/benchmarks/gpu_tesla_t4_benchmark.py +325 -0
  67. fabrictestbed_extensions-1.9.0/tests/benchmarks/link_benchmark.py +518 -0
  68. fabrictestbed_extensions-1.9.0/tests/benchmarks/local_network_benchmark.py +527 -0
  69. fabrictestbed_extensions-1.9.0/tests/benchmarks/network_benchmark_tests.py +1204 -0
  70. fabrictestbed_extensions-1.9.0/tests/benchmarks/nvme_benchmark.py +266 -0
  71. fabrictestbed_extensions-1.9.0/tests/integration/abc_test.py +375 -0
  72. fabrictestbed_extensions-1.9.0/tests/integration/component_tests.py +833 -0
  73. fabrictestbed_extensions-1.9.0/tests/integration/test_L2_reconfig_post_reboot.py +149 -0
  74. fabrictestbed_extensions-1.9.0/tests/integration/test_bastion_ssh.py +53 -0
  75. fabrictestbed_extensions-1.9.0/tests/integration/test_fablib_node.py +65 -0
  76. fabrictestbed_extensions-1.9.0/tests/integration/test_fabnetv4_ext.py +141 -0
  77. fabrictestbed_extensions-1.9.0/tests/integration/test_hello_fabric.py +70 -0
  78. fabrictestbed_extensions-1.9.0/tests/integration/test_list_resources.py +47 -0
  79. fabrictestbed_extensions-1.9.0/tests/integration/test_modify.py +177 -0
  80. fabrictestbed_extensions-1.9.0/tests/unit/__init__.py +1 -0
  81. fabrictestbed_extensions-1.9.0/tests/unit/data/dummy-token.json +5 -0
  82. fabrictestbed_extensions-1.9.0/tests/unit/data/dummy_fabric_rc +0 -0
  83. fabrictestbed_extensions-1.9.0/tests/unit/test_basic.py +228 -0
  84. fabrictestbed_extensions-1.9.0/tox.ini +43 -0
@@ -0,0 +1,49 @@
1
+ # Build the package
2
+
3
+ name: Build
4
+
5
+ on:
6
+ push:
7
+ branches:
8
+ - "main"
9
+ pull_request:
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+
17
+ build:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Check out sources
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.9"
27
+ cache: 'pip' # cache pip dependencies
28
+ cache-dependency-path: pyproject.toml
29
+
30
+ - name: Install dependencies
31
+ run: |
32
+ python -m pip install --upgrade pip
33
+ python -m pip install flit
34
+
35
+ - name: Build the package
36
+ run: |
37
+ python -m flit build
38
+
39
+ - name: Try installing the package
40
+ run: |
41
+ python -m pip install dist/fabrictestbed_extensions-*.whl
42
+
43
+ # See https://github.com/actions/upload-artifact
44
+ - name: Upload build artifacts
45
+ uses: actions/upload-artifact@v4
46
+ with:
47
+ name: packages
48
+ path: dist/
49
+ if-no-files-found: error
@@ -0,0 +1,42 @@
1
+ # A check to ensure that our docstring coverage remains pretty good.
2
+ #
3
+ # We use interrogate (https://interrogate.readthedocs.io/) to check
4
+ # docstring coverage. Settings are under `[tool.interrogate]` section
5
+ # of the pyproject.toml file in the top-level directory.
6
+
7
+ name: Check docstring coverage
8
+
9
+ on:
10
+ push:
11
+ branches:
12
+ - "main"
13
+ pull_request:
14
+ workflow_dispatch:
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+
21
+ checks:
22
+ runs-on: ubuntu-latest
23
+
24
+ steps:
25
+ - name: Check out sources
26
+ uses: actions/checkout@v4
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v5
30
+ with:
31
+ python-version: "3.x"
32
+ cache: 'pip' # cache pip dependencies
33
+ cache-dependency-path: pyproject.toml
34
+
35
+ - name: Install interrogate
36
+ run: |
37
+ python -m pip install --upgrade pip
38
+ python -m pip install interrogate==1.7.0
39
+
40
+ - name: Check docstring coverage with interrogate
41
+ run: |
42
+ python -m interrogate -vv fabrictestbed_extensions
@@ -0,0 +1,50 @@
1
+ # Run some code checks with GitHub Actions.
2
+
3
+ name: Code formatting checks
4
+
5
+ on:
6
+ push:
7
+ branches:
8
+ - "main"
9
+ pull_request:
10
+ workflow_dispatch:
11
+
12
+ jobs:
13
+
14
+ checks:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Check out sources
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0 # since we need to diff against origin/main.
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.x"
26
+ cache: 'pip' # cache pip dependencies
27
+ cache-dependency-path: pyproject.toml
28
+
29
+ - name: Install dependencies
30
+ run: |
31
+ python -m pip install --upgrade pip
32
+ python -m pip install black==24.* isort==5.*
33
+
34
+ - name: Run "black --check"
35
+ run: |
36
+ python -m black --check .
37
+
38
+ - name: Run "isort --check"
39
+ run: |
40
+ python -m isort --profile black --check .
41
+
42
+ # Remind PR authors to update CHANGELOG.md
43
+ - name: Check that Changelog has been updated
44
+ if: github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'no changelog')
45
+ run: |
46
+ # `git diff --exit-code` exits with 1 if there were
47
+ # differences and 0 means no differences. Here we negate
48
+ # that, because we want to fail if changelog has not been
49
+ # updated.
50
+ ! git diff --exit-code "origin/${GITHUB_BASE_REF}" -- CHANGELOG.md
@@ -0,0 +1,32 @@
1
+ # FABRIC policy requires that code commits are signed with the
2
+ # committer's GPG key.
3
+ #
4
+ # https://github.com/marketplace/actions/check-signed-commits-in-pr
5
+ # runs on pull_request_target events.
6
+
7
+ name: Check signed commits in PR
8
+ on: pull_request_target
9
+
10
+ jobs:
11
+ check-signed-commits:
12
+ name: Check signed commits in PR
13
+ runs-on: ubuntu-latest
14
+
15
+ permissions:
16
+ contents: read
17
+ # Allow 1Password/check-signed-commits-action to leave comments
18
+ # on pull requests.
19
+ pull-requests: write
20
+
21
+ steps:
22
+ - name: Check signed commits in PR
23
+ uses: 1Password/check-signed-commits-action@v1
24
+ with:
25
+ comment: |
26
+ ⚠️ This PR contains unsigned commits. To get your PR merged, please sign those commits (`git rebase --exec 'git commit -S --amend --no-edit -n' @{upstream}`) and force push them to this branch (`git push --force-with-lease`).
27
+
28
+ If you're new to commit signing, follow the steps below to set up commit signing with `gpg`:
29
+
30
+ 1. [Generate a GPG key](https://docs.github.com/en/authentication/managing-commit-signature-verification/generating-a-new-gpg-key)
31
+ 2. [Add the GPG key to your GitHub account](https://docs.github.com/en/authentication/managing-commit-signature-verification/adding-a-gpg-key-to-your-github-account)
32
+ 3. [Configure `git` to use your GPG key for commit signing](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key#telling-git-about-your-gpg-key)
@@ -0,0 +1,68 @@
1
+ # Publish the package on PyPI.
2
+ #
3
+ # https://pypi.org/project/fabrictestbed-extensions/ is configured
4
+ # with GitHub as "trusted publisher", meaning, there is no exchange of
5
+ # a long-term password or token between GitHub and PyPI. See
6
+ # documentation here: https://docs.pypi.org/trusted-publishers/
7
+
8
+ name: Publish
9
+
10
+ # This workflow will be triggered when a tag with prefix "rel" is
11
+ # pushed to the repository.
12
+ on:
13
+ push:
14
+ tags:
15
+ - "rel*"
16
+
17
+ jobs:
18
+ tests:
19
+ uses: ./.github/workflows/test.yml
20
+
21
+ pypi-publish:
22
+ name: Publish packages on PyPI
23
+ runs-on: ubuntu-latest
24
+ needs:
25
+ - tests
26
+
27
+ environment:
28
+ name: publish
29
+ url: https://pypi.org/p/fabrictestbed-extensions
30
+
31
+ # See https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
32
+ permissions:
33
+ # This permission is mandatory for trusted publishing.
34
+ id-token: write
35
+ # This permission allows the action to create a release.
36
+ contents: write
37
+
38
+ steps:
39
+ - name: Check out sources
40
+ uses: actions/checkout@v4
41
+
42
+ - name: Set up Python
43
+ uses: actions/setup-python@v5
44
+ with:
45
+ python-version: "3.9"
46
+ cache: 'pip'
47
+ cache-dependency-path: pyproject.toml
48
+
49
+ - name: Build package
50
+ run: |
51
+ python -m pip install --upgrade pip
52
+ python -m pip install flit
53
+ python -m flit build
54
+
55
+ # See https://github.com/marketplace/actions/pypi-publish.
56
+ - name: Publish package distributions to PyPI
57
+ uses: pypa/gh-action-pypi-publish@release/v1
58
+
59
+ # GitHub CLI (aka "gh" command) is pre-installed in hosted runners.
60
+ # See https://docs.github.com/en/actions/using-workflows/using-github-cli-in-workflows
61
+ - name: Create a GitHub release
62
+ run: |
63
+ RELEASE_TAG=$GITHUB_REF_NAME
64
+ RELEASE_TITLE="Release $(echo "$RELEASE_TAG" | sed 's/^rel//g')"
65
+ echo "RELEASE_TAG=${RELEASE_TAG}, RELEASE_TITLE=${RELEASE_TITLE}"
66
+ gh release create ${RELEASE_TAG} --title="${RELEASE_TITLE}" --generate-notes
67
+ env:
68
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,85 @@
1
+ # This workflow will install Python dependencies, run tests and lint
2
+ # with a variety of Python versions For more information see:
3
+ # https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
4
+
5
+ name: Test
6
+
7
+ on:
8
+ push:
9
+ branches:
10
+ - "main"
11
+ pull_request:
12
+ workflow_dispatch:
13
+ workflow_call:
14
+
15
+ jobs:
16
+ test:
17
+
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ python-version:
22
+ - "3.9"
23
+ - "3.10"
24
+ - "3.11"
25
+ os:
26
+ # See https://github.com/actions/runner-images for available
27
+ # runners.
28
+ - "ubuntu-22.04"
29
+ - "windows-2022"
30
+ - "macos-13" # Intel
31
+ - "macos-14" # ARM
32
+
33
+ runs-on: ${{ matrix.os }}
34
+
35
+ steps:
36
+ - name: Check out sources
37
+ uses: actions/checkout@v4
38
+
39
+ - name: Set up Python ${{ matrix.python-version }}
40
+ uses: actions/setup-python@v5
41
+ with:
42
+ python-version: ${{ matrix.python-version }}
43
+ cache: 'pip' # caching pip dependencies
44
+ cache-dependency-path: pyproject.toml
45
+
46
+ - name: Install dependencies
47
+ run: |
48
+ python -m pip install --upgrade pip
49
+ python -m pip install wheel
50
+
51
+ # # TODO: we can't use flake8 right now, because there isn't a
52
+ # # version of flake8 that can use pycodestyle==2.6.0, and fim has
53
+ # # pinned pycodestyle==2.6.0.
54
+ # - name: Lint with flake8
55
+ # run: |
56
+ # # stop the build if there are Python syntax errors or undefined names
57
+ # python -m flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
58
+ # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
59
+ # python -m flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
60
+
61
+ - name: Install and test with pytest
62
+ run: |
63
+ python -m pip install .[test]
64
+ python -m coverage run -m pytest
65
+ python -m coverage report
66
+ # Generate LCOV format coverage data for coveralls.
67
+ python -m coverage lcov -o coverage.lcov
68
+
69
+ - name: Send coverage data to coveralls.io
70
+ uses: coverallsapp/github-action@v2
71
+ with:
72
+ flag-name: run-${{ join(matrix.*, '-') }}
73
+ file: coverage.lcov
74
+ parallel: true
75
+
76
+ finalize:
77
+ name: finalize
78
+ needs: test
79
+ runs-on: ubuntu-latest
80
+ if: ${{ always() }}
81
+ steps:
82
+ - name: Indicate completion to coveralls.io
83
+ uses: coverallsapp/github-action@v2
84
+ with:
85
+ parallel-finished: true
@@ -0,0 +1,133 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py,cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ target/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ .python-version
86
+
87
+ # pipenv
88
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
90
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
91
+ # install all needed dependencies.
92
+ #Pipfile.lock
93
+
94
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95
+ __pypackages__/
96
+
97
+ # Celery stuff
98
+ celerybeat-schedule
99
+ celerybeat.pid
100
+
101
+ # SageMath parsed files
102
+ *.sage.py
103
+
104
+ # Environments
105
+ .env
106
+ .venv*
107
+ env/
108
+ venv*
109
+ ENV/
110
+ env.bak/
111
+ venv.bak/
112
+
113
+ # Spyder project settings
114
+ .spyderproject
115
+ .spyproject
116
+
117
+ # Rope project settings
118
+ .ropeproject
119
+
120
+ # mkdocs documentation
121
+ /site
122
+
123
+ # mypy
124
+ .mypy_cache/
125
+ .dmypy.json
126
+ dmypy.json
127
+
128
+ # Pyre type checker
129
+ .pyre/
130
+ .idea/
131
+
132
+ # Created by tox.
133
+ /_trial_temp/
@@ -0,0 +1,25 @@
1
+ # Configuration for readthedocs.org.
2
+ # See https://docs.readthedocs.io/en/latest/config-file/v2.html
3
+
4
+ version: 2
5
+
6
+ # readthedocs.org uses Python 3.7 by default; fablib has to use Python
7
+ # 3.9 or greater. This incantation seems to work.
8
+ build:
9
+ os: ubuntu-20.04
10
+ tools:
11
+ python: "3.9"
12
+
13
+ # Tell RTD location of our Sphinx configuration. Seems to work
14
+ # without this too, although default is docs/conf.py.
15
+ sphinx:
16
+ configuration: docs/source/conf.py
17
+
18
+ # To be able to build API documentation, we need to install both docs
19
+ # requirements and package requirements, it seems.
20
+ python:
21
+ install:
22
+ - method: pip
23
+ path: .
24
+ extra_requirements:
25
+ - doc