mirror of
https://github.com/theupdateframework/python-tuf
synced 2026-05-24 10:08:28 +00:00
Merge pull request #1493 from jku/updated-commands-python3
updated docs and comments
This commit is contained in:
commit
04bbc03b9f
17 changed files with 64 additions and 89 deletions
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
|
|
@ -61,8 +61,8 @@ jobs:
|
|||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install --upgrade tox coveralls
|
||||
python3 -m pip install --upgrade pip
|
||||
python3 -m pip install --upgrade tox coveralls
|
||||
|
||||
- name: Run tox (${{ env.TOXENV }})
|
||||
# See TOXENV environment variable for the testenv to be executed here
|
||||
|
|
@ -99,6 +99,6 @@ jobs:
|
|||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install --upgrade coveralls
|
||||
python3 -m pip install --upgrade pip
|
||||
python3 -m pip install --upgrade coveralls
|
||||
coveralls --finish
|
||||
|
|
|
|||
14
docs/CLI.md
14
docs/CLI.md
|
|
@ -3,7 +3,7 @@
|
|||
The TUF command-line interface (CLI) requires a full
|
||||
[TUF installation](INSTALLATION.rst). Be sure to include the installation of
|
||||
extra dependencies and C extensions (
|
||||
```pip install securesystemslib[crypto,pynacl]```).
|
||||
```python3 -m pip install securesystemslib[crypto,pynacl]```).
|
||||
|
||||
The use of the CLI is documented with examples below.
|
||||
|
||||
|
|
@ -279,12 +279,6 @@ Enter a password for the encrypted key (tufkeystore/mykey):
|
|||
|
||||
Serve the repo
|
||||
```Bash
|
||||
$ cd tufrepo/
|
||||
$ python -m SimpleHTTPServer 8001
|
||||
```
|
||||
|
||||
If running python 3:
|
||||
```Bash
|
||||
$ python3 -m http.server 8001
|
||||
```
|
||||
|
||||
|
|
@ -412,12 +406,6 @@ $ repo.py --add README.txt --role role_x --sign tufkeystore/key_x tufkeystore/ke
|
|||
|
||||
Serve the repo
|
||||
```Bash
|
||||
$ cd tufrepo/
|
||||
$ python -m SimpleHTTPServer 8001
|
||||
```
|
||||
|
||||
If running python 3:
|
||||
```Bash
|
||||
$ python3 -m http.server 8001
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ and instructions for installing locally from source are provided here:
|
|||
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-15.0.3.tar.gz
|
||||
$ tar xvfz virtualenv-15.0.3.tar.gz
|
||||
$ cd virtualenv-15.0.3
|
||||
$ python virtualenv.py myVE
|
||||
$ python3 virtualenv.py myVE
|
||||
|
||||
|
||||
Development Installation
|
||||
|
|
@ -102,7 +102,7 @@ To work on the TUF project, it's best to perform a development install.
|
|||
|
||||
::
|
||||
|
||||
$ pip install -r requirements-dev.txt
|
||||
$ python3 -m pip install -r requirements-dev.txt
|
||||
|
||||
|
||||
Auto-formatting
|
||||
|
|
@ -134,15 +134,15 @@ dependencies must already be installed (see above).
|
|||
::
|
||||
|
||||
$ cd tests
|
||||
$ python aggregate_tests.py
|
||||
$ python3 aggregate_tests.py
|
||||
|
||||
Individual tests can also be executed. Optional '-v' flags can be added to
|
||||
increase log level up to DEBUG ('-vvvv').
|
||||
::
|
||||
|
||||
$ python test_updater.py # run a specific test file
|
||||
$ python test_updater.py TestUpdater.test_4_refresh # run a specific test
|
||||
$ python test_updater.py -vvvv TestUpdater.test_4_refresh # run test with DEBUG log level
|
||||
$ python3 test_updater.py # run a specific test file
|
||||
$ python3 test_updater.py TestUpdater.test_4_refresh # run a specific test
|
||||
$ python3 test_updater.py -vvvv TestUpdater.test_4_refresh # run test with DEBUG log level
|
||||
|
||||
|
||||
All of the log levels and the corresponding options that could be used for testing are:
|
||||
|
|
@ -180,9 +180,9 @@ a *venv*), and then install ``securesystemslib`` in editable mode too (in the sa
|
|||
::
|
||||
|
||||
$ cd path/to/tuf
|
||||
$ pip install -r requirements-dev.txt
|
||||
$ python3 -m pip install -r requirements-dev.txt
|
||||
$ cd path/to/securesystemslib
|
||||
$ pip install -r requirements-dev.txt
|
||||
$ python3 -m pip install -r requirements-dev.txt
|
||||
|
||||
|
||||
With `tox <https://testrun.org/tox/>`_ the test suite can be executed in a
|
||||
|
|
|
|||
|
|
@ -41,10 +41,10 @@ If you are only using ed25519-based cryptography, you can employ a pure-Python
|
|||
installation, done simply with one of the following commands:
|
||||
|
||||
Installing from Python Package Index (https://pypi.python.org/pypi).
|
||||
(Note: Please use "pip install --no-use-wheel tuf" if your version
|
||||
(Note: Please use "python3 -m pip install --no-use-wheel tuf" if your version
|
||||
of pip <= 1.5.6)
|
||||
::
|
||||
$ pip install tuf
|
||||
$ python3 -m pip install tuf
|
||||
|
||||
|
||||
**Alternatively**, if you wish to install from a GitHub release you've already
|
||||
|
|
@ -52,11 +52,11 @@ downloaded, or a package you obtained in another way, you can instead:
|
|||
|
||||
Install from a local source archive:
|
||||
::
|
||||
$ pip install <path to archive>
|
||||
$ python3 -m pip install <path to archive>
|
||||
|
||||
Or install from the root directory of the unpacked archive:
|
||||
::
|
||||
$ pip install .
|
||||
$ python3 -m pip install .
|
||||
|
||||
|
||||
|
||||
|
|
@ -70,7 +70,7 @@ securesystemslib. **Note**: that may require non-Python dependencies, so if
|
|||
you encounter an error attempting this pip command, see
|
||||
`more instructions below <#non-python-dependencies>`_).
|
||||
::
|
||||
$ pip install securesystemslib[crypto,pynacl] tuf
|
||||
$ python3 -m pip install securesystemslib[crypto,pynacl] tuf
|
||||
|
||||
|
||||
|
||||
|
|
@ -96,5 +96,5 @@ Fedora-based distributions can instead install these libraries with dnf.
|
|||
OS X users can install these header libraries with the `Homebrew <https://brew.sh/>`_
|
||||
package manager, among other options.
|
||||
::
|
||||
$ brew install python
|
||||
$ brew install python3
|
||||
$ brew install libffi
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ how TUF works, however. It will serve as a very basic update system.
|
|||
|
||||
Make sure that TUF is installed, along with some of the optional cryptographic
|
||||
libraries and C extensions. Try this command to do that:
|
||||
`pip install securesystemslib[colors,crypto,pynacl] tuf`
|
||||
`python3 -m pip install securesystemslib[colors,crypto,pynacl] tuf`
|
||||
|
||||
If you run into errors during that pip command, please consult the more
|
||||
detailed [TUF Installation Instructions](INSTALLATION.rst). (There are some
|
||||
|
|
@ -81,10 +81,6 @@ repository's metadata.
|
|||
```Bash
|
||||
$ cd "tufrepo/"
|
||||
$ python3 -m http.server 8001
|
||||
|
||||
# or, if you are using Python2:
|
||||
$ python -m SimpleHTTPServer 8001
|
||||
|
||||
```
|
||||
|
||||
**Step (4)** - Obtain and verify the `testfile` update on a client.
|
||||
|
|
|
|||
|
|
@ -674,11 +674,6 @@ repository example created earlier in this document.
|
|||
## Test TUF Locally ##
|
||||
Run the local TUF repository server.
|
||||
```Bash
|
||||
$ cd "repository/"; python -m SimpleHTTPServer 8001
|
||||
```
|
||||
|
||||
If running Python 3:
|
||||
```Bash
|
||||
$ cd "repository/"; python3 -m http.server 8001
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@
|
|||
# 1. Use this script to create a pinned requirements file for each Python
|
||||
# version
|
||||
# ```
|
||||
# for v in 2.7 3.6 3.7 3.8 3.9; do
|
||||
# for v in 3.6 3.7 3.8 3.9; do
|
||||
# mkvirtualenv tuf-env-${v} -p python${v};
|
||||
# pip install pip-tools;
|
||||
# python3 -m pip install pip-tools;
|
||||
# pip-compile --no-header -o requirements-${v}.txt requirements.txt;
|
||||
# deactivate;
|
||||
# rmvirtualenv tuf-env-${v};
|
||||
|
|
|
|||
17
setup.py
17
setup.py
|
|
@ -23,7 +23,7 @@
|
|||
distributed to other users. The packaged source is saved to the 'dist'
|
||||
folder in the current directory.
|
||||
|
||||
$ python setup.py sdist
|
||||
$ python3 setup.py sdist
|
||||
|
||||
|
||||
INSTALLATION OPTIONS
|
||||
|
|
@ -31,18 +31,18 @@
|
|||
pip - installing and managing Python packages (recommended):
|
||||
|
||||
# Installing from Python Package Index (https://pypi.python.org/pypi).
|
||||
$ pip install tuf
|
||||
$ python3 -m pip install tuf
|
||||
|
||||
# Installing from local source archive.
|
||||
$ pip install <path to archive>
|
||||
$ python3 -m pip install <path to archive>
|
||||
|
||||
# Or from the root directory of the unpacked archive.
|
||||
$ pip install .
|
||||
$ python3 -m pip install .
|
||||
|
||||
# Installing optional requirements (i.e., after installing tuf).
|
||||
# Support for creation of Ed25519 signatures and support for RSA and ECDSA
|
||||
# signatures in general requires optional dependencies:
|
||||
$ pip install securesystemslib[crypto,pynacl]
|
||||
$ python3 -m pip install securesystemslib[crypto,pynacl]
|
||||
|
||||
|
||||
Alternate installation options:
|
||||
|
|
@ -51,13 +51,13 @@
|
|||
run one of the following shell commands:
|
||||
|
||||
Install to the global site-packages directory.
|
||||
$ python setup.py install
|
||||
$ python3 setup.py install
|
||||
|
||||
Install to the user site-packages directory.
|
||||
$ python setup.py install --user
|
||||
$ python3 setup.py install --user
|
||||
|
||||
Install to a chosen directory.
|
||||
$ python setup.py install --home=<directory>
|
||||
$ python3 setup.py install --home=<directory>
|
||||
|
||||
|
||||
Note: The last two installation options may require modification of
|
||||
|
|
@ -96,7 +96,6 @@
|
|||
'Operating System :: POSIX :: Linux',
|
||||
'Operating System :: MacOS :: MacOS X',
|
||||
'Operating System :: Microsoft :: Windows',
|
||||
'Programming Language :: Python',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ Or by invoking `aggregate_tests.py` from the
|
|||
directory.
|
||||
|
||||
```
|
||||
$ python aggregate_tests.py
|
||||
$ python3 aggregate_tests.py
|
||||
```
|
||||
|
||||
Note: integration tests end in `_integration.py`.
|
||||
|
|
@ -22,13 +22,13 @@ If you wish to run a particular unit test, navigate to the tests directory and
|
|||
run that specific unit test. For example:
|
||||
|
||||
```
|
||||
$ python test_updater.py
|
||||
$ python3 test_updater.py
|
||||
```
|
||||
|
||||
It it also possible to run the test cases of a unit test. For instance:
|
||||
|
||||
```
|
||||
$ python -m unittest test_updater.TestMultiRepoUpdater.test_get_one_valid_targetinfo
|
||||
$ python3 -m unittest test_updater.TestMultiRepoUpdater.test_get_one_valid_targetinfo
|
||||
```
|
||||
|
||||
## Setup
|
||||
|
|
|
|||
|
|
@ -389,9 +389,6 @@ def test_tutorial(self):
|
|||
|
||||
# TODO: Run subprocess to simulate the following bash instructions:
|
||||
|
||||
# $ cd "repository/"; python -m SimpleHTTPServer 8001
|
||||
# If running Python 3:
|
||||
|
||||
# $ cd "repository/"; python3 -m http.server 8001
|
||||
# We next retrieve targets from the TUF repository and save them to client/. The client.py script is available to download metadata and files from a specified repository. In a different command-line prompt . . .
|
||||
|
||||
|
|
|
|||
12
tox.ini
12
tox.ini
|
|
@ -14,9 +14,9 @@ skipsdist = true
|
|||
changedir = tests
|
||||
|
||||
commands =
|
||||
python --version
|
||||
python -m coverage run aggregate_tests.py
|
||||
python -m coverage report -m --fail-under 97 --omit "{toxinidir}/tuf/ngclient/*"
|
||||
python3 --version
|
||||
python3 -m coverage run aggregate_tests.py
|
||||
python3 -m coverage report -m --fail-under 97 --omit "{toxinidir}/tuf/ngclient/*"
|
||||
|
||||
deps =
|
||||
-r{toxinidir}/requirements-test.txt
|
||||
|
|
@ -24,7 +24,7 @@ deps =
|
|||
# installation (see `skipsdist`), to get relative paths in coverage reports
|
||||
--editable {toxinidir}
|
||||
|
||||
install_command = pip install {opts} {packages}
|
||||
install_command = python3 -m pip install {opts} {packages}
|
||||
|
||||
# Develop test env to run tests against securesystemslib's master branch
|
||||
# Must to be invoked explicitly with, e.g. `tox -e with-sslib-master`
|
||||
|
|
@ -35,8 +35,8 @@ deps =
|
|||
--editable {toxinidir}
|
||||
|
||||
commands =
|
||||
python -m coverage run aggregate_tests.py
|
||||
python -m coverage report -m
|
||||
python3 -m coverage run aggregate_tests.py
|
||||
python3 -m coverage report -m
|
||||
|
||||
[testenv:lint]
|
||||
changedir = {toxinidir}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ $ rm -rf "client/targets/" "client/metadata/current/timestamp.json"
|
|||
The client now performs an update and should detect the invalid target file...
|
||||
Note: The following command should be executed in the "client/" directory.
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
Error: No working mirror was found:
|
||||
localhost:8001: BadHashError()
|
||||
```
|
||||
|
|
@ -80,7 +80,7 @@ indicates when metadata should no longer be trusted.
|
|||
In the following simulation, the client first tries to perform an update.
|
||||
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
```
|
||||
|
||||
According to the logger (`tuf.log` file in the current working directory),
|
||||
|
|
@ -95,7 +95,7 @@ should no longer be trusted.
|
|||
$ sudo date -s '2080-12-25 12:34:56'
|
||||
Wed Dec 25 12:34:56 EST 2080
|
||||
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
Error: No working mirror was found:
|
||||
u'localhost:8001': ExpiredMetadataError(u"Metadata u'root' expired on Tue Jan 1 00:00:00 2030 (UTC).",)
|
||||
```
|
||||
|
|
@ -119,7 +119,7 @@ $ cp repository/metadata/timestamp.json /tmp
|
|||
|
||||
We should next generate a new Timestamp file on the repository side.
|
||||
```Bash
|
||||
$ python
|
||||
$ python3
|
||||
>>> from tuf.repository_tool import *
|
||||
>>> repository = load_repository('repository')
|
||||
>>> repository.timestamp.version
|
||||
|
|
@ -138,12 +138,12 @@ $ cp repository/metadata.staged/* repository/metadata
|
|||
Now start the HTTP server from the directory containing the 'repository'
|
||||
subdirectory.
|
||||
```Bash
|
||||
$ python -m SimpleHTTPServer 8001
|
||||
$ python3 -m SimpleHTTPServer 8001
|
||||
```
|
||||
|
||||
And perform an update so that the client retrieves the updated timestamp.json.
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
```
|
||||
|
||||
Finally, move the previous timestamp.json file to the current live repository
|
||||
|
|
@ -151,12 +151,12 @@ and have the client try to download the outdated version. The client should
|
|||
reject it!
|
||||
```Bash
|
||||
$ cp /tmp/timestamp.json repository/metadata/
|
||||
$ cd repository; python -m SimpleHTTPServer 8001
|
||||
$ cd repository; python3 -m SimpleHTTPServer 8001
|
||||
```
|
||||
|
||||
On the client side, perform an update...
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
Error: No working mirror was found:
|
||||
u'localhost:8001': ReplayedMetadataError()
|
||||
```
|
||||
|
|
@ -180,7 +180,7 @@ requested target file (according to what is listed in trusted TUF metadata).
|
|||
|
||||
```Bash
|
||||
$ cp repository/targets/file1.txt /tmp
|
||||
$ python -c "print 'a' * 1000" >> repository/targets/file1.txt
|
||||
$ python3 -c "print 'a' * 1000" >> repository/targets/file1.txt
|
||||
```
|
||||
|
||||
Now delete the local metadata and target files on the client side so
|
||||
|
|
@ -195,7 +195,7 @@ expected size, and no more. The target file available on the software
|
|||
repository does contain more data than expected, though.
|
||||
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
```
|
||||
|
||||
At this point, part of the "file1.txt" file should have been fetched. That is,
|
||||
|
|
@ -243,7 +243,7 @@ keys. The client should reject the partially signed snapshot file served by
|
|||
the repository (or imagine that it is a compromised software repository).
|
||||
|
||||
```Bash
|
||||
$ python
|
||||
$ python3
|
||||
>>> from tuf.repository_tool import *
|
||||
>>> repository = load_repository('repository')
|
||||
>>> version = repository.root.version
|
||||
|
|
@ -273,7 +273,7 @@ The client now attempts to refresh the top-level metadata and the
|
|||
partially written snapshot.json, which should be rejected.
|
||||
|
||||
```Bash
|
||||
$ python basic_client.py --repo http://localhost:8001
|
||||
$ python3 basic_client.py --repo http://localhost:8001
|
||||
Error: No working mirror was found:
|
||||
u'localhost:8001': BadSignatureError()
|
||||
```
|
||||
|
|
@ -296,7 +296,7 @@ which to launch it.
|
|||
```Bash
|
||||
# Before launching the slow retrieval server, copy 'slow_retrieval_server.py'
|
||||
# to the 'repository/' directory and run it from that directory as follows:
|
||||
$ python slow_retrieval_server.py 8002 mode_2
|
||||
$ python3 slow_retrieval_server.py 8002 mode_2
|
||||
```
|
||||
|
||||
The client may now make a request to the slow retrieval server on port 8002.
|
||||
|
|
@ -307,7 +307,7 @@ This should make it so that the client detects the slow retrieval server's
|
|||
delayed streaming.
|
||||
|
||||
```Bash
|
||||
$ python basic_client.py --verbose 1 --repo http://localhost:8002
|
||||
$ python3 basic_client.py --verbose 1 --repo http://localhost:8002
|
||||
Error: No working mirror was found:
|
||||
u'localhost:8002': SlowRetrievalError()
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1018,6 +1018,6 @@ def _strip_prefix_from_targets_metadata(targets_metadata, prefix):
|
|||
if __name__ == '__main__':
|
||||
# The interactive sessions of the documentation strings can
|
||||
# be tested by running 'developer_tool.py' as a standalone module:
|
||||
# $ python developer_tool.py
|
||||
# $ python3 developer_tool.py
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
|
|
|||
|
|
@ -1004,6 +1004,6 @@ def check_signable_object_format(signable):
|
|||
if __name__ == '__main__':
|
||||
# The interactive sessions of the documentation strings can
|
||||
# be tested by running formats.py as a standalone module.
|
||||
# python -B formats.py
|
||||
# python3 -B formats.py
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
|
|
|||
12
tuf/log.py
12
tuf/log.py
|
|
@ -57,8 +57,8 @@
|
|||
multiple threads in a single process is also thread-safe. The logging
|
||||
module is NOT thread-safe when logging to a single file across multiple
|
||||
processes:
|
||||
http://docs.python.org/2/library/logging.html#thread-safety
|
||||
http://docs.python.org/2/howto/logging-cookbook.html
|
||||
http://docs.python.org/library/logging.html#thread-safety
|
||||
http://docs.python.org/howto/logging-cookbook.html
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
|
@ -88,7 +88,7 @@
|
|||
|
||||
# Ask all Formatter instances to talk GMT. Set the 'converter' attribute of
|
||||
# 'logging.Formatter' so that all formatters use Greenwich Mean Time.
|
||||
# http://docs.python.org/2/library/logging.html#logging.Formatter.formatTime
|
||||
# http://docs.python.org/library/logging.html#logging.Formatter.formatTime
|
||||
# The 2nd paragraph in the link above contains the relevant information.
|
||||
# GMT = UTC (Coordinated Universal Time). TUF metadata stores timestamps in UTC.
|
||||
# We previously displayed the local time but this lead to confusion when
|
||||
|
|
@ -144,8 +144,8 @@ def filter(self, record):
|
|||
http://stackoverflow.com/q/6177520
|
||||
http://stackoverflow.com/q/5875225
|
||||
http://bugs.python.org/issue6435
|
||||
http://docs.python.org/2/howto/logging-cookbook.html#filters-contextual
|
||||
http://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
http://docs.python.org/howto/logging-cookbook.html#filters-contextual
|
||||
http://docs.python.org/library/logging.html#logrecord-attributes
|
||||
|
||||
<Arguments>
|
||||
record:
|
||||
|
|
@ -169,7 +169,7 @@ def filter(self, record):
|
|||
# with too much data. Assuming that this filter is not applied to the
|
||||
# file logging handler, the user may always consult the file log for the
|
||||
# original exception traceback. The exc_info is explained here:
|
||||
# http://docs.python.org/2/library/sys.html#sys.exc_info
|
||||
# http://docs.python.org/library/sys.html#sys.exc_info
|
||||
exc_type, _, _ = record.exc_info
|
||||
|
||||
# Simply set the class name as the exception text.
|
||||
|
|
|
|||
|
|
@ -629,7 +629,7 @@ def get_filepaths_in_directory(files_directory, recursive_walk=False,
|
|||
|
||||
# FIXME: We need a way to tell Python 2, but not Python 3, to return
|
||||
# filenames in Unicode; see #61 and:
|
||||
# http://docs.python.org/2/howto/unicode.html#unicode-filenames
|
||||
# http://docs.python.org/howto/unicode.html#unicode-filenames
|
||||
for dirpath, dirnames, filenames in os.walk(files_directory,
|
||||
followlinks=followlinks):
|
||||
for filename in filenames:
|
||||
|
|
@ -3286,6 +3286,6 @@ def append_signature(signature, metadata_filepath):
|
|||
if __name__ == '__main__':
|
||||
# The interactive sessions of the documentation strings can
|
||||
# be tested by running repository_tool.py as a standalone module:
|
||||
# $ python repository_tool.py.
|
||||
# $ python3 repository_tool.py.
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
developer_tool.py.
|
||||
|
||||
Note:
|
||||
'pip install securesystemslib[crypto,pynacl]' is required by the CLI,
|
||||
'python3 -m pip install securesystemslib[crypto,pynacl]' is required by the CLI,
|
||||
which installs the 3rd-party dependencies: cryptography and pynacl.
|
||||
|
||||
<Usage>
|
||||
|
|
|
|||
Loading…
Reference in a new issue