diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index f4b7a28af..000000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,28 +0,0 @@ -[bumpversion] -current_version = 3.0.2 -commit = True -tag = False -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(?P(a|b|rc)?)(?P\d*) -serialize = - {major}.{minor}.{patch}{release}{releasenumber} - {major}.{minor}.{patch} - -[bumpversion:part:release] -values = - a - b - rc - -[bumpversion:part:releasenumber] - -[bumpversion:file:src/reuse/__init__.py] - -[bumpversion:file:pyproject.toml] -search = version = "{current_version}" -replace = version = "{new_version}" - -[bumpversion:file:docs/conf.py] - -[bumpversion:file:README.md] -search = rev: v{current_version} -replace = rev: v{new_version} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..f08992b17 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ + + + + +- [ ] Added a change log entry in `changelog.d//`. +- [ ] Added self to copyright blurb of touched files. +- [ ] Added self to `AUTHORS.rst`. +- [ ] Wrote tests. +- [ ] Documented my changes in `docs/man/` or elsewhere. +- [ ] My changes do not contradict + [the current specification](https://reuse.software/spec/). +- [x] I agree to license my contribution under the licenses indicated in the + changed files. diff --git a/.github/workflows/gettext.yaml b/.github/workflows/gettext.yaml index ceb4f86eb..c86d6e81b 100644 --- a/.github/workflows/gettext.yaml +++ b/.github/workflows/gettext.yaml @@ -1,4 +1,5 @@ # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -22,8 +23,16 @@ jobs: # exception to the branch protection, so we'll use that account's # token to push to the main branch. token: ${{ secrets.FSFE_SYSTEM_TOKEN }} - - name: Install gettext - run: sudo apt-get install -y gettext + - name: Install gettext and wlc + run: sudo apt-get install -y gettext wlc + - name: Lock Weblate + run: | + wlc --url https://hosted.weblate.org/api/ --key ${{secrets.WEBLATE_KEY }} lock fsfe/reuse-tool + - name: Push changes from Weblate to upstream repository + run: | + wlc --url https://hosted.weblate.org/api/ --key ${{secrets.WEBLATE_KEY }} push fsfe/reuse-tool + - name: Pull Weblate translations + run: git pull origin main - name: Create .pot file run: make create-pot # Normally, POT-Creation-Date changes in two locations. Check if the diff @@ -32,7 +41,7 @@ jobs: id: diff run: echo "changed=$(git diff -U0 | grep '^[+|-][^+|-]' | grep -Ev - '^[+-]"POT-Creation-Date' | wc -l)" >> $GITHUB_OUTPUT + '^[+-]("POT-Creation-Date|#:)' | wc -l)" >> $GITHUB_OUTPUT - name: Commit and push updated reuse.pot if: ${{ steps.diff.outputs.changed != '0' }} run: | @@ -41,3 +50,7 @@ jobs: git add po/reuse.pot po/*.po git commit -m "Update reuse.pot" git push origin main + - name: Unlock Weblate + run: | + wlc --url https://hosted.weblate.org/api/ --key ${{ secrets.WEBLATE_KEY }} pull fsfe/reuse-tool + wlc --url https://hosted.weblate.org/api/ --key ${{ secrets.WEBLATE_KEY }} unlock fsfe/reuse-tool diff --git a/.github/workflows/pijul.yaml b/.github/workflows/pijul.yaml index 23d59ae8e..d9d59f00a 100644 --- a/.github/workflows/pijul.yaml +++ b/.github/workflows/pijul.yaml @@ -25,7 +25,7 @@ jobs: python-version: 3.x - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only main,test # TODO: As soon as a binary is available for Ubuntu 22.04, use it instead # of manually building it. diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 06b68cc06..7a056a1a5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -36,7 +36,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only main,test - name: Run tests with pytest run: | @@ -52,7 +52,7 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only main,dev,test - name: Lint with Pylint run: | @@ -68,12 +68,12 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only dev - name: Test formatting with black run: | poetry run isort --check src/ tests/ - poetry run black . + poetry run black --check . mypy: runs-on: ubuntu-22.04 @@ -82,10 +82,10 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7 + python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only main,dev,test - name: Test typing with mypy run: | @@ -111,11 +111,10 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction --only main - name: Test REUSE compliance - run: | - make reuse + run: make reuse docs: runs-on: ubuntu-22.04 @@ -127,8 +126,8 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 - pip install -r docs/requirements.txt + pip install poetry~=1.3.0 + poetry install --no-interaction --only main,docs - name: Create docs with Sphinx run: | - make docs-ci + make docs diff --git a/.github/workflows/third_party_lint.yaml b/.github/workflows/third_party_lint.yaml index 1035ed554..98abad12b 100644 --- a/.github/workflows/third_party_lint.yaml +++ b/.github/workflows/third_party_lint.yaml @@ -36,7 +36,7 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction # Clone and lint repositories - name: Clone and lint repositories @@ -59,7 +59,7 @@ jobs: python-version: 3.8 - name: Install dependencies run: | - pip install poetry~=1.2.0 + pip install poetry~=1.3.0 poetry install --no-interaction # Clone and lint repositories - name: Clone and lint repositories diff --git a/.gitignore b/.gitignore index 7b5f4d602..880aee8b9 100644 --- a/.gitignore +++ b/.gitignore @@ -152,7 +152,7 @@ po/reuse.pot docs/api/ docs/history.md docs/readme.md -docs/contributing.md +docs/contribute.md prof/ # Nix-related diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2360761df..2502df300 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,11 +4,11 @@ repos: - repo: https://github.com/psf/black - rev: 23.10.1 + rev: 24.4.2 hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort name: isort (python) @@ -20,9 +20,13 @@ repos: name: isort (pyi) types: [pyi] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.6.1 + rev: v1.10.0 hooks: - id: mypy + # This is a bit annoying. There are probably more dependencies that need + # to be defined here for identical behaviour between `poetry run mypy` + # and `pre-commit run mypy`. + additional_dependencies: [attrs==23.2.0] - repo: https://github.com/pre-commit/mirrors-prettier rev: v3.0.3 hooks: diff --git a/.readthedocs.yaml b/.readthedocs.yaml index c6d5f3b7a..d43bc7d3d 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,16 +5,16 @@ version: 2 build: - # This should mirror the configuration in ./.github/workflows/pythonpackage.yaml - os: "ubuntu-20.04" + # This should mirror the configuration in ./.github/workflows/test.yaml + os: ubuntu-22.04 tools: python: "3.8" - -python: - install: - # This file is generated with poetry as follows: - # poetry export --with docs --without-hashes >docs/requirements-docs.txt - - requirements: docs/requirements.txt + jobs: + post_create_environment: + - python -m pip install poetry + post_install: + - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH python -m poetry install --with + docs sphinx: configuration: docs/conf.py diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index d8aeb1592..000000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,36 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: reuse -Upstream-Contact: Carmen Bianca Bakker -Source: https://github.com/fsfe/reuse-tool - -Files: .bumpversion.cfg setup.cfg -Copyright: 2017 Free Software Foundation Europe e.V. -License: GPL-3.0-or-later - -Files: docs/reuse*.rst -Copyright: 2017 Free Software Foundation Europe e.V. -License: CC-BY-SA-4.0 - -Files: docs/modules.rst -Copyright: 2017 Free Software Foundation Europe e.V. -License: CC-BY-SA-4.0 - -Files: po/*.po -Copyright: 2023 Free Software Foundation Europe e.V. -License: GPL-3.0-or-later - -Files: tests/resources/* -Copyright: 2017 Free Software Foundation Europe e.V. -License: GPL-3.0-or-later - -Files: src/reuse.egg-info/* -Copyright: 2017 Free Software Foundation Europe e.V. -License: GPL-3.0-or-later - -Files: poetry.lock -Copyright: 2017 Free Software Foundation Europe e.V. -License: CC0-1.0 - -Files: flake.lock -Copyright: 2017 Free Software Foundation Europe e.V. -License: CC0-1.0 diff --git a/AUTHORS.rst b/AUTHORS.rst index 6b986d601..6428aa891 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -16,118 +16,136 @@ Development Lead Contributors ------------ -- Sebastian Schuberth - +- Linus Sehn - Max Mehl - +- Nico Rikken +- Florian Snow +- Sebastian Schuberth +- Samuel Gaist +- Diego Elio Pettenò - Matija Šuklje - -- Greg Kroah-Hartman - -- Basil Peace - -- Keith Maxwell - -- Stefan Bakker - -- Kirill Elagin - +- gallegonovato +- Ihor Hordiichuk +- Liam Beguin +- J. Lavoie +- Anthony Loiseau +- André Ockers +- OliBug +- Vincent Lequertier +- pd +- Thomas Doczkal +- Tirifto +- Luca Bonissi +- José Vieira +- flow +- pd +- Roberto Bauglir +- T. E. Kalayci - John Mulligan - +- Kevin Broch +- Benoit Rolandeau +- David Alfonso +- Pietro Albini +- Shun Sakai +- Jiří Podhorecký +- Korrat +- Paul Spooren - Tuomas Siipola - -- Diego Elio Pettenò - -- David Alfonso - -- Maximilian Dolling - -- yoctocell - -- Tuomas Siipola - +- Wesley Schwengle +- Chris Wesseling +- Ethan Kerrick +- Friedrich von Never - Gri-ffin - -- Nico Rikken - -- Florian Snow - -- Linus Sehn - -- Yaman Qalieh - -- Pietro Albini - -- Matthias Riße - +- Matthias Riße +- Michael Weimann +- Roberto Redradix +- Robin Vobruba - Stefan Hynek - -- rajivsunar07 - -- roberto-red - -- Shun Sakai - -- Dirk Brömmel - -- Robin Vobruba - -- Markus Haug - -- Kevin Broch - -- Anthony Loiseau - -- Apteryks - -Translators ------------ - -- Dutch: - - + André Ockers - - + Carmen Bianca Bakker - -- French: - - + OliBug - - + Vincent Lequertier - -- Galician: - - + pd - -- German: - - + Max Mehl - - + Thomas Doczkal - -- Esperanto: - - + Carmen Bianca Bakker - - + Tirifto - -- Italian: - - + Luca Bonissi - -- Portuguese: - - + José Vieira - -- Spanish: - - + flow - - + pd - - + Roberto Bauglir - -- Turkish: - - + T. E. Kalayci - +- sudorook +- Adam Spiers +- Ajinkya Patil +- FeRD (Frank Dana) +- Greg Kroah-Hartman +- Hugo Osvaldo Barrera +- Jakelyst <86010593+Jakelyst@users.noreply.github.com> +- Jiri Vlasak +- Johannes Zarl-Zierl +- Keith Maxwell +- Kirill Elagin +- Kristoffer Grundström +- Luca Bonissi +- Manlio Perillo +- Mauro Aranda +- Maxim Cournoyer +- Mikko Piuhola +- Raniere Silva +- Robert Cohn +- Sebastian Schuberth +- Simon Schliesky +- Stefan Bakker +- T. E. Kalayci +- Thomas Bach +- Walter Paulo +- Wolfgang Traylor +- Xinglu Chen +- ethulhu +- gfbdrgng +- mdolling +- psykose +- Adrián Chaves +- Alvar <8402811+oxzi@users.noreply.github.com> +- Alvar Penning +- Aminda Suomalainen +- Andrey Bienkowski +- André Ockers +- Anthony Loiseau +- Arnout Engelen +- Basil Peace +- Benedikt Fein +- BigBlueHat +- David Kleuker +- David Marzal <2069735+Marzal@users.noreply.github.com> +- Dimitris Apostolou +- Dirk Brömmel +- Dmitry Bogatov +- FestplattenSchnitzel +- George Rawlinson +- Gert van Dijk +- Gerwin Klein +- Hanspeter Portner +- Hotripak +- Jan Staněk +- Jason Yundt +- Johannes Keyser +- Jon Burdo +- Josef Andersson +- José Vieira +- Kevin Meagher <11620178+kjmeagher@users.noreply.github.com> +- Lars Francke +- Libor Pechacek +- Léo de Souza +- Marius Brehler +- Mark A. Tsuchida +- Markus Vieth +- Mathias Dannesbo <45558062+md-magenta@users.noreply.github.com> +- Miro Hrončok +- Monaco +- Nicolás Alvarez +- Nir Soffer +- Olaf Meeuwissen +- Pep +- Philipp Zabel +- Roberto Bauglir +- Romain Tartière +- Ryan Schmidt +- Sebastian Crane +- T. E. Kalaycı +- Vishesh Handa +- Vlad-Stefan Harbuz +- Yaman Qalieh +- criadoperez +- ethulhu +- nautilusx +- pukkamustard +- rajivsunar07 <56905029+rajivsunar07@users.noreply.github.com> +- Сергій diff --git a/CHANGELOG.md b/CHANGELOG.md index 32f25c024..9cdd68175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ + +## 4.0.3 - 2024-07-08 + +### Fixed + +- Increased the minimum requirement of `attrs` to `>=21.3`. Older versions do + not import correctly. (#1044) + +## 4.0.2 - 2024-07-03 + +### Fixed + +- Repaired a bug that would cause a crash when running + `annotate --merge-copyrights` on a file that does not yet have a year in the + copyright statement. This bug was introduced in v4.0.1. (#1030) + +## 4.0.1 - 2024-07-03 + +### Fixed + +- Make sure that Read the Docs can compile the documentation. This necesitated + updating `poetry.lock`. (#1028) + +## 4.0.0 - 2024-07-03 + +This release of REUSE implements the new +[REUSE Specification v3.2](https://reuse.software/spec-3.2). It adds the +`REUSE.toml` file format as a replacement for `.reuse/dep5`. The new format is +easier to write and parse, is better at disambiguating certain corner cases, and +is more flexible for customisation and future additions. + +To convert your existing `.reuse/dep5` to `REUSE.toml`, you can simply use the +`reuse convert-dep5` command. + +Alongside the `REUSE.toml` feature is a wealth of other improvements. +`reuse lint --lines` may be especially interesting for CI workflows, as well as +the fact that the amount of `PendingDeprecationWarning`s has been drastically +reduced now that the information aggregation behaviour of `.reuse/dep5` is +explicitly defined in the specification. + +The tool has also been made easier to use with the addition of man pages. The +man pages can be found online at . +Your distribution's packager will need to make them accessible via +`man reuse(1)`. Unfortunately, man pages cannot be made accessible via Python's +packaging, although the full documentation (including man pages) is included in +the sdist. + +This changeset also contains the changes of v3.1.0a1. ### Added +- Added support for `REUSE.toml`. (#863) +- Added `reuse convert-dep5` to convert `.reuse/dep5` to `REUSE.toml`. (#863) +- Man pages added for all `reuse` commands. Distribution maintainers might wish + to distribute the (Sphinx-built) man pages. (#975) +- More file types are recognised: + - Assembler (`.asm`) (#928) + - GraphQL (`.graphqls`, `.gqls`) (#930) + - CUDA-C++ (`.cu`, `.cuh`) (#938) + - Various .NET files (`.csproj`, `.fsproj`, `.fsx`, `.props`, `.sln`, + `.vbproj`) (#940) + - Cargo (`Cargo.lock`) (#937) + - Clang-Tidy (`.clang-tidy`) (#961) + - Java `.properties` files (#968) + - Apache HTTP server config `.htaccess` files (#985) + - npm `.npmrc` files (#985) + - LaTeX class files (`.cls`) (#971) + - CSON (`.cson`) (#1002) + - Hjson (`.hjson`) (#1002) + - JSON5 (`.json5`) (#1002) + - JSON with Comments (`.jsonc`) (#1002) + - Tap (`.taprc`) (#997) + - Zsh (`.zshrc`) (#997) + - Perl test (`.t`) (#997) + - BATS test (`.bats`) (#997) + - Octave/Matlab (`.m`) (#604) + - VHDL(`.vhdl`) (#564) + - Earthly files (`Earthfile` and `.earthlyignore`) (#1024) +- Added comment styles: + - `man` for UNIX Man pages (`.man`) (#954) +- Added `--lines` output option for `lint`. (#956) +- Treat `% !TEX` and `% !BIB` as shebangs in TeX and BibTeX files, respectively + (#971) +- Support alternate spelling `--skip-unrecognized`. (#974) +- In `annotate`, rename `--copyright-style` to `--copyright-prefix`. The former + parameter is still supported. (#973) +- Support alternate spelling `--skip-unrecognized` (#974) +- `cpp` and `cppsingle` style shorthands (see changes). (#941) + ### Changed +- Updated SPDX resources to 3.24.0. (#994) +- Updated REUSE specification version to 3.2. (#994) +- `.s` files now use the Python comment style as per GNU Assembler (gas). (#928) +- Previously, any file that begins with `COPYING` or `LICENSE` was ignored. This + has been changed. Now, files like `COPYING_README` are no longer ignored, but + `COPYING` and `COPYING.txt` are still ignored (in other words: exact matches, + or `COPYING` + a file extension). Idem ditto for `LICENSE`. (#886) +- Dependencies added: + - `attrs>=21.1` (#863) + - `tomlkit>=0.8` (#863) +- Reorganised the way that `c`, `css`, and `csingle` styles work. (#941) + - `c` used to support multi-line comments; it now only supports multi-line + `/* */` comments. This is identical to the old `css` style. + - `cpp` has been added, which supports multi-line `/* */` comments and + single-line `//` comments. This is identical to the old `c` style. + - `csingle` has been renamed to `cppsingle`, and it supports only single-line + `//` comments. + ### Deprecated +- `.reuse/dep5` is marked deprecated. `reuse convert-dep5` will help you switch + to `REUSE.toml`. (#863) + ### Removed +- The PendingDeprecationWarning for the aggregation of information between DEP5 + and the contents of a file has been removed. This behaviour is now explicitly + specified in REUSE Specification v3.2. (#1017, related to #779) +- `reuse init` removed. (#863) +- `csingle` and `css` style shorthands (see changes). (#941) + ### Fixed -### Security ---> +- The datetime value for `Created:` was wrongly formatted since 3.0.0. It now + returns a correctly formatted ISO 8601 date again. (#952) +- Repaired the behaviour of `reuse download` where being inside of a LICENSES/ + directory should not create a deeper LICENSES/LICENSES/ directory. (#975) +- Support annotating a file that contains only a shebang. (#965) +- Add `CONTRIBUTING.md` to the sdist. (#987) +- In `reuse spdx`, fixed the output to be more compliant by capitalising + `SPDXRef-Document DESCRIBES` appropriately. (#1013) ## 3.0.2 - 2024-04-08 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10097a6cc..6da99c5ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,16 +15,59 @@ via e-mail to one of the maintainers. General inquiries can be sent to Interaction within this project is covered by the [FSFE's Code of Conduct](https://fsfe.org/about/codeofconduct). +## Scope and design goals of REUSE + +REUSE has a finite scope. The goal is to make upstream licensing **easy, +comprehensive, unambiguous, and machine-readable**. Contributions which +contradict the goals are unlikely to be accepted. Comprehensiveness is +especially important; REUSE provides no real mechanism for excluding a file from +REUSE compliance testing, and it is unlikely that such a mechanism will be +added. + +Behaviour changes to linting are also unlikely to be accepted, even if they are +good changes. The linting behaviour should always match the +[REUSE Specification](https://reuse.software/spec/). If you think that the +linting behaviour should change, you should open an issue on the +[reuse-website](https://github.com/fsfe/reuse-website) repository. + +The linter does not accept any arguments or configurations which modify its +behaviour in determining compliance. This is intentional. + ## Pull requests Pull requests are generally welcome and encouraged, but please beware that they -may be closed as out-of-scope or otherwise not aligned with the design goals. To -be safe, open an issue and engage in dialogue before beginning to implement a +may be closed for various reasons, such as: + +- The change is out-of-scope for REUSE. +- The change does not align with the design goals of REUSE. +- The change is good, but the maintenance burden is too heavy. + +To be safe, open an issue and engage in dialogue before beginning to implement a feature that may not be accepted. When making a pull request, don't hesitate to add yourself to the AUTHORS.rst file and the copyright headers of the files you touch. +### Change log + +Every pull request should add a change log entry. Change log entries go into +`changelog.d//.md`, where `` is the appropriate +category for the change set, and where `` is a short or random name for +your change set. + +The contents of the file should typically look like this: + +```markdown +- Added a new feature. (#pr_number) +``` + +At release time, the contents of the `changelog.d/` directory are compiled into +`CHANGELOG.md` using `protokolo compile`. + +Some PRs are excepted from adding change log entries, such as changes which are +too tiny to be significant, certain refactorings, or fixes to pull requests +which were already merged, but not yet released. + ## Translation Translations are welcome at @@ -59,9 +102,9 @@ Next, you'll find the following commands handy: ### Poetry Because our downstreams may not have a very recent version of Poetry, we should -target `poetry-core>=1.1.0` and `poetry~=1.2.0` when interacting with Poetry, +target `poetry-core>=1.4.0` and `poetry~=1.3.0` when interacting with Poetry, especially when generating the `poetry.lock` file. You can -`pip install poetry~=1.2.0` to ascertain that you always get this right. +`pip install poetry~=1.3.0` to ascertain that you always get this right. In order to update the `poetry.lock` file while changing as few lines as possible, run `poetry lock --no-update`. @@ -70,7 +113,7 @@ possible, run `poetry lock --no-update`. - Verify changelog - Create branch release-x.y.z -- `bumpversion --new-version x.y.z minor` +- `bumpver update --set-version vx.y.z` - `make update-resources` - Alter changelog - Do some final tweaks/bugfixes (and alter changelog) @@ -83,6 +126,13 @@ possible, run `poetry lock --no-update`. - `git merge release-x.y.z` - `git push origin main` - Create a release on GitHub. + +### After release + - Update readthedocs (if not happened automatically) - Update API worker: https://git.fsfe.org/reuse/api-worker#user-content-server - Make sure package is updated in distros (contact maintainers) +- Update the revision in `dev.md` of + [reuse-website](https://github.com/fsfe/reuse-website). +- If a major release, make sure + [reuse-action](https://github.com/fsfe/reuse-action/) is updated. diff --git a/Makefile b/Makefile index ac240280e..8626dcd1f 100644 --- a/Makefile +++ b/Makefile @@ -57,12 +57,7 @@ lint-third-party: ## Lint selected third-party repositories to compare with expe .PHONY: docs docs: clean-docs ## generate Sphinx HTML documentation, including API docs - poetry export --with docs --without-hashes >docs/requirements.txt - $(MAKE) -C docs html - -.PHONY: docs-ci -docs-ci: ## generate Sphinx HTML documentation, including API docs without dependency file generation (for CI) - $(MAKE) -C docs html + $(MAKE) -C docs html man .PHONY: dist dist: clean-build clean-pyc clean-docs ## builds source and wheel package @@ -71,7 +66,7 @@ dist: clean-build clean-pyc clean-docs ## builds source and wheel package .PHONY: create-pot create-pot: ## generate .pot file - xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot --files-from=po/POTFILES.in + xgettext --add-comments --from-code=utf-8 --output=po/reuse.pot src/reuse/**.py xgettext --add-comments --output=po/argparse.pot /usr/lib*/python3*/argparse.py msgcat --output=po/reuse.pot po/reuse.pot po/argparse.pot for name in po/*.po; do \ diff --git a/README.md b/README.md index a095f6869..4eb501bf3 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ recommendations. - Documentation: and - Source code: - PyPI: -- REUSE: 3.0 +- REUSE: 3.2 - Python: 3.8+ ## Table of contents @@ -29,7 +29,7 @@ recommendations. - [Usage](#usage) - [Maintainers](#maintainers) - [Contributing](#contributing) -- [License](#license) +- [Licensing](#licensing) ## Background @@ -178,7 +178,7 @@ To check against the recommendations, use `reuse lint`: ~/Projects/reuse-tool $ reuse lint [...] -Congratulations! Your project is compliant with version 3.0 of the REUSE Specification :-) +Congratulations! Your project is compliant with version 3.2 of the REUSE Specification :-) ``` This tool can do various more things, detailed in the documentation. Here a @@ -258,6 +258,9 @@ an error. ## Maintainers - Carmen Bianca Bakker + +### Former maintainers + - Max Mehl - Linus Sehn @@ -270,16 +273,21 @@ requests, and pull requests. Even and especially when in doubt, feel free to open an issue with a question. Contributions of all types are welcome, and the development team is happy to provide guidance and support for new contributors. +You should exercise some caution when opening a pull request to make changes +which were not (yet) acknowledged by the team as pertinent. Such pull requests +may be closed, leading to disappointment. To avoid this, please open an issue +first. + Additionally, the mailing list is available for discussion and support related to the project. You can find the full contribution guidelines at -. +. -## License +## Licensing This work is licensed under multiple licences. Because keeping this section -up-to-date is challenging, here is a brief summary as of February 2023: +up-to-date is challenging, here is a brief summary as of April 2024: - All original source code is licensed under GPL-3.0-or-later. - All documentation is licensed under CC-BY-SA-4.0. diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 000000000..71c5e87c7 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: 2023 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +version = 1 + +[[annotations]] +path = [ + ".bumpversion.cfg", + "setup.cfg" +] +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "GPL-3.0-or-later" + +[[annotations]] +path = "docs/reuse*.rst" +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "CC-BY-SA-4.0" + +[[annotations]] +path = "docs/modules.rst" +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "CC-BY-SA-4.0" + +[[annotations]] +path = "po/*.po" +precedence = "aggregate" +SPDX-FileCopyrightText = "2023 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "CC-BY-SA-4.0" + +[[annotations]] +path = "tests/resources/**" +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "GPL-3.0-or-later" + +[[annotations]] +path = "src/reuse.egg-info/**" +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "GPL-3.0-or-later" + +[[annotations]] +path = "poetry.lock" +precedence = "override" +SPDX-FileCopyrightText = "2017 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = ".github/pull_request_template.md" +precedence = "override" +SPDX-FileCopyrightText = "2024 Free Software Foundation Europe e.V. " +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = "changelog.d/**/*.md" +SPDX-FileCopyrightText = "REUSE contributors" +SPDX-License-Identifier = "CC-BY-SA-4.0 OR GPL-3.0-or-later" diff --git a/changelog.d/.protokolo.toml b/changelog.d/.protokolo.toml new file mode 100644 index 000000000..c05f27992 --- /dev/null +++ b/changelog.d/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "${version} - ${date}" +level = 2 diff --git a/changelog.d/added/.protokolo.toml b/changelog.d/added/.protokolo.toml new file mode 100644 index 000000000..bd8924220 --- /dev/null +++ b/changelog.d/added/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Added" +order = 1 diff --git a/changelog.d/changed/.protokolo.toml b/changelog.d/changed/.protokolo.toml new file mode 100644 index 000000000..9d91d23ac --- /dev/null +++ b/changelog.d/changed/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Changed" +order = 2 diff --git a/changelog.d/deprecated/.protokolo.toml b/changelog.d/deprecated/.protokolo.toml new file mode 100644 index 000000000..5264d6682 --- /dev/null +++ b/changelog.d/deprecated/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Deprecated" +order = 3 diff --git a/changelog.d/fixed/.protokolo.toml b/changelog.d/fixed/.protokolo.toml new file mode 100644 index 000000000..48f9fed3b --- /dev/null +++ b/changelog.d/fixed/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Fixed" +order = 5 diff --git a/changelog.d/removed/.protokolo.toml b/changelog.d/removed/.protokolo.toml new file mode 100644 index 000000000..21a87a44a --- /dev/null +++ b/changelog.d/removed/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Removed" +order = 4 diff --git a/changelog.d/security/.protokolo.toml b/changelog.d/security/.protokolo.toml new file mode 100644 index 000000000..df2c43a69 --- /dev/null +++ b/changelog.d/security/.protokolo.toml @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: CC0-1.0 + +[protokolo.section] +title = "Security" +order = 6 diff --git a/docs/Makefile b/docs/Makefile index ac3555a71..8deca4f63 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,9 +3,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later # You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = reuse +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build diff --git a/docs/conf.py b/docs/conf.py index e9ba7e795..f9674da75 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,75 +2,31 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -# reuse documentation build configuration file, created by -# sphinx-quickstart on Wed Nov 1 14:41:46 2017. +# Configuration file for the Sphinx documentation builder. # -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# import os -import sys from importlib.metadata import PackageNotFoundError from importlib.metadata import version as get_version +from pathlib import Path from shutil import copyfile -sys.path.insert(0, os.path.abspath("../src/")) - +DOCS_DIR = Path(os.path.dirname(__file__)) +ROOT_DIR = (DOCS_DIR / "..").resolve() -# -- General configuration ------------------------------------------------ +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "recommonmark", - "sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx.ext.viewcode", - "sphinx.ext.napoleon", - "sphinxcontrib.apidoc", -] - -apidoc_module_dir = "../src/reuse" -# apidoc_output_dir = "api" -# apidoc_excluded_paths = [] -apidoc_separate_modules = True - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = [".rst", ".txt", ".md"] - -# The master toctree document. -master_doc = "index" - -# General information about the project. project = "reuse" -copyright = "2017-2023, Free Software Foundation Europe. CC-BY-SA-4.0" +copyright = "2017, Free Software Foundation Europe. CC-BY-SA-4.0" author = "Free Software Foundation Europe" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. - try: # The full version, including alpha/beta/rc tags. release = get_version("reuse") @@ -87,110 +43,106 @@ # Usually you set "language" from the command line for these cases. language = "en" -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "myst_parser", + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", + "sphinx.ext.napoleon", + "sphinxcontrib.apidoc", +] + +templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" +# -- Extensions configuration ------------------------------------------------ + +apidoc_module_dir = str(ROOT_DIR / "src/reuse") +# apidoc_output_dir = "api" +# apidoc_excluded_paths = [] +apidoc_separate_modules = True +apidoc_toc_file = False +apidoc_extra_args = ["--maxdepth", "2"] -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False +autodoc_member_order = "bysource" +intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} -# -- Options for HTML output ---------------------------------------------- +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# html_theme = "furo" html_logo = "reuse-r-only.svg" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = "reusedoc" - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements: dict = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ +# -- Options for man output -------------------------------------------------- +man_pages = [ ( - master_doc, - "reuse.tex", - "reuse Documentation", + "man/reuse", + "reuse", + "A tool for compliance with the REUSE recommendations", "Free Software Foundation Europe", - "manual", - ) -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "reuse", "reuse Documentation", [author], 1)] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ + 1, + ), ( - master_doc, - "reuse", - "reuse Documentation", - author, - "reuse", - "One line description of project.", - "Miscellaneous", - ) + "man/reuse-annotate", + "reuse-annotate", + "Add REUSE information to files", + "Free Software Foundation Europe", + 1, + ), + ( + "man/reuse-convert-dep5", + "reuse-convert-dep5", + "Convert .reuse/dep5 to REUSE.toml", + "Free Software Foundation Europe", + 1, + ), + ( + "man/reuse-download", + "reuse-download", + "Download license files", + "Free Software Foundation Europe", + 1, + ), + ( + "man/reuse-lint", + "reuse-lint", + "Verify whether a project is compliant with the REUSE Specification", + "Free Software Foundation Europe", + 1, + ), + ( + "man/reuse-spdx", + "reuse-spdx", + "Generate SPDX bill of materials", + "Free Software Foundation Europe", + 1, + ), + ( + "man/reuse-supported-licenses", + "reuse-supported-licenses", + "Print a list of supported licenses", + "Free Software Foundation Europe", + 1, + ), ] - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"python": ("https://docs.python.org/3/", None)} +# -- Custom ------------------------------------------------------------------ def copy_markdown(_): """Copy the markdown files from the root of the project into the docs/ directory. """ - copyfile("../README.md", "readme.md") - copyfile("../CHANGELOG.md", "history.md") - copyfile("../CONTRIBUTING.md", "contributing.md") + copyfile(ROOT_DIR / "README.md", DOCS_DIR / "readme.md") + copyfile(ROOT_DIR / "CHANGELOG.md", DOCS_DIR / "history.md") + # this used to be renamed to 'contributing.md', but this caused a conflict + # with the ToC in the README. + copyfile(ROOT_DIR / "CONTRIBUTING.md", DOCS_DIR / "contribute.md") def setup(app): diff --git a/docs/index.rst b/docs/index.rst index 5ab768a64..f7482e0bb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,24 +8,50 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to reuse's documentation! -================================= +reuse documentation +=================== + +This is the documentation for the REUSE tool. You may find more information +about REUSE at ``_. .. toctree:: :maxdepth: 2 Overview - usage scripts - contributing + man/index + +API reference +------------- + +Although the API is not declared stable (and likely never will be declared +stable), you may find the API generated from Python docstrings useful or +insightful. + +.. toctree:: + :maxdepth: 3 + + API + +Project +------- + +.. toctree:: + :maxdepth: 2 + + contribute authors - history - API +Change log +---------- +.. toctree:: + :maxdepth: 2 + + history Indices and tables -================== +------------------ * :ref:`genindex` * :ref:`modindex` diff --git a/docs/man/index.rst b/docs/man/index.rst new file mode 100644 index 000000000..f858ec4b5 --- /dev/null +++ b/docs/man/index.rst @@ -0,0 +1,21 @@ +.. + SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +Command-line reference +====================== + +These are the manpages for ``reuse``. They contain helpful-but-succinct +information about the functioning of the tool. + +.. toctree:: + :maxdepth: 1 + + reuse + reuse-annotate + reuse-convert-dep5 + reuse-download + reuse-lint + reuse-spdx + reuse-supported-licenses diff --git a/docs/man/reuse-annotate.rst b/docs/man/reuse-annotate.rst new file mode 100644 index 000000000..a39290896 --- /dev/null +++ b/docs/man/reuse-annotate.rst @@ -0,0 +1,230 @@ +.. + SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. + SPDX-FileCopyrightText: © 2020 Liferay, Inc. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +.. + REUSE-IgnoreStart + +reuse-annotate +============== + +Synopsis +-------- + +**reuse annotate** [*options*] [*file* ...] + +Description +----------- + +:program:`reuse-annotate` adds REUSE information into the headers of files. This +is useful especially in scenarios where you want to add a copyright holder or +license to a lot of files without having to manually edit the header of each +file. + +.. warning:: + You should be cautious with using ``annotate`` in automated processes. While + nothing is stopping you from using it in your release script, you should make + sure that the information it adds is actually reflective of reality. This is + best verified manually. + +The REUSE header is placed at the very top of the file, excepting certain +existing headers like shebangs (``#!``) or XML declarations (````). If a different header containing copyright or licensing +information already exists in the file---at the top or elsewhere---that header +is replaced in-place with the additionally supplied REUSE information. + +The tool tries to auto-detect the comment style to use from the file extension +of a file, and use that comment style. + +Normally, the tool uses a single-line comment style when one is available (e.g., +``//`` is used instead of ``/* ... */`` for C++ comment styles). If no single-line +comment style is available, a multi-line style is used. + +Mandatory options +----------------- + +At least *one* among the following options is required. They contain the +information which the tool will add to the file(s). + +.. option:: -c, --copyright COPYRIGHT + + A copyright holder. This does not contain the year or the copyright prefix. + See :option:`--year` and :option:`--copyright-prefix` for the year and prefix. + This option can be repeated. + +.. option:: -l, --license LICENSE + + An SPDX license identifier. This option can be repeated. + +.. option:: --contributor CONTRIBUTOR + + A name of a contributor. The contributor will be added via the + ``SPDX-FileContributor:`` tag. This option can be repeated. + +Other options +------------- + +.. option:: -y, --year YEAR + + Define the year of the copyright statement(s). If not defined, the year + defaults to the current year. + +.. option:: -s, --style STYLE + + Override the comment style detection mechanism to force a comment style on the + files. This is useful when a file extension is not recognised, or when a file + extension is associated with a comment style that you disagree with. + +.. option:: --copyright-prefix PREFIX + + The prefix to use in the copyright statement. If not defined, ``spdx`` is used + as prefix. The available copyright prefixes are: + + .. code-block:: + + spdx: SPDX-FileCopyrightText: + spdx-c: SPDX-FileCopyrightText: (C) + spdx-symbol: SPDX-FileCopyrightText: © + string: Copyright + string-c: Copyright (C) + string-symbol: Copyright © + symbol: © + +.. option:: -t, --template TEMPLATE + + The template to use for the comment header. The template name match the name + of the template in ``.reuse/templates/``, without the ``.jinja2`` or + ``.commented.jinja2`` suffix. + +.. option:: --exclude-year + + Do not include the year in the copyright notice. + +.. option:: --merge-copyrights + + If two (or more) copyright notices are identical except for their years, + output them as a single line with the years combined. + +.. option:: --single-line + + Force the tool to use a single-line comment style. For C, this would be + ``//``. + +.. option:: --multi-line + + Force the tool to use a multi-line comment style. For C, this would be + ``/* ... */``. + +.. option:: -r, --recursive + + Annotate all files recursively under the specified path. + +.. option:: --no-replace + + Instead of replacing the first header in the file which contains copyright and + licensing information, keep it and create a new header at the top. + +.. option:: --force-dot-license + + Always write a .license file instead of trying to write into the file itself. + +.. option:: --fallback-dot-license + + Instead of aborting when a file extension does not have an associated comment + style, create a .license file for those files. + +.. option:: --skip-unrecognised + + Instead of aborting when a file extension does not have an associated comment + style, skip those files. + +.. option:: -h, --help + + Display help and exit. + +Templates +--------- + +When the tool adds a header to a file, it normally first lists all copyright +statements alphabetically, subsequently all contributors, then adds a single +empty line, and finally lists all SPDX License Expressions alphabetically. It is +possible to change this behaviour, and use a custom type of header that contains +extra text. This is done through Jinja2 templates. + +The default template is: + +.. code-block:: jinja + + {% for copyright_line in copyright_lines %} + {{ copyright_line }} + {% endfor %} + {% for contributor_line in contributor_lines %} + SPDX-FileContributor: {{ contributor_line }} + {% endfor %} + + {% for expression in spdx_expressions %} + SPDX-License-Identifier: {{ expression }} + {% endfor %} + +Templates are automatically commented by the tool, depending on the detected or +specified comment style. + +You can create your own Jinja2 templates and place them in +``.reuse/templates/``. You must suffix your template with ``.jinja2``. + +Inside of the template, you have access to the following variables: + +- ``copyright_lines`` --- a list of copyright notices (string). +- ``contributor_lines`` --- a list of contributors (string). +- ``spdx_expressions`` --- a list of SPDX License Expressions (string). + +In the future, more variables may be added. + +In some cases, you might want to do custom comment formatting. In those cases, +you can pre-format your header as a comment. When doing so, suffix your template +with ``.commented.jinja2``. + +An example of a custom template with manual commenting is: + +.. code-block:: jinja + + /* + {% for copyright_line in copyright_lines %} + * {{ copyright_line }} + {% endfor %} + {% if copyright_lines and spdx_expressions %} + * + {% endif %} + {% for expression in spdx_expressions %} + * SPDX-License-Identifier: {{ expression }} + {% endfor %} + {% if "GPL-3.0-or-later" in spdx_expressions %} + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + {% endif %} + */ + +Examples +-------- + +The basic usage is ``reuse annotate --copyright="Jane Doe" --license=MIT +my_file.py``. This will add the following header to the file (assuming that the +current year is 2019): + +.. code-block:: python + + # SPDX-FileCopyrightText: 2019 Jane Doe + # + # SPDX-License-Identifier: MIT diff --git a/docs/man/reuse-convert-dep5.rst b/docs/man/reuse-convert-dep5.rst new file mode 100644 index 000000000..427344c2b --- /dev/null +++ b/docs/man/reuse-convert-dep5.rst @@ -0,0 +1,70 @@ +.. + SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-convert-dep5 +================== + +Synopsis +-------- + +**reuse convert-dep5** [*options*] + +Description +----------- + +:program:`reuse-convert-dep5` converts the ``.reuse/dep5`` file into a +functionally equivalent ``REUSE.toml`` file in the root of the project. The +``.reuse/dep5`` file is subsequently deleted. + +Options +------- + +.. option:: -h, --help + + Display help and exit. + +Examples +-------- + +Given the following ``.reuse/dep5`` file:: + + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + Upstream-Name: Some project + Upstream-Contact: Jane Doe + Source: https://example.com/ + Disclaimer: Some rights reserved + + Files: hello*.txt + Copyright: 2018 Jane Doe + License: MIT + Comment: hello world + + Files: foo bar + Copyright: 2018 Jane Doe + 2019 John Doe + License: MIT + +The following ``REUSE.toml`` is generated: + +.. code-block:: toml + + version = 1 + SPDX-PackageName = "Some project" + SPDX-PackageSupplier = "Jane Doe" + SPDX-PackageDownloadLocation = "https://example.com/" + SPDX-PackageComment = "Some rights reserved" + + [[annotations]] + path = "hello**.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + SPDX-FileComment = "hello world" + + [[annotations]] + path = ["foo", "bar"] + precedence = "aggregate" + SPDX-FileCopyrightText = ["2018 Jane Doe", "2019 John Doe"] + SPDX-License-Identifier = "MIT" diff --git a/docs/man/reuse-download.rst b/docs/man/reuse-download.rst new file mode 100644 index 000000000..4c79f0fa3 --- /dev/null +++ b/docs/man/reuse-download.rst @@ -0,0 +1,46 @@ +.. + SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-download +============== + +Synopsis +-------- + +**reuse download** [*options*] [*license* ...] + +Description +----------- + +:program:`reuse-download` downloads licenses into your ``LICENSES/`` directory. + +The *license* arguments must be SPDX License Identifiers. + +The ``LICENSES/`` directory will be found in the root of your project. If you +are already in a directory named ``LICENSES`` and you are not in a VCS +repository, that directory will be used. + +If no ``LICENSES/`` directory exists, one will be created. + +Options +------- + +.. option:: --all + + Download all licenses detected missing in the project. + +.. option:: -o, --output FILE + + If downloading a single file, output it to a specific file instead of putting + it in a detected ``LICENSES/`` directory. + +.. option:: --source SOURCE + + Specify a source from which to copy custom ``LicenseRef-`` files. This can be + a directory containing such file, or a path to the file itself. + +.. option:: -h, --help + + Display help and exit. diff --git a/docs/man/reuse-lint.rst b/docs/man/reuse-lint.rst new file mode 100644 index 000000000..75bfcf945 --- /dev/null +++ b/docs/man/reuse-lint.rst @@ -0,0 +1,101 @@ +.. + SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. + SPDX-FileCopyrightText: © 2020 Liferay, Inc. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-lint +========== + +Synopsis +-------- + +**reuse lint** [*options*] + +Description +----------- + +:program:`reuse-lint` verifies whether a project is compliant with the REUSE +Specification located at ``_. + +Criteria +-------- + +These are the criteria that the linter checks against. + +Bad licenses +~~~~~~~~~~~~ + +Licenses that are found in ``LICENSES/`` that are not found in the SPDX License +List or do not start with ``LicenseRef-`` are bad licenses. + +Deprecated licenses +~~~~~~~~~~~~~~~~~~~ + +Licenses whose SPDX License Identifier has been deprecated by SPDX. + +Licenses without file extension +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +These are licenses whose file names are a valid SPDX License Identifier, but +which do not have a file extension. + +Missing licenses +~~~~~~~~~~~~~~~~ + +A license which is referred to in a comment header, but which is not found in +the ``LICENSES/`` directory. + +Unused licenses +~~~~~~~~~~~~~~~ + +A license found in the ``LICENSES/`` directory, but which is not referred to in +any comment header. + +Read errors +~~~~~~~~~~~ + +Not technically a criterion, but files that cannot be read by the operating +system are read errors, and need to be fixed. + +Files without copyright and license information +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Every file needs to have copyright and licensing information associated with it. +The REUSE Specification details several ways of doing it. By and large, these +are the methods: + +- Placing tags in the header of the file. +- Placing tags in a ``.license`` file adjacent to the file. +- Putting the information in the ``REUSE.toml`` file. +- Putting the information in the ``.reuse/dep5`` file. (Deprecated) + +If a file is found that does not have copyright and/or license information +associated with it, then the project is not compliant. + +Options +------- + +.. option:: -q, --quiet + + Do not print anything to STDOUT. + +.. + TODO: specify the JSON output. + +.. option:: -j, --json + + Output the results of the lint as JSON. + +.. option:: -p, --plain + + Output the results of the lint as descriptive text. The text is valid + Markdown. + +.. option:: -l, --lines + + Output one line per error, prefixed by the file path. + +.. option:: -h, --help + + Display help and exit. diff --git a/docs/man/reuse-spdx.rst b/docs/man/reuse-spdx.rst new file mode 100644 index 000000000..46515dced --- /dev/null +++ b/docs/man/reuse-spdx.rst @@ -0,0 +1,46 @@ +.. + SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-spdx +========== + +Synopsis +-------- + +**reuse spdx** [*options*] + +Description +----------- + +:program:`reuse-spdx` generates an SPDX bill of materials for the project. + +The bill of materials is output to STDOUT. + +.. + TODO: add more details here. Maybe wait until this is refactored. + +Options +------- + +.. option:: -o, --output FILE + + Write the bill of materials to a file instead of writing it to STDOUT. + +.. option:: --add-license-concluded + + Instead of writing 'NOASSERTION' to LicenseConcluded, write an expression that + is the logical equivalent of AND-ing all found expressions. + +.. option:: --creator-person + + Name of the creator (person) of the bill of materials. + +.. option:: --creator-organization + + Name of the creator (organization) of the bill of materials. + +.. option:: -h, --help + + Display help and exit. diff --git a/docs/man/reuse-supported-licenses.rst b/docs/man/reuse-supported-licenses.rst new file mode 100644 index 000000000..8dbb87596 --- /dev/null +++ b/docs/man/reuse-supported-licenses.rst @@ -0,0 +1,30 @@ +.. + SPDX-FileCopyrightText: 2024 Free Software Foundation Europe e.V. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse-supported-licenses +======================== + +Synopsis +-------- + +**reuse supported-licenses** [*options*] + +Description +----------- + +:program:`reuse-supported-licenses` generates a list of supported licenses. +These are the licenses in the SPDX License List found at +``_. The list may not be up-to-date depending on how +recent your installation of :program:`reuse` is. + +The list contains rows with three items each: the SPDX License Identifier, the +full name of the license, and an URL to the license. + +Options +------- + +.. option:: -h, --help + + Display help and exit. diff --git a/docs/man/reuse.rst b/docs/man/reuse.rst new file mode 100644 index 000000000..9ffbd6597 --- /dev/null +++ b/docs/man/reuse.rst @@ -0,0 +1,107 @@ +.. + SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. + SPDX-FileCopyrightText: © 2020 Liferay, Inc. + + SPDX-License-Identifier: CC-BY-SA-4.0 + +reuse +===== + +Synopsis +-------- + +**reuse** [*options*] + +Description +----------- + +:program:`reuse` is a helper tool for the REUSE initiative. Its main +functionality in :manpage:`reuse-lint(1)` is to verify whether a project is +compliant with the REUSE Specification. It also contains an array of convenience +functions to enable developers to become compliant. + +For more information on how to use reuse beyond a reference of the command-line +options, see the accompanying documentation or read it at +``_. For further information about REUSE, see +``_. + +Details +------- + +When searching for copyright and licensing tags inside of files, the tool does +not strictly limit itself to the header comment as prescribed by the +specification. It searches the first 4 kibibytes of the file for REUSE +information, whether in comments or not. This makes sure that the tool can parse +any type of plain-text file, even if the comment style is not recognised. + +If a file is found to have an unparsable tag, that file is not parsed at all. +This is a bug (``_). + +The tool does not verify the correctness of copyright notices. If it finds any +line containing '©', 'Copyright', or 'SPDX-FileCopyrightText:', then the tag and +everything following it is considered a valid copyright notice, even if the +copyright notice is not compliant with the specification. + +Symbolic links and files that are zero-sized are automatically ignored. + +Options +------- + +.. option:: --debug + + Enable debug logging. + +.. option:: --suppress-deprecation + + Hide deprecation warnings. + +.. option:: --include-submodules + + Do not ignore Git submodules; they are treated as though they are part of the + project. This is not strictly compliant with the specification. + +.. option:: --include-meson-subprojects + + Do not ignore Meson subprojects (i.e. the ``subprojects`` directory in the + root of the project); they are treated as though they are part of the project. + This is not strictly compliant with the specification. + +.. option:: --no-multiprocessing + + Disable multiprocessing performance enhancer. This may be useful when + debugging. + +.. option:: --root PATH + + Set the root of the project to PATH. Normally this defaults to the root of the + current working directory's VCS repository, or to the current working + directory. + +.. option:: -h, --help + + Display help and exit. If no command is provided, this option is implied. + +.. option:: --version + + Display the version and exit. + +Commands +-------- + +:manpage:`reuse-annotate(1)` + Add REUSE information to files. + +:manpage:`reuse-convert-dep5(1)` + Convert ``.reuse/dep5`` to ``REUSE.toml``. + +:manpage:`reuse-download(1)` + Download license files. + +:manpage:`reuse-lint(1)` + Verify whether a project is compliant with the REUSE Specification. + +:manpage:`reuse-spdx(1)` + Generate SPDX bill of materials. + +:manpage:`reuse-supported-licenses(1)` + Print a list of supported licenses. diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index d61fb555f..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,38 +0,0 @@ -alabaster==0.7.13 ; python_version >= "3.8" and python_version < "4.0" -babel==2.12.1 ; python_version >= "3.8" and python_version < "4.0" -beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0" -binaryornot==0.4.4 ; python_version >= "3.8" and python_version < "4.0" -boolean-py==4.0 ; python_version >= "3.8" and python_version < "4.0" -certifi==2023.5.7 ; python_version >= "3.8" and python_version < "4.0" -chardet==5.1.0 ; python_version >= "3.8" and python_version < "4.0" -charset-normalizer==3.1.0 ; python_version >= "3.8" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" -commonmark==0.9.1 ; python_version >= "3.8" and python_version < "4.0" -docutils==0.20.1 ; python_version >= "3.8" and python_version < "4.0" -furo==2023.5.20 ; python_version >= "3.8" and python_version < "4.0" -idna==3.4 ; python_version >= "3.8" and python_version < "4.0" -imagesize==1.4.1 ; python_version >= "3.8" and python_version < "4.0" -importlib-metadata==6.6.0 ; python_version >= "3.8" and python_version < "3.10" -jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0" -license-expression==30.1.1 ; python_version >= "3.8" and python_version < "4.0" -markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4.0" -packaging==23.1 ; python_version >= "3.8" and python_version < "4.0" -pbr==5.11.1 ; python_version >= "3.8" and python_version < "4.0" -pygments==2.15.1 ; python_version >= "3.8" and python_version < "4.0" -python-debian==0.1.49 ; python_version >= "3.8" and python_version < "4.0" -pytz==2023.3 ; python_version >= "3.8" and python_version < "3.9" -recommonmark==0.7.1 ; python_version >= "3.8" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" -snowballstemmer==2.2.0 ; python_version >= "3.8" and python_version < "4.0" -soupsieve==2.4.1 ; python_version >= "3.8" and python_version < "4.0" -sphinx-basic-ng==1.0.0b1 ; python_version >= "3.8" and python_version < "4.0" -sphinx==7.0.1 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-apidoc==0.3.0 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "4.0" -sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "4.0" -urllib3==2.0.3 ; python_version >= "3.8" and python_version < "4.0" -zipp==3.15.0 ; python_version >= "3.8" and python_version < "3.10" diff --git a/docs/requirements.txt.license b/docs/requirements.txt.license deleted file mode 100644 index dc32ba073..000000000 --- a/docs/requirements.txt.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2023 2023 Free Software Foundation Europe e.V. - -SPDX-License-Identifier: CC0-1.0 diff --git a/docs/usage.rst b/docs/usage.rst deleted file mode 100644 index e9c505822..000000000 --- a/docs/usage.rst +++ /dev/null @@ -1,376 +0,0 @@ -===== -Usage -===== - -The :doc:`overview ` documents some basic usage on how to use this tool. -It is highly recommended to read the overview first, and you might not even need -to read this chapter. This chapter covers details that might not be immediately -obvious when using the tool. This chapter does not cover *everything*, assuming -that the user is helped enough by ``reuse --help`` and ``reuse ---help``. - -Implementation details -====================== - -This section covers implementation details that are true for the entire tool. - -When searching for copyright and licensing tags inside of files, the tool does -not strictly limit itself to the header comment as prescribed by the -specification. It searches the first 4 kibibytes of the file. This makes sure -that the tool can parse any type of plain-text file, even if the comment style -is not recognised. - -If a file is found to have an unparsable tag, that file is not parsed at all. -This is `a bug `_. - -The tool does not verify the correctness of copyright notices. If it finds any -line containing '©', 'Copyright', or 'SPDX-FileCopyrightText:', then the tag and -everything following it is considered a valid copyright notice, even if the -copyright notice is not compliant with the specification. - -When running the tool, the root of the project is automatically found if the -working directory is inside a VCS repository. Otherwise, it treats the working -directory as the root of the project. You can override the root of the project -with the ``--root`` optional argument. - -Git submodules are automatically ignored unless ``--include-submodules`` is -passed as optional argument. - -Meson subprojects are automatically ignored if ``meson.build`` exists in the -project root. ``--include-meson-subprojects`` overrides this behaviour. - -Symbolic links and files that are zero-sized are automatically ignored. - -annotate -======== - -``annotate`` makes it possible to semi-automatically add copyright and -licensing information into the header of a file. This is useful especially in -scenarios where you want to add a copyright holder or license to a lot of files -without having to manually edit the header of each file. - -.. warning:: - You should be cautious with using ``annotate`` in automated processes. While - nothing is stopping you from using it in your release script, you should make - sure that the information it adds is actually reflective of reality. This is - best verified manually. - -The basic usage is ``reuse annotate --copyright="Jane Doe" --license=MIT -my_file.py``. This will add the following header to the file (assuming that the -current year is 2019): - -.. code-block:: python - - # SPDX-FileCopyrightText: 2019 Jane Doe - # - # SPDX-License-Identifier: MIT - -You can use as many ``--copyright`` and ``--license`` arguments, so long as -there is at least one such argument. - -The REUSE header is placed at the very top of the file. If a different REUSE -header already existed---at the top or elsewhere---its tags are copied, and the -header is replaced in-place. - -With the argument ``--copyright-style`` it is possible to change the default -``SPDX-FileCopyrightText`` to one of the following style: - -.. code-block:: - - spdx: SPDX-FileCopyrightText: - spdx-c: SPDX-FileCopyrightText: (C) - spdx-symbol: SPDX-FileCopyrightText: © - string: Copyright - string-c: Copyright (C) - string-symbol: Copyright © - symbol: © - -Shebangs are always preserved at the top of the file. If you also want to -preserve the existing header, use the argument ``--no-replace``. - -Merging Statements ------------------- - -When the tool parses copyright headers, `reuse` can be configured to -automatically merge copyright lines based on the statement element. -This effectively transforms multiple lines with a single year into a single line -with a range. - -Starting with the following header, - -.. code-block:: python - - # SPDX-FileCopyrightText: 2016 Jane Doe - # SPDX-FileCopyrightText: 2018 John Doe - # - # SPDX-License-Identifier: GPL-2.0 - -The standard tool options would produce the following - -.. code-block:: console - - $ reuse annotate --year 2018 --license GPL-2.0 --copyright="Jane Doe" file.py - -.. code-block:: python - - # SPDX-FileCopyrightText: 2016 Jane Doe - # SPDX-FileCopyrightText: 2018 John Doe - # SPDX-FileCopyrightText: 2018 Jane Doe - # - # SPDX-License-Identifier: GPL-2.0 - -Running the same command with the `--merge-copyrights` option will instead -produce the following - -.. code-block:: python - - # SPDX-FileCopyrightText: 2016 - 2018 Jane Doe - # SPDX-FileCopyrightText: 2018 John Doe - # - # SPDX-License-Identifier: GPL-2.0 - -Comment styles --------------- - -The tool normally tries to auto-detect the comment style to use from the file -extension of a file, and use that comment style. If the tool is unable to detect -the comment style, or if it detects the wrong style, you can override the style -using ``--style``. The list of styles can be found in :doc:`api/reuse.comment`. - -If your comment style is not supported or a file extension is not correctly -detected, please `open an issue `_. - -Normally, the tool uses a single-line comment style when it is available (e.g., -`//` is used instead of `/* */` for C comment styles). If no single-line comment -style is available, a multi-line style is used. You can force a certain comment -style using `--single-line` or `--multi-line`. - -Templates ---------- - -When the tool adds a header to a file, it normally first lists all copyright -statements alphabetically, adds a single empty line, and then lists all SPDX -License Expressions alphabetically. That is all that the header contains. It is -possible to change this behaviour, and use a custom type of header that contains -extra text. This is done through Jinja2 templates. - -The default template is: - -.. code-block:: jinja - - {% for copyright_line in copyright_lines %} - {{ copyright_line }} - {% endfor %} - {% for contributor_line in contributor_lines %} - SPDX-FileContributor: {{ contributor_line }} - {% endfor %} - - {% for expression in spdx_expressions %} - SPDX-License-Identifier: {{ expression }} - {% endfor %} - -Templates are automatically commented by the tool, depending on the detected or -specified comment style. - -You can create your own Jinja2 templates and place them in -``.reuse/templates/``. If you create the template ``mytemplate.jinja2``, you can -use it with ``reuse annotate --copyright="Jane Doe" --template=mytemplate -foo.py``. - -Inside of the template, you have access to the following variables: - -- ``copyright_lines`` --- a list of copyright notices (string). -- ``contributor_lines`` --- a list of contributors (string). -- ``spdx_expressions`` --- a list of SPDX License Expressions (string). - -In the future, more variables will be added. - -In some cases, you might want to do custom comment formatting. In those cases, -you can pre-format your header as a comment. When doing so, suffix your template -with ``.commented.jinja2``. - -An example of a custom template with manual commenting is: - -.. code-block:: jinja - - /* - {% for copyright_line in copyright_lines %} - * {{ copyright_line }} - {% endfor %} - {% if copyright_lines and spdx_expressions %} - * - {% endif %} - {% for expression in spdx_expressions %} - * SPDX-License-Identifier: {{ expression }} - {% endfor %} - {% if "GPL-3.0-or-later" in spdx_expressions %} - * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - {% endif %} - */ - -lint -==== - -``lint`` is the main component of the tool. Summarily, it verifies whether the -project is compliant with `the REUSE Specification -`_. Its main goal is to find all files that do not -have copyright and licensing information in their headers, but it also checks a -few other things. - -The STDOUT output of ``reuse lint`` is valid Markdown. Occasionally some logging -will be printed to STDERR, which is not valid Markdown. - -You may prevent STDOUT output by using the `--quiet` option. This can be useful -if you are only interested in the exit code. - -This is some example output of ``reuse lint``: - -.. code-block:: text - - # BAD LICENSES - - 'bad-license' found in: - * LICENSES/bad-license.txt - - - # UNUSED LICENSES - - The following licenses are not used: - * bad-license - - - # MISSING COPYRIGHT AND LICENSING INFORMATION - - The following files have no copyright and licensing information: - * no-information.txt - - - # SUMMARY - - * Bad licenses: bad-license - * Deprecated licenses: - * Licenses without file extension: - * Missing licenses: - * Unused licenses: bad-license - * Used licenses: Apache-2.0, CC-BY-SA-4.0, CC0-1.0, GPL-3.0-or-later - * Read errors: 0 - * Files with copyright information: 57 / 58 - * Files with license information: 57 / 58 - - Unfortunately, your project is not compliant with version 3.0 of the REUSE Specification :-( - -Criteria --------- - -These are the criteria that the linter checks against: - -Bad licenses -++++++++++++ - -Licenses that are found in ``LICENSES/`` that are not found in the SPDX License -List or do not start with ``LicenseRef-`` are bad licenses. - -Deprecated licenses -+++++++++++++++++++ - -If a license has an SPDX License Identifier that has been deprecated by SPDX, -the license will show up here. - -Licenses without file extension -+++++++++++++++++++++++++++++++ - -These are licenses whose file names are a valid SPDX License Identifier, but -which do not have a file extension. - -Missing licenses -++++++++++++++++ - -If a license is referred to in a comment header, but the license is not found in -the ``LICENSES/`` directory, then that license is missing. - -Unused licenses -+++++++++++++++ - -Conversely, if a license is found in the ``LICENSES/`` directory but is not -referred to in any comment header, then that license is unused. - -Read errors -+++++++++++ - -Not technically a criterion, but files that cannot be read by the operating -system are read errors, and need to be fixed. - -Files with copyright and license information -++++++++++++++++++++++++++++++++++++++++++++ - -Every file needs to have copyright and licensing information associated with it. -The REUSE Specification details several ways of doing it. By and large, these -are the methods: - -- Placing tags in the header of the file. -- Placing tags in a ``.license`` file adjacent to the file. -- Putting the information in the DEP5 file. - -If a file is found that does not have copyright and/or license information -associated with it, then the project is not compliant. - -Ignoring parts of a file ------------------------- - -You can easily ignore parts of a file that will always cause problems for -``reuse lint``. Suppose you have the following bash script: - -.. code:: bash - - #!/usr/bin/env bash - # SPDX-FileCopyrightText: 2021 John Doe - # - # SPDX-License-Identifier: CC0-1.0 - - echo "SPDX-FileCopyrightText: $(date +'%Y') Jane Doe" > file.txt - echo "SPDX-License-Identifier: MIT" > file.txt - - exit 0 - -This will lead to the following error message despite the file having the -correct licensing info in the header: - -.. code:: text - - $ reuse lint - reuse._util - ERROR - Could not parse 'MIT" > file.txt' - reuse.project - ERROR - 'foobar.sh' holds an SPDX expression that cannot be parsed, skipping the file - # MISSING COPYRIGHT AND LICENSING INFORMATION - - The following files have no copyright and licensing information: - * foobar.sh - [...] - -To avoid this error message, you can simply amend the file as follows: - -.. code:: bash - - #!/usr/bin/env bash - # SPDX-FileCopyrightText: 2021 John Doe - # - # SPDX-License-Identifier: CC0-1.0 - - # REUSE-IgnoreStart - echo "SPDX-FileCopyrightText: $(date +'%Y') Jane Doe" > file.txt - echo "SPDX-License-Identifier: MIT" > file.txt - # REUSE-IgnoreEnd - - exit 0 - -Now, `reuse lint` will not report any problems with this file anymore. diff --git a/po/POTFILES.in b/po/POTFILES.in deleted file mode 100644 index 94a87bd38..000000000 --- a/po/POTFILES.in +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -src/reuse/__init__.py -src/reuse/_main.py -src/reuse/_util.py -src/reuse/download.py -src/reuse/header.py -src/reuse/init.py -src/reuse/lint.py -src/reuse/project.py -src/reuse/report.py -src/reuse/spdx.py diff --git a/po/cs.po b/po/cs.po index 9ad658011..c44fcc4b9 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-04-12 13:49+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech =2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 4.17-dev\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" +"'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" +"line" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" + +#: src/reuse/_annotate.py:136 +#, fuzzy, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "Přeskočen nerozpoznaný soubor {path}" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "" + +#: src/reuse/_annotate.py:158 +#, fuzzy, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "Přeskočený soubor '{path}' již obsahuje informace SPDX" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Chyba: Chybí řádky s autorskými právy nebo licenční výrazy v generovaném " +"záhlaví komentáře pro '{path}'. Šablona je pravděpodobně nesprávná. " +"Nepodařilo se zapsat novou hlavičku." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "Úspěšně změněna hlavička {path}" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" +"--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" + +#: src/reuse/_annotate.py:231 +#, fuzzy +msgid "option --contributor, --copyright or --license is required" +msgstr "je vyžadována volba --copyright nebo --licence" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "šablonu {template} se nepodařilo najít" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "nelze zapisovat do '{}'" + +#: src/reuse/_annotate.py:366 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"Následující soubory nemají rozpoznanou příponu. Použijte prosím --style, --" +"force-dot-licence nebo --skip-unrecognised:" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "prohlášení o autorských právech, opakovatelné" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Identifikátor SPDX, opakovatelný" + +#: src/reuse/_annotate.py:395 +#, fuzzy +msgid "file contributor, repeatable" +msgstr "Identifikátor SPDX, opakovatelný" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "rok vydání prohlášení o autorských právech, nepovinné" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "styl komentáře, který se má použít, nepovinné" + +#: src/reuse/_annotate.py:417 +#, fuzzy +msgid "copyright prefix to use, optional" +msgstr "styl autorských práv, který se má použít, nepovinné" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "název šablony, která se má použít, nepovinné" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "neuvádět rok v prohlášení" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" +"sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských právech " +"totožná" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "vynutit jednořádkový styl komentáře, nepovinné" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "vynutit víceřádkový styl komentáře, nepovinné" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" + +#: src/reuse/_annotate.py:473 +#, fuzzy +msgid "always write a .license file instead of a header inside the file" +msgstr "zapsat soubor .license místo hlavičky uvnitř souboru" + +#: src/reuse/_annotate.py:480 +#, fuzzy +msgid "write a .license file to files with unrecognised comment styles" +msgstr "přeskočit soubory s nerozpoznanými styly komentářů" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "přeskočit soubory s nerozpoznanými styly komentářů" + +#: src/reuse/_annotate.py:497 +#, fuzzy +msgid "skip files that already contain REUSE information" +msgstr "přeskočit soubory, které již obsahují informace SPDX" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -30,17 +190,17 @@ msgstr "" "naleznete na adrese a online dokumentaci na adrese " "." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Tato verze reuse je kompatibilní s verzí {} specifikace REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Podpořte činnost FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -50,44 +210,43 @@ msgstr "" "práci pro svobodný software všude tam, kde je to nutné. Zvažte prosím " "možnost přispět na ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "povolit příkazy pro ladění" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "nepřeskakovat submoduly systému Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "nepřeskakovat podprojekty Meson" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "nepoužívat multiprocessing" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "definovat kořen projektu" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit jej" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "dílčí příkazy" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "přidání autorských práv a licencí do záhlaví souborů" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -95,94 +254,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Přidání autorských práv a licencí do záhlaví jednoho nebo více souborů.\n" -"\n" -"Pomocí parametrů --copyright a --license můžete určit, kteří držitelé " -"autorských práv a licencí mají být přidáni do záhlaví daných souborů.\n" -"\n" -"První komentář je nahrazen novou hlavičkou obsahující nové informace o " -"autorských právech a licencích a její původní autorská práva a licence. " -"Pokud chcete zachovat první komentář nedotčený, použijte parametr --no-" -"replace.\n" -"\n" -"Styl komentáře by měl být pro vaše soubory automaticky detekován. Pokud se " -"styl komentáře nepodařilo zjistit a není zadána možnost --skip-unrecognised, " -"proces se přeruší. Pomocí --style určete nebo přepište styl komentáře, který " -"se má použít.\n" -"\n" -"Pokud je k dispozici jednořádkový styl komentáře, použije se tento styl. " -"Pokud není k dispozici jednořádkový styl komentáře, použije se víceřádkový " -"styl komentáře. Určitý styl komentáře můžete vynutit pomocí parametrů --" -"single-line nebo --multi-line.\n" -"\n" -"Šablonu komentáře záhlaví můžete změnit pomocí příkazu --template. Umístěte " -"šablonu Jinja2 do souboru .reuse/templates/mytemplate.jinja2. Šablonu můžete " -"použít zadáním '--template mytemplate'. Přečtěte si online dokumentaci, jak " -"tuto funkci používat.\n" -"\n" -"Pokud je detekován binární soubor nebo pokud je zadán parametr --explicit-" -"license, je hlavička umístěna do souboru .license." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Stáhněte si licenci a umístěte ji do adresáře LICENSES/.\n" -"\n" -"Adresář LICENSES/ se automaticky vyhledává v následujícím pořadí:\n" -"\n" -"- Adresář LICENSES/ v kořenovém adresáři úložiště VCS.\n" -"\n" -"- Aktuální adresář, pokud je jeho název LICENSES.\n" -"\n" -"- Adresář LICENSES/ v aktuálním adresáři.\n" -"\n" -"Pokud adresář LICENSES/ nelze nalézt, je jednoduše vytvořen." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "inicializace projektu REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "stáhněte si licenci a umístěte ji do adresáře LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "seznam všech nevyhovujících souborů" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -218,72 +306,75 @@ msgstr "" "\n" "- Mají všechny soubory platné informace o autorských právech a licencích?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "vytisknout výkaz materiálu projektu ve formátu SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "seznam všech podporovaných licencí SPDX" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, fuzzy, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr ".reuse/dep5 nelze analyzovat jako utf-8" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Nepodařilo se analyzovat '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' není soubor" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' není adresář" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "nelze otevřít '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "nelze zapisovat do adresáře '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "nelze zapisovat do '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "nelze číst ani zapisovat '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' není platný výraz SPDX, přeruší se" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' není platný identifikátor licence SPDX." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Měl jste na mysli:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -291,308 +382,314 @@ msgstr "" "Seznam platných identifikátorů licence SPDX naleznete na adrese ." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Vytvoření .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Licence SPDX Identifikátor licence" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "stáhnout všechny chybějící licence zjištěné v projektu" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Chyba: {spdx_identifier} již existuje." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Chyba: Nepodařilo se stáhnout licenci." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Funguje vaše internetové připojení?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Úspěšně stažen {spdx_identifier}." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output nemá žádný účinek, pokud se použije společně s --all" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "jsou vyžadovány tyto argumenty: licence" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "nelze použít --output s více než jednou licencí" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " -"výrazy" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." -msgstr "Pod jakou licencí je váš projekt? Uveďte identifikátor licence SPDX." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +msgstr "" -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Pod jakou jinou licencí je váš projekt? Uveďte identifikátor licence SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Chcete-li přidávání licencí ukončit, stiskněte klávesu RETURN." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Projekt je již inicializován" -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Inicializace projektu REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Jaký je název projektu?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Jaká je internetová adresa projektu?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Jak se jmenuje správce?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Jaká je e-mailová adresa správce?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Hotovo! Inicializuje se." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} již existuje" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Nelze stáhnout {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Vytvoření .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Inicializace dokončena." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"ve vygenerovaném komentáři chybí řádky s autorskými právy nebo licenční " +"výrazy" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "NEVHODNÉ LICENCE" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' nalezeno v:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "ZASTARALÉ LICENCE" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Následující licence jsou v SPDX zrušeny:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCE BEZ KONCOVKY SOUBORU" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Následující licence nemají příponu souboru:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "CHYBĚJÍCÍ LICENCE" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "NEPOUŽITÉ LICENCE" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Následující licence nejsou používány:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "CHYBY ČTENÍ" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Nelze načíst:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "CHYBĚJÍCÍ INFORMACE O AUTORSKÝCH PRÁVECH A LICENCÍCH" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Následující soubory neobsahují žádné informace o autorských právech a " "licencích:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Následující soubory nemají žádné informace o autorských právech:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Následující soubory neobsahují žádné licenční informace:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "SHRNUTÍ" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Neplatné licence:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Zastaralé licence:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licence bez přípony souboru:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Chybějící licence:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Nepoužité licence:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Použité licence:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Chyby čtení: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "Soubory s informacemi o autorských právech: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "Soubory s licenčními informacemi: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Gratulujeme! Váš projekt je v souladu s verzí {} specifikace REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "Váš projekt bohužel není v souladu s verzí {} specifikace REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Zastaralé licence:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licence bez přípony souboru:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Nepoužité licence:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' není platný identifikátor licence SPDX." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' zahrnuto v .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' obsahuje výraz SPDX, který nelze analyzovat a soubor se přeskočí" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "určující identifikátor '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} nemá příponu souboru" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -605,30 +702,30 @@ msgstr "" "adrese nebo zda začíná znakem 'LicenseRef-' a " "zda má příponu souboru." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} je identifikátor licence SPDX jak {path}, tak {other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Nepodařilo se načíst '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Při analýze souboru '{path}' došlo k neočekávané chybě" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -636,7 +733,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -645,14 +742,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -661,7 +758,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -670,18 +767,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -869,138 +966,162 @@ msgstr "neplatná volba: %(value)r (vyberte z %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 obsahuje chyby syntaxe" - -#~ msgid "optional arguments" -#~ msgstr "nepovinné argumenty" +#~ msgid "initialize REUSE project" +#~ msgstr "inicializace projektu REUSE" #, fuzzy -#~ msgid "deprecated in favor of annotate" -#~ msgstr "'reuse addheader' bylo zrušeno ve prospěch 'reuse annotate'" - #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' nepodporuje jednořádkové komentáře, nepoužívejte prosím --single-" -#~ "line" +#~ "Pod jakou licencí je váš projekt? Uveďte identifikátor licence SPDX." #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "'{path}' nepodporuje víceřádkové komentáře, nepoužívejte --multi-line" +#~ "Pod jakou jinou licencí je váš projekt? Uveďte identifikátor licence SPDX." -#~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" -#~ msgstr "" -#~ "Následující soubory nemají rozpoznanou příponu. Použijte prosím --style, " -#~ "--force-dot-licence nebo --skip-unrecognised:" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Chcete-li přidávání licencí ukončit, stiskněte klávesu RETURN." -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Přeskočen nerozpoznaný soubor {path}" +#~ msgid "Project already initialized" +#~ msgstr "Projekt je již inicializován" -#, fuzzy -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Přeskočený soubor '{path}' již obsahuje informace SPDX" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Inicializace projektu REUSE." -#~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." -#~ msgstr "" -#~ "Chyba: Chybí řádky s autorskými právy nebo licenční výrazy v generovaném " -#~ "záhlaví komentáře pro '{path}'. Šablona je pravděpodobně nesprávná. " -#~ "Nepodařilo se zapsat novou hlavičku." +#~ msgid "What is the name of the project?" +#~ msgstr "Jaký je název projektu?" -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Úspěšně změněna hlavička {path}" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Jaká je internetová adresa projektu?" -#~ msgid "copyright statement, repeatable" -#~ msgstr "prohlášení o autorských právech, opakovatelné" - -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identifikátor SPDX, opakovatelný" - -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identifikátor SPDX, opakovatelný" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Jak se jmenuje správce?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "rok vydání prohlášení o autorských právech, nepovinné" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Jaká je e-mailová adresa správce?" -#~ msgid "comment style to use, optional" -#~ msgstr "styl komentáře, který se má použít, nepovinné" +#~ msgid "All done! Initializing now." +#~ msgstr "Hotovo! Inicializuje se." -#~ msgid "copyright style to use, optional" -#~ msgstr "styl autorských práv, který se má použít, nepovinné" +#~ msgid "{} already exists" +#~ msgstr "{} již existuje" -#~ msgid "name of template to use, optional" -#~ msgstr "název šablony, která se má použít, nepovinné" +#~ msgid "Could not download {}" +#~ msgstr "Nelze stáhnout {}" -#~ msgid "do not include year in statement" -#~ msgstr "neuvádět rok v prohlášení" +#~ msgid "Initialization complete." +#~ msgstr "Inicializace dokončena." -#~ msgid "merge copyright lines if copyright statements are identical" +#, fuzzy +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." #~ msgstr "" -#~ "sloučit řádky s autorskými právy, pokud jsou prohlášení o autorských " -#~ "právech totožná" - -#~ msgid "force single-line comment style, optional" -#~ msgstr "vynutit jednořádkový styl komentáře, nepovinné" - -#~ msgid "force multi-line comment style, optional" -#~ msgstr "vynutit víceřádkový styl komentáře, nepovinné" +#~ "Přidání autorských práv a licencí do záhlaví jednoho nebo více souborů.\n" +#~ "\n" +#~ "Pomocí parametrů --copyright a --license můžete určit, kteří držitelé " +#~ "autorských práv a licencí mají být přidáni do záhlaví daných souborů.\n" +#~ "\n" +#~ "První komentář je nahrazen novou hlavičkou obsahující nové informace o " +#~ "autorských právech a licencích a její původní autorská práva a licence. " +#~ "Pokud chcete zachovat první komentář nedotčený, použijte parametr --no-" +#~ "replace.\n" +#~ "\n" +#~ "Styl komentáře by měl být pro vaše soubory automaticky detekován. Pokud " +#~ "se styl komentáře nepodařilo zjistit a není zadána možnost --skip-" +#~ "unrecognised, proces se přeruší. Pomocí --style určete nebo přepište styl " +#~ "komentáře, který se má použít.\n" +#~ "\n" +#~ "Pokud je k dispozici jednořádkový styl komentáře, použije se tento styl. " +#~ "Pokud není k dispozici jednořádkový styl komentáře, použije se " +#~ "víceřádkový styl komentáře. Určitý styl komentáře můžete vynutit pomocí " +#~ "parametrů --single-line nebo --multi-line.\n" +#~ "\n" +#~ "Šablonu komentáře záhlaví můžete změnit pomocí příkazu --template. " +#~ "Umístěte šablonu Jinja2 do souboru .reuse/templates/mytemplate.jinja2. " +#~ "Šablonu můžete použít zadáním '--template mytemplate'. Přečtěte si online " +#~ "dokumentaci, jak tuto funkci používat.\n" +#~ "\n" +#~ "Pokud je detekován binární soubor nebo pokud je zadán parametr --explicit-" +#~ "license, je hlavička umístěna do souboru .license." -#~ msgid "write a .license file instead of a header inside the file" -#~ msgstr "zapsat soubor .license místo hlavičky uvnitř souboru" - -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "zpětně přidat hlavičky ke všem souborům v zadaných adresářích" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Stáhněte si licenci a umístěte ji do adresáře LICENSES/.\n" +#~ "\n" +#~ "Adresář LICENSES/ se automaticky vyhledává v následujícím pořadí:\n" +#~ "\n" +#~ "- Adresář LICENSES/ v kořenovém adresáři úložiště VCS.\n" +#~ "\n" +#~ "- Aktuální adresář, pokud je jeho název LICENSES.\n" +#~ "\n" +#~ "- Adresář LICENSES/ v aktuálním adresáři.\n" +#~ "\n" +#~ "Pokud adresář LICENSES/ nelze nalézt, je jednoduše vytvořen." -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "nenahrazovat první hlavičku v souboru, ale přidat novou" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 obsahuje chyby syntaxe" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "přeskočit soubory s nerozpoznanými styly komentářů" +#~ msgid "optional arguments" +#~ msgstr "nepovinné argumenty" #, fuzzy -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "přeskočit soubory, které již obsahují informace SPDX" +#~ msgid "deprecated in favor of annotate" +#~ msgstr "'reuse addheader' bylo zrušeno ve prospěch 'reuse annotate'" #~ msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" #~ msgstr "'reuse addheader' bylo zrušeno ve prospěch 'reuse annotate'" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "je vyžadována volba --copyright nebo --licence" - #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "volby --exclude-year a --year se vzájemně vylučují" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "volby --single-line a --multi-line se vzájemně vylučují" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "" -#~ "--skip-unrecognised nemá žádný účinek, pokud se použije společně s --style" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license bylo zrušeno ve prospěch --force-dot-license" -#~ msgid "template {template} could not be found" -#~ msgstr "šablonu {template} se nepodařilo najít" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' je binární soubor, proto použijte '{new_path}' pro hlavičku" - #~ msgid "Downloading {}" #~ msgstr "Stahování {}" diff --git a/po/de.po b/po/de.po index f87718b91..89cef8ba6 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2024-01-08 20:06+0000\n" "Last-Translator: Johannes Keyser \n" "Language-Team: German for more information, and " @@ -28,7 +184,7 @@ msgstr "" "überprüfen. Mehr Informationen finden Sie auf oder " "in der Online-Dokumentation auf ." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -36,11 +192,11 @@ msgstr "" "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" "Spezifikation." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Die Arbeit der FSFE unterstützen:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -50,44 +206,44 @@ msgstr "" "ermöglichen es uns, weiterhin für Freie Software zu arbeiten, wo immer es " "nötig ist. Bitte erwägen Sie eine Spende unter ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "Debug-Statements aktivieren" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "„Veraltet“-Warnung verbergen" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "Git-Submodules nicht überspringen" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "Meson-Teilprojekte nicht überspringen" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "kein Multiprocessing verwenden" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "Stammverzeichnis des Projekts bestimmen" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "zeige die Versionsnummer des Programms und beende" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "Unterkommandos" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -95,101 +251,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Hinzufügen von Urheberrechten und Lizenzen in die Kopfzeilen einer oder " -"mehrerer Dateien.\n" -"\n" -"Durch die Verwendung von --copyright und --license können Sie festlegen, " -"welche Urheberrechtsinhaber und Lizenzen den Kopfzeilen der angegebenen " -"Dateien hinzuzufügen werden.\n" -"\n" -"Durch die Verwendung von --contributor können Sie Personen oder " -"Organisationen angeben, die beigetragen haben, aber keine " -"Urheberrechtsinhaber der angegebenen Dateien sind.\n" -"Das erste Kommentar wird durch einer neuen Kopfzeile ersetzt, die die neuen " -"Urheberrechts- und Lizenzierungsinformationen sowie das frühere Urheberrecht " -"und die Lizenzierung enthält. Wenn Sie das erste Kommentar erhalten möchten, " -"verwenden Sie --no-replace.\n" -"\n" -"Der Kommentarstil sollte für Ihre Dateien automatisch erkannt werden. Wenn " -"ein Kommentastil nicht erkannt werden konnte und --skip-unrecognised nicht " -"angegeben wurde, wird der Prozess abgebrochen. Verwenden Sie --style, um den " -"Kommentarstil anzugeben oder zu überschreiben.\n" -"\n" -"Ein einzeiliger Kommentarstil wird verwendet, sofern einer verfügbar ist. " -"Falls kein einzeiliger Kommentarstil verfügbar ist, wird ein mehrzeiliger " -"Kommentarstil verwendet. Sie können einen bestimmten Kommentarstil mit --" -"single-line oder --multi-line erzwingen.\n" -"\n" -"Sie können die Schablone der Kopfzeilen-Kommentare ändern, indem Sie --" -"template verwenden. Speichern Sie eine Jinja2-Schablone in .reuse/templates/" -"meineschablone.jinja2. Sie können die Schablone verwenden, indem Sie \"--" -"template meineschablone\" angeben. Lesen Sie die Online-Dokumentation über " -"die Nutzung dieser Funktion.\n" -"\n" -"Wird eine binäre Datei erkannt wird oder --force-dot-license angegeben ist, " -"werden die Kopfzeilen in eine .license-Datei geschrieben." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/.\n" -"\n" -"Das LICENSES/-Verzeichnis wird automatisch in dieser Reihenfolge gesucht:\n" -"\n" -"- Das LICENSES/-Verzeichnis im Wurzelverzeichnis des VCS-Repositorys.\n" -"\n" -"- Das aktuelle Verzeichnis wenn dessen Name LICENSES ist.\n" -"\n" -"- Das LICENSES/-Verzeichnis im aktuellen Verzeichnis.\n" -"\n" -"Wenn das LICENSES/-Verzeichnis nicht gefunden werden kann, wird einfach " -"eines erstellt." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "REUSE-Projekt initialisieren" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "alle nicht-konformen Dateien zeigen" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -227,74 +305,78 @@ msgstr "" "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " "versehen?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "Komponentenliste im SPDX-Format ausgeben" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "Listet alle unterstützten SPDX-Lizenzen auf" -#: src/reuse/_main.py:295 -#, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 +#, fuzzy, python-brace-format +msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' konnte nicht als UTF-8 decodiert werden." -#: src/reuse/_main.py:302 -#, python-brace-format +#: src/reuse/_main.py:269 +#, fuzzy, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" "'{dep5}' konnte nicht geparst werden. Wir erhielten folgende Fehlermeldung: " "{message}" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "Keine datei '{}' oder konnte sie nicht lesen" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " +"Überspringe Datei" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' ist keine Datei" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' ist kein Verzeichnis" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "kann '{}' nicht öffnen" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "kann nicht in Verzeichnis '{}' schreiben" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "kann nicht in '{}' schreiben" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "kann '{}' nicht lesen oder schreiben" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Meinten Sie:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -302,251 +384,215 @@ msgstr "" "Besuchen Sie für eine Liste von gültigen SPDX-" "Lizenz-Identifikatoren." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Erstelle .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "SPDX-Lizenz-Identifikator der Lizenz" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fehler: {spdx_identifier} existiert bereits." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "Fehler: {path} existiert nicht." -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Funktioniert Ihre Internetverbindung?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} erfolgreich heruntergeladen." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output hat keinen Effekt, wenn es zusammen mit --all benutzt wird" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "Die folgenden Argumente sind erforderlich: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Unter welcher Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" -"Identifikator an. Sehen Sie die Liste auf ." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Unter welcher anderen Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" -"Identifikator an." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Um keine weiteren Lizenzen hinzuzufügen, drücken Sie ENTER." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Projekt bereits initialisiert" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Initialisiere Projekt für REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Was ist der Name des Projekts?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Was ist die Internetadresse des Projekts?" -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Was ist der Name der Betreuenden?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Wie lautet die E-Mail-Adresse der Betreuenden?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Alles erledigt! Initialisiere jetzt." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" -msgstr "Empfangen von {}" - -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} existiert bereits" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." +msgstr "" -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Konnte {} nicht herunterladen" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -"Fehler: Konnte {path} nicht kopieren, bitte fügen Sie {lic}.txt manuell zum " -"Verzeichnis LICENCES/ hinzu." - -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Erstelle .reuse/dep5" -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Initialisierung vollständig." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "Verhindert Ausgabe" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "formatiert Ausgabe als JSON" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "formatiert Ausgabe als rohen Text" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +#, fuzzy +msgid "formats output as errors per line" +msgstr "formatiert Ausgabe als rohen Text" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "FALSCHE LIZENZEN" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' gefunden in:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "VERALTETE LIZENZEN" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Die folgenden Lizenzen wurden von SPDX als veraltetet gekennzeichnet:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LIZENZEN OHNE DATEIENDUNG" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Die folgenden Lizenzen haben keine Dateiendung:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "FEHLENDE LIZENZEN" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "NICHT VERWENDETE LIZENZEN" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Die folgenden Lizenzen werden nicht benutzt:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "LESEFEHLER" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Unlesbar:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FEHLENDE URHEBERRECHTS- UND LIZENZINFORMATIONEN" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Die folgenden Dateien haben keine Urheberrechts- und Lizenzinformationen:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Die folgenden Dateien haben keine Urheberrechtsinformationen:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Die folgenden Dateien haben keine Lizenzinformationen:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "ZUSAMMENFASSUNG" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Falsche Lizenzen:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Veraltete Lizenzen:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Lizenzen ohne Dateiendung:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Fehlende Lizenzen:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Unbenutzte Lizenzen:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Verwendete Lizenzen:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "Lesefehler:" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +#, fuzzy +msgid "Files with copyright information:" msgstr "Dateien mit Urheberrechtsinformationen:" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +#, fuzzy +msgid "Files with license information:" msgstr "Dateien mit Lizenzinformationen:" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -554,7 +600,7 @@ msgstr "" "Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" "Spezifikation :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -562,16 +608,62 @@ msgstr "" "Leider ist Ihr Projekt nicht konform mit Version {} der REUSE-" "Spezifikation :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "EMPFEHLUNGEN" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Veraltete Lizenzen:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Lizenzen ohne Dateiendung:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Unbenutzte Lizenzen:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' abgedeckt durch .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, fuzzy, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " @@ -581,43 +673,30 @@ msgstr "" "unkommentierbar gekennzeichnet; suche ihre Inhalte nicht nach REUSE-" "Informationen." -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' trägt einen SPDX-Ausdruck, der nicht geparst werden kann. " -"Überspringe Datei" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -"Urheberrechts- und Lizenzinformationen für '{original_path}' wurden sowohl " -"in '{path}' als auch in der DEP5-Datei unter '{dep5_path}' gefunden. Die " -"Informationen für diese beiden Quellen wurden zusammengelegt. In Zukunft " -"wird sich dieses Verhalten ändern, und Sie müssen explizit das Zusammenlegen " -"aktivieren. Siehe . Sie " -"müssen noch nichts tun. Ausführen mit `--suppress-deprecation`, um diese " -"Warnung zu verbergen." - -#: src/reuse/project.py:384 + +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "erkenne Identifikator von '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} hat keine Dateiendung" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -630,14 +709,14 @@ msgstr "" "Lizenzliste unter steht oder mit 'LicenseRef-' " "beginnt und eine Dateiendung hat." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} ist der SPDX-Lizenz-Identifikator von {path} und {other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -645,17 +724,17 @@ msgstr "" "Projekt '{}' ist kein VCS-Repository oder die benötigte VCS-Software ist " "nicht installiert" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -668,7 +747,7 @@ msgstr "" "beginnen nicht mit 'LicenseRef-'. FAQ zu benutzerdefinierten Lizenzen: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -682,7 +761,7 @@ msgstr "" "aktuelle Liste und ihre jeweiligen empfohlenen neuen Kennungen finden Sie " "hier: " -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -692,7 +771,7 @@ msgstr "" "Lizenztextdatei im Verzeichnis 'LICENSES' hat keine '.txt'-Dateierweiterung. " "Bitte benennen Sie die Datei(en) entsprechend um." -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -707,7 +786,7 @@ msgstr "" "fehlende zu erhalten. Für benutzerdefinierte Lizenzen (beginnend mit " "'LicenseRef-'), müssen Sie diese Dateien selbst hinzufügen." -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -722,18 +801,18 @@ msgstr "" "Lizenztext löschen, wenn Sie sicher sind, dass keine Datei oder Code-" "Schnipsel darunter lizenziert ist." -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -918,75 +997,183 @@ msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 hat Syntaxfehler" +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." +#~ msgstr "" +#~ "Urheberrechts- und Lizenzinformationen für '{original_path}' wurden " +#~ "sowohl in '{path}' als auch in der DEP5-Datei unter '{dep5_path}' " +#~ "gefunden. Die Informationen für diese beiden Quellen wurden " +#~ "zusammengelegt. In Zukunft wird sich dieses Verhalten ändern, und Sie " +#~ "müssen explizit das Zusammenlegen aktivieren. Siehe . Sie müssen noch nichts tun. Ausführen mit `--" +#~ "suppress-deprecation`, um diese Warnung zu verbergen." -#~ msgid "optional arguments" -#~ msgstr "Optionale Argumente" +#~ msgid "initialize REUSE project" +#~ msgstr "REUSE-Projekt initialisieren" + +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "Keine datei '{}' oder konnte sie nicht lesen" -#, fuzzy #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' hat keine erkannte Dateiendung, bitte verwenden Sie --style oder " -#~ "--explicit-license" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Fehler: Kann kein Kommentar für '{path}' erstellen" +#~ "Unter welcher Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" +#~ "Identifikator an. Sehen Sie die Liste auf ." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Fehler: Die generierten Kommentar-Kopfzeilen für '{path}' enthalten " -#~ "fehlende Urheberrechtszeilen oder Lizenzausdrücke. Die Vorlage ist " -#~ "wahrscheinlich falsch. Keine neuen Kopfzeile geschrieben." +#~ "Unter welcher anderen Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" +#~ "Identifikator an." -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Kopfzeilen von {path} erfolgreich geändert" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Um keine weiteren Lizenzen hinzuzufügen, drücken Sie ENTER." -#~ msgid "copyright statement, repeatable" -#~ msgstr "Urheberrechtsinformation, wiederholbar" +#~ msgid "Project already initialized" +#~ msgstr "Projekt bereits initialisiert" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX-Lizenz-Identifikator, wiederholbar" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Initialisiere Projekt für REUSE." -#~ msgid "file contributor, repeatable" -#~ msgstr "Dateimitwirkender, wiederholbar" +#~ msgid "What is the name of the project?" +#~ msgstr "Was ist der Name des Projekts?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "Jahr der Urheberrechtsinformation, optional" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Was ist die Internetadresse des Projekts?" -#~ msgid "comment style to use, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Was ist der Name der Betreuenden?" -#, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Wie lautet die E-Mail-Adresse der Betreuenden?" -#~ msgid "name of template to use, optional" -#~ msgstr "Name der zu verwendenden Vorlage, optional" +#~ msgid "All done! Initializing now." +#~ msgstr "Alles erledigt! Initialisiere jetzt." -#~ msgid "do not include year in statement" -#~ msgstr "füge kein Jahr in Angabe hinzu" +#~ msgid "Retrieving {}" +#~ msgstr "Empfangen von {}" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "Jahr der Urheberrechtsinformation, optional" +#~ msgid "{} already exists" +#~ msgstr "{} existiert bereits" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#~ msgid "Could not download {}" +#~ msgstr "Konnte {} nicht herunterladen" -#, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "zu benutzender Kommentarstil, optional" +#, python-brace-format +#~ msgid "" +#~ "Error: Could not copy {path}, please add {lic}.txt manually in the " +#~ "LICENCES/ directory." +#~ msgstr "" +#~ "Fehler: Konnte {path} nicht kopieren, bitte fügen Sie {lic}.txt manuell " +#~ "zum Verzeichnis LICENCES/ hinzu." -#~ msgid "option --contributor, --copyright or --license is required" +#~ msgid "Initialization complete." +#~ msgstr "Initialisierung vollständig." + +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." #~ msgstr "" -#~ "Die Option --contributor, --copyright oder --license ist erforderlich" +#~ "Hinzufügen von Urheberrechten und Lizenzen in die Kopfzeilen einer oder " +#~ "mehrerer Dateien.\n" +#~ "\n" +#~ "Durch die Verwendung von --copyright und --license können Sie festlegen, " +#~ "welche Urheberrechtsinhaber und Lizenzen den Kopfzeilen der angegebenen " +#~ "Dateien hinzuzufügen werden.\n" +#~ "\n" +#~ "Durch die Verwendung von --contributor können Sie Personen oder " +#~ "Organisationen angeben, die beigetragen haben, aber keine " +#~ "Urheberrechtsinhaber der angegebenen Dateien sind.\n" +#~ "Das erste Kommentar wird durch einer neuen Kopfzeile ersetzt, die die " +#~ "neuen Urheberrechts- und Lizenzierungsinformationen sowie das frühere " +#~ "Urheberrecht und die Lizenzierung enthält. Wenn Sie das erste Kommentar " +#~ "erhalten möchten, verwenden Sie --no-replace.\n" +#~ "\n" +#~ "Der Kommentarstil sollte für Ihre Dateien automatisch erkannt werden. " +#~ "Wenn ein Kommentastil nicht erkannt werden konnte und --skip-unrecognised " +#~ "nicht angegeben wurde, wird der Prozess abgebrochen. Verwenden Sie --" +#~ "style, um den Kommentarstil anzugeben oder zu überschreiben.\n" +#~ "\n" +#~ "Ein einzeiliger Kommentarstil wird verwendet, sofern einer verfügbar ist. " +#~ "Falls kein einzeiliger Kommentarstil verfügbar ist, wird ein mehrzeiliger " +#~ "Kommentarstil verwendet. Sie können einen bestimmten Kommentarstil mit --" +#~ "single-line oder --multi-line erzwingen.\n" +#~ "\n" +#~ "Sie können die Schablone der Kopfzeilen-Kommentare ändern, indem Sie --" +#~ "template verwenden. Speichern Sie eine Jinja2-Schablone in .reuse/" +#~ "templates/meineschablone.jinja2. Sie können die Schablone verwenden, " +#~ "indem Sie \"--template meineschablone\" angeben. Lesen Sie die Online-" +#~ "Dokumentation über die Nutzung dieser Funktion.\n" +#~ "\n" +#~ "Wird eine binäre Datei erkannt wird oder --force-dot-license angegeben " +#~ "ist, werden die Kopfzeilen in eine .license-Datei geschrieben." + +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Lade eine Datei herunter und speichere sie im Verzeichnis LICENSES/.\n" +#~ "\n" +#~ "Das LICENSES/-Verzeichnis wird automatisch in dieser Reihenfolge " +#~ "gesucht:\n" +#~ "\n" +#~ "- Das LICENSES/-Verzeichnis im Wurzelverzeichnis des VCS-Repositorys.\n" +#~ "\n" +#~ "- Das aktuelle Verzeichnis wenn dessen Name LICENSES ist.\n" +#~ "\n" +#~ "- Das LICENSES/-Verzeichnis im aktuellen Verzeichnis.\n" +#~ "\n" +#~ "Wenn das LICENSES/-Verzeichnis nicht gefunden werden kann, wird einfach " +#~ "eines erstellt." + +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 hat Syntaxfehler" + +#~ msgid "optional arguments" +#~ msgstr "Optionale Argumente" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "" @@ -996,13 +1183,6 @@ msgstr "%(prog)s: Fehler: %(message)s\n" #~ msgstr "" #~ "Die Optionen --single-line und --multi-line schließen sich gegenseitig aus" -#~ msgid "template {template} could not be found" -#~ msgstr "Vorlage {template} konnte nicht gefunden werden" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' ist im Binärformat, benutze daher '{new_path}' für die Kopfzeilen" - #~ msgid "Downloading {}" #~ msgstr "Lade {} herunter" diff --git a/po/eo.po b/po/eo.po index 7559c16f5..7258f6aeb 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2024-01-17 12:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto for more information, and " @@ -28,17 +186,17 @@ msgstr "" "reuse.software/> por pli da informo, kaj por " "la reta dokumentado." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ĉi tiu versio de reuse kongruas al versio {} de la REUSE Specifo." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Subtenu la laboradon de FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -48,45 +206,44 @@ msgstr "" "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " "pripensi fari donacon ĉe ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "ŝalti sencimigajn ordonojn" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "kaŝi avertojn de evitindaĵoj" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "ne preterpasi Git-submodulojn" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "ne preterpasi Meson-subprojektojn" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "ne uzi plurprocesoradon" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "difini radikon de la projekto" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "montri versionumeron de programo kaj eliri" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "subkomandoj" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "aldoni kopirajtajn kaj permesilajn informojn en la kapojn de dosieroj" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -94,86 +251,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Aldoni kopirajtahn kaj permesilajn informojn en la kapojn de dosieroj.\n" -"\n" -"Tra uzi --copyright kaj --license, vi povas specifi kiujn kopirajtajn " -"proprulojn kaj permesilojn oni aldonu al la kapojn de la specifitaj " -"dosieroj.\n" -"\n" -"Oni aŭtomate eltrovos la komentstilon de viaj dosieroj. Se oni ne povas " -"eltrovi tion, la procezo haltas. Uzu --style por specifi aŭ superskribi la " -"uzendan komentstilon.\n" -"\n" -"Vi povas ŝanĝi la ŝablonon de la kapo tra uzi --template. Metu Jinja2-" -"ŝablonon en .reuse/templates/miaŝablono.jinja2. Vi povas uzi la ŝablonon tra " -"specifi '--template miaŝablono'. Legu la reta dokumentado por pli da " -"informoj pri ĉi tiu funkcio.\n" -"\n" -"Se oni detektas duuman dosieron, aŭ se vi specifas --explicit-license, la " -"kapon oni metas en .license-dosieron.\n" -"\n" -"GRAVA: Ĉi tio estas ĉimomente PROVCELA!" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon.\n" -"\n" -"La LICENSES-dosierujon oni aŭtomate trovas tiel, en ordo:\n" -"\n" -"- La LICENSES/-dosierujo en la radiko de la VCS-deponejo.\n" -"\n" -"- La aktuala dosierujo se ĝia nomo ests LICENSES.\n" -"\n" -"- La LICENSES/-dosierujo sub la aktuala dosierujo.\n" -"\n" -"Se oni ne povas trovi la LICENSES/-dosierujon, oni kreos ĝin." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "pravalorizi REUSE-projekton" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "listigi ĉiujn nekonformajn dosierojn" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -208,72 +302,76 @@ msgstr "" "\n" "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "presi la pecoliston de la projekto en SPDX-formo" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" -#: src/reuse/_main.py:295 -#, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 +#, fuzzy, python-brace-format +msgid "'{path}' could not be decoded as UTF-8." msgstr "ne povis malkodi '{dep5}' kiel UTF-8." -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "neniu dosiero '{}' aŭ ne povis legi ĝin" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante la " +"dosieron" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' ne estas dosiero" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' ne estas dosierujo" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "ne povas malfermi '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "ne povas skribi al dosierujo '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "ne povas skribi al '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "ne povas legi aŭ skribi '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ne estas valida SPDX Permesila Identigilo." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Ĉu vi intencis:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -281,308 +379,311 @@ msgstr "" "Vidu por listo de validaj SPDX Permesilaj " "Identigiloj." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Krante .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "SPDX Permesila Identigilo de permesilo" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "elŝuti ĉiujn mankantajn permesilojn kiujn oni eltrovis en la projekto" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Eraro: {spdx_identifier} jam ekzistas." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' ne finiĝas per .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Eraro: Malsukcesis elŝuti permesilon." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Ĉu via retkonekto funkcias?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Sukceses elŝutis {spdx_identifier}." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output faras nenion kiam --all ankaŭ uziĝas" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "la sekvaj argumentoj nepras: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "ne povas uzi --output kun pli ol unu permesilo" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Sub kiu permesilo estas via projekto? Provizu la SPDX Permesilan Identigilon." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Sub kiuj aliaj permesiloj estas via projekto? Provizu la SPDX Permesilan " -"Identigilon." -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Por ĉesigi aldonadon de permesiloj, premu la enigan klavon." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Projekto jam pravalorizita" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Pravalorizante projekton por REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Kiu estas la nomo de la projekto?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Kiu estas la reta adreso de la projekto?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Kiu estas la nomo de la daŭriganto?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Kiu estas la retpoŝtadreso de la daŭriganto?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Tute farita! Pravalorizante nun." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} jam ekzistas" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Ne povis elŝuti {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Krante .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Finfaris pravalorizadon." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "MALBONAJ PERMESILOJ" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' trovita en:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "ARĤAIKIGITAJ PERMESILOJ" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "La sekvajn permesilojn arĥaikigis SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "PERMESILOJ SEN DOSIERSUFIKSO" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "La sekvaj permesiloj ne havas dosiersufikson:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "MANKANTAJ PERMESILOJ" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "NEUZATAJ PERMESILOJ" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "La sekvajn permesilojn oni ne uzas:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "LEG-ERAROJ" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Ne povis legi:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANKANTAJ KOPIRAJTAJ KAJ PERMESILAJ INFORMOJ" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn kaj permesilajn informojn:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn informojn:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "La sekvaj dosieroj ne havas permesilajn informojn:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Malbonaj permesiloj:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Arĥaikigitaj permesiloj:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Permesiloj sen dosiersufikso:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Mankantaj permesiloj:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Neuzataj permesiloj:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Uzataj permesiloj:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Leg-eraroj: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "Dosieroj sen permesilinformo: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Gratulon! Via projekto konformas al versio {} de la REUSE Specifo :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Bedaŭrinde, via projekto ne konformas al versio {} de la REUSE Specifo :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Arĥaikigitaj permesiloj:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Permesiloj sen dosiersufikso:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Neuzataj permesiloj:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' ne estas valida SPDX Permesila Identigilo." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' sub .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' entenas SPDX-esprimon, kiun oni ne povas analizi; preterpasante la " -"dosieron" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "precizigante identigilon de '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} ne havas dosiersufikson" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -594,7 +695,7 @@ msgstr "" "Certigu ke la permesilo estas en la listo ĉe aŭ " "ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -602,23 +703,23 @@ msgstr "" "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " "{other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -626,7 +727,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -635,14 +736,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -651,7 +752,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -660,18 +761,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -856,96 +957,144 @@ msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eraro: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 havas sintaksajn erarojn" +#~ msgid "initialize REUSE project" +#~ msgstr "pravalorizi REUSE-projekton" -#~ msgid "optional arguments" -#~ msgstr "malnepraj argumentoj" - -#~ msgid "deprecated in favor of annotate" -#~ msgstr "evitindigita favore al annotate" +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "neniu dosiero '{}' aŭ ne povis legi ĝin" +#, fuzzy #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' ne subtenas unuopliniajn komentojn, bonvolu ne uzi --single-line" +#~ "Sub kiu permesilo estas via projekto? Provizu la SPDX Permesilan " +#~ "Identigilon." #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "'{path}' ne subtenas plurliniajn komentojn, bonvolu ne uzi --multi-line" +#~ "Sub kiuj aliaj permesiloj estas via projekto? Provizu la SPDX Permesilan " +#~ "Identigilon." -#, fuzzy -#~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" -#~ msgstr "" -#~ "La sekvaj dosieroj ne havas konatan dosiersufikson. Bonvolu uzi --style, " -#~ "--force-dot-license aŭ --skip-unrecognised:" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Por ĉesigi aldonadon de permesiloj, premu la enigan klavon." -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Preterpasis nekonatan dosieron {path}" +#~ msgid "Project already initialized" +#~ msgstr "Projekto jam pravalorizita" -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Preterpasis dosieron '{path}' kiu jam enhavas REUSE-informojn" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Pravalorizante projekton por REUSE." -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Eraro: Ne povis krei komenton por '{path}'" +#~ msgid "What is the name of the project?" +#~ msgstr "Kiu estas la nomo de la projekto?" -#~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." -#~ msgstr "" -#~ "Eraro: Al generita komentkapo por '{path}' mankas kopirajtlinioj aŭ " -#~ "permesilesprimoj. La ŝablono probable malbonas. Ne skribis novan kapon." +#~ msgid "What is the internet address of the project?" +#~ msgstr "Kiu estas la reta adreso de la projekto?" -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Sukcese ŝanĝis kapon de {path}" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Kiu estas la nomo de la daŭriganto?" -#~ msgid "copyright statement, repeatable" -#~ msgstr "kopirajtlinio, ripetabla" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Kiu estas la retpoŝtadreso de la daŭriganto?" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Identigilo, ripetabla" +#~ msgid "All done! Initializing now." +#~ msgstr "Tute farita! Pravalorizante nun." -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "SPDX Identigilo, ripetabla" +#~ msgid "{} already exists" +#~ msgstr "{} jam ekzistas" -#~ msgid "year of copyright statement, optional" -#~ msgstr "jaro de kopirajtlinio, malnepra" +#~ msgid "Could not download {}" +#~ msgstr "Ne povis elŝuti {}" -#~ msgid "comment style to use, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "Initialization complete." +#~ msgstr "Finfaris pravalorizadon." #, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "uzenda komentstilo, malnepra" - -#~ msgid "name of template to use, optional" -#~ msgstr "nomo de uzenda ŝablono, malnepra" - -#~ msgid "do not include year in statement" -#~ msgstr "ne inkluzivi jaron en kopirajtlinio" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Aldoni kopirajtahn kaj permesilajn informojn en la kapojn de dosieroj.\n" +#~ "\n" +#~ "Tra uzi --copyright kaj --license, vi povas specifi kiujn kopirajtajn " +#~ "proprulojn kaj permesilojn oni aldonu al la kapojn de la specifitaj " +#~ "dosieroj.\n" +#~ "\n" +#~ "Oni aŭtomate eltrovos la komentstilon de viaj dosieroj. Se oni ne povas " +#~ "eltrovi tion, la procezo haltas. Uzu --style por specifi aŭ superskribi " +#~ "la uzendan komentstilon.\n" +#~ "\n" +#~ "Vi povas ŝanĝi la ŝablonon de la kapo tra uzi --template. Metu Jinja2-" +#~ "ŝablonon en .reuse/templates/miaŝablono.jinja2. Vi povas uzi la ŝablonon " +#~ "tra specifi '--template miaŝablono'. Legu la reta dokumentado por pli da " +#~ "informoj pri ĉi tiu funkcio.\n" +#~ "\n" +#~ "Se oni detektas duuman dosieron, aŭ se vi specifas --explicit-license, la " +#~ "kapon oni metas en .license-dosieron.\n" +#~ "\n" +#~ "GRAVA: Ĉi tio estas ĉimomente PROVCELA!" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "jaro de kopirajtlinio, malnepra" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Elŝuti permesilon kaj meti ĝin en la LICENSES/-dosierujon.\n" +#~ "\n" +#~ "La LICENSES-dosierujon oni aŭtomate trovas tiel, en ordo:\n" +#~ "\n" +#~ "- La LICENSES/-dosierujo en la radiko de la VCS-deponejo.\n" +#~ "\n" +#~ "- La aktuala dosierujo se ĝia nomo ests LICENSES.\n" +#~ "\n" +#~ "- La LICENSES/-dosierujo sub la aktuala dosierujo.\n" +#~ "\n" +#~ "Se oni ne povas trovi la LICENSES/-dosierujon, oni kreos ĝin." -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 havas sintaksajn erarojn" -#, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "uzenda komentstilo, malnepra" +#~ msgid "optional arguments" +#~ msgstr "malnepraj argumentoj" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "opcio --copyright aŭ --license necesas" +#~ msgid "deprecated in favor of annotate" +#~ msgstr "evitindigita favore al annotate" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" @@ -954,12 +1103,6 @@ msgstr "%(prog)s: eraro: %(message)s\n" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" -#~ msgid "template {template} could not be found" -#~ msgstr "ŝablono {template} netroveblas" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' estas duuma, tiel uzante '{new_path}' por la kapo" - #~ msgid "Downloading {}" #~ msgstr "Elŝutante {}" diff --git a/po/es.po b/po/es.po index 1e8e1210b..a8884fbf4 100644 --- a/po/es.po +++ b/po/es.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" -"PO-Revision-Date: 2023-11-01 20:04+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" +"PO-Revision-Date: 2024-05-09 08:19+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -17,9 +17,170 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.2-dev\n" +"X-Generator: Weblate 5.5.4-rc\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" +"'{path}' no admite comentarios de una sola línea, no utilices --single-line" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "'{path}' no admite comentarios multilínea, no utilices --multi-line" + +#: src/reuse/_annotate.py:136 +#, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "Se ha omitido el archivo no reconocido de '{path}'" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "'{path}' no se reconoce; creando '{path}.license'" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "Se ha omitido el archivo '{path}' que ya contiene información REUSE" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Error: No se pudo crear un comentario para '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Error: La cabecera de comentario generada para '{path}' carece del mensaje " +"de copyright o de las frases de licencia; la plantilla seguramente es " +"incorrecta. No se ha escrito una nueva cabecera." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "Cabecera de {path} correctamente cambiada" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" +"--skip-unrecognised no tiene efecto cuando se utiliza junto con --style" + +#: src/reuse/_annotate.py:231 +msgid "option --contributor, --copyright or --license is required" +msgstr "se requiere la opción --contributor, --copyright o --license" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "no pudo encontrarse la plantilla {template}" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "no se puede escribir en '{}'" + +#: src/reuse/_annotate.py:366 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"Los siguientes archivos no tienen una extensión reconocida. Utiliza --style, " +"--force-dot-license o --skip-unrecognised:" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "declaración de los derechos de autor, repetible" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Identificador SPDX, repetible" + +#: src/reuse/_annotate.py:395 +msgid "file contributor, repeatable" +msgstr "colaborador de archivos, repetible" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "año de la declaración de copyright; opcional" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "estilo de comentario a utilizar; opcional" + +#: src/reuse/_annotate.py:417 +#, fuzzy +msgid "copyright prefix to use, optional" +msgstr "estilo del copyright a utilizar, opcional" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "nombre de la plantilla a utilizar; opcional" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "no incluir el año en la declaración" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" +"fusionar las líneas del copyright si las declaraciones del copyright son " +"idénticas" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "forzar el estilo del comentario de una sola línea, opcional" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "forzar el estilo del comentario multilínea, opcional" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "" +"añadir las cabeceras a todos los archivos de los directorios especificados " +"de forma recursiva" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" + +#: src/reuse/_annotate.py:473 +#, fuzzy +msgid "always write a .license file instead of a header inside the file" +msgstr "" +"escribir un archivo .license en lugar de una cabecera dentro del archivo" + +#: src/reuse/_annotate.py:480 +#, fuzzy +msgid "write a .license file to files with unrecognised comment styles" +msgstr "omitir los archivos con estilos de comentario no reconocidos" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "omitir los archivos con estilos de comentario no reconocidos" + +#: src/reuse/_annotate.py:497 +msgid "skip files that already contain REUSE information" +msgstr "omitir los archivos que ya contienen la información REUSE" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' es un fichero binario: en consecuencia, se utiliza '{new_path}' " +"para la cabecera" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -30,7 +191,7 @@ msgstr "" "información, y para acceder a la " "documentación en línea." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -38,11 +199,11 @@ msgstr "" "Esta versión de reuse es compatible con la versión {} de la Especificación " "REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Apoya el trabajo de la FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -53,43 +214,43 @@ msgstr "" "necesario. Por favor, considera el hacer una donación en ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "habilita instrucciones de depuración" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "ocultar las advertencias de que está obsoleto" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "no omitas los submódulos de Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "no te saltes los subproyectos de Meson" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "no utilices multiproceso" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "define el origen del proyecto" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "muestra la versión del programa y sale" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "agrega el copyright y la licencia a la cabecera de los ficheros" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -97,96 +258,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Agregue derechos de autor y licencias al encabezado de uno o más archivos.\n" -"\n" -"Usando --copyright y --license, puede especificar qué titulares de derechos " -"de autor y licencias agregar a las cabeceras de los archivos dados.\n" -"\n" -"Usando --contributor, puede especificar personas o entidades que " -"contribuyeron, pero no tienen el copyright de los archivos dados.\n" -"El primer comentario se sustituye por un nuevo encabezado que contiene la " -"nueva información sobre los derechos de autor y licencias y su antigua " -"información. Si desea mantener intacto el primer comentario, use --no-" -"replace.\n" -"\n" -"El estilo del comentario debe ser auto-detectado para sus archivos. Si no se " -"pudo detectar un estilo de comentario y no se especifica --skip-" -"unrecognised, el proceso se aborta. Use --style para especificar o " -"sobreescribir el estilo de comentario a usar.\n" -"\n" -"Se utiliza un estilo de comentario de una sola línea cuando está disponible. " -"Si no hay un estilo de comentario de una sola línea, se utiliza un estilo de " -"comentario de varias líneas. Puede forzar un cierto estilo de comentario " -"usando --single-line o --multi-line.\n" -"\n" -"Puede cambiar la plantilla del comentario de la cabecera usando --template. " -"Coloque una plantilla Jinja2 en .reuse/templates/mytemplate.jinja2. Puede " -"usar la plantilla especificando '--template mytemplate'. Lea la " -"documentación en línea sobre cómo utilizar esta función.\n" -"\n" -"Si se detecta un archivo binario, o si se especifica --force-dot-license, la " -"cabecera se coloca en un archivo .license." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Descarga una licencia y guárdala en el directorio LICENSES/.\n" -"\n" -"El directorio LICENSES/ es automáticamente detectado en el siguiente orden:\n" -"\n" -"- El directorio LICENSES/ en la raíz del repositorio VCS.\n" -"\n" -"- El directorio actual, si su nombre es LICENSES.\n" -"\n" -"- El directorio LICENSES/ en el directorio actual.\n" -"\n" -"Si el directorio LICENSES/ no fuese encontrado, simplemente se creará uno." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "inicia el proyecto REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "descarga una licencia y guárdala en el directorio \"LICENSES/\"" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -223,74 +311,78 @@ msgstr "" "\n" "- ¿Tienen todos los ficheros información válida sobre copyright y licencia?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "imprime la lista de materiales del proyecto en formato SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "Lista de todas las licencias SPDX compatibles" -#: src/reuse/_main.py:295 -#, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 +#, fuzzy, python-brace-format +msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' no pudo ser decodificado como UTF-8." -#: src/reuse/_main.py:302 -#, python-brace-format +#: src/reuse/_main.py:269 +#, fuzzy, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" "{dep5}' no pudo ser analizado. Recibimos el siguiente mensaje de error: " "{message}" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "no hay un fichero '{}', o no se ha podido leer" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' posee una expresión SPDX que no puede ser procesada; omitiendo el " +"archivo" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' no es un fichero" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' no es un directorio" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "no se puede abrir '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "no se pude escribir en el directorio '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "no se puede escribir en '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "no se puede leer o escribir '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' no es una expresión SPDX válida; abortando" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' no es un Identificador SPDX de Licencia válido." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Querías decir:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -298,15 +390,20 @@ msgstr "" "Consulta para obtener un listado de los " "Identificadores SPDX de Licencia válidos." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Creando .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Identificador SPDX de la licencia" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" @@ -314,238 +411,197 @@ msgstr "" "fuente desde la que copiar las licencias LicenseRef- personalizadas, ya sea " "un directorio que contenga el archivo o el propio archivo" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Error: {spdx_identifier} ya existe." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "Error: {path} no existe." -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Error: Fallo al descargar la licencia." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "¿Está funcionando tu conexión a Internet?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} descargado con éxito." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output no tiene efecto cuando se utiliza junto con --all" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "se requieren los siguientes parámetros: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "no se puede utilizar --output con más de una licencia" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"el comentario generado carece del mensaje de copyright o de las frases de " -"licencia" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"¿Cuál es la licencia de tu proyecto? Indica el identificador de licencia " -"SPDX. Consulta la lista en ." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"¿Bajo qué otras licencias se encuentra tu proyecto? Proporciona el " -"Identificador SPDX de Licencia." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Para terminar de añadir licencias pulsa RETORNO." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Proyecto ya inicializado" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Inicializando el proyecto para REUSE." -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "¿Cuál es el nombre del proyecto?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "¿Cuál es la dirección de Internet del proyecto?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "¿Cuál es el nombre del mantenedor?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "¿Cuál es la dirección de correo electrónico del mantenedor?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "¡Ya hemos terminado! Iniciando." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" -msgstr "Recuperando {}" - -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} ya existe" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." +msgstr "" -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "No se pudo descargar {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -"Error: No se pudo copiar {path}, por favor añada {lic}.txt manualmente en el " -"directorio LICENCIAS/." - -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Creando .reuse/dep5" -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Inicialización completa." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"el comentario generado carece del mensaje de copyright o de las frases de " +"licencia" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "impide la producción" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "formato de salida JSON" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "formatea la salida como un texto plano" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +#, fuzzy +msgid "formats output as errors per line" +msgstr "formatea la salida como un texto plano" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "LICENCIAS MALAS" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' encontrado en:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "LICENCIAS OBSOLETAS" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Las siguientes licencias han quedado obsoletas según SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCIAS SIN EXTENSIÓN DE FICHERO" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Las siguientes licencias no tienen extensión de fichero:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "LICENCIAS NO ENCONTRADAS" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "LICENCIAS NO UTILIZADAS" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Las siguientes licencias no son utilizadas:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ERRORES DE LECTURA" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "No se pudo leer:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FALTA INFORMACIÓN SOBRE COPYRIGHT Y LICENCIA" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Los siguientes archivos carecen de información de copyright y licencia:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Los siguientes ficheros carecen de información de copyright:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Los siguientes ficheros carecen de información de licencia:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RESUMEN" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Licencias malas:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Licencias obsoletas:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licencias sin extensión de fichero:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Licencias no encontradas:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Licencias no utilizadas:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Licencias utilizadas:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "Errores de lectura:" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +#, fuzzy +msgid "Files with copyright information:" msgstr "archivos con información sobre los derechos de autor:" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +#, fuzzy +msgid "Files with license information:" msgstr "con información sobre las licencias:" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -553,7 +609,7 @@ msgstr "" "¡Enhorabuena! Tu proyecto es compatible con la versión {} de la " "Especificación REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -561,61 +617,94 @@ msgstr "" "Desafortunadamente, tu proyecto no es compatible con la versión {} de la " "Especificación REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "RECOMENDACIONES" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" -msgstr "'{path}' cubierto por .reuse/dep5" +msgid "{path}: bad license {lic}\n" +msgstr "" -#: src/reuse/project.py:239 +#: src/reuse/lint.py:296 #, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Licencias obsoletas:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licencias sin extensión de fichero:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Licencias no utilizadas:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' no es un Identificador SPDX de Licencia válido." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" +msgstr "'{path}' cubierto por .reuse/dep5" + +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 +#, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -"Se ha detectado que la '{path}' es un archivo binario o su extensión está " -"marcada como no comentable; no se busca información REUSE en su contenido." +"Se ha detectado que '{path}' es un archivo binario; no se ha buscado " +"información REUTILIZABLE en su contenido." -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' posee una expresión SPDX que no puede ser procesada; omitiendo el " -"archivo" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -"Se ha encontrado información sobre derechos de autor y licencias para " -"'{original_path}' tanto en '{path}' como en el archivo DEP5 ubicado en " -"'{dep5_path}'. La información de estas dos fuentes se ha agregado. En el " -"futuro, este comportamiento cambiará y tendrás que activar explícitamente la " -"agregación. Véase . Aún no es " -"necesario hacer nada. Ejecuta con `--suppress-deprecation` para ocultar esta " -"advertencia." - -#: src/reuse/project.py:384 + +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinando el identificador de '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} no tiene extensión de fichero" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -628,7 +717,7 @@ msgstr "" "alojada en , o de que empieza por 'LicenseRef-', " "y de que posee una extensión de fichero." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -636,7 +725,7 @@ msgstr "" "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " "{other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -644,17 +733,17 @@ msgstr "" "el proyecto '{}' no es un repositorio VCS o el software VCS requerido no " "está instalado" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -667,7 +756,7 @@ msgstr "" "'LicenseRef-'. Preguntas frecuentes sobre las licencias personalizadas: " "https://reuse.software/faq/#custom-license" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -681,7 +770,7 @@ msgstr "" "los nuevos identificadores recomendados se encuentran aquí: " -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -691,7 +780,7 @@ msgstr "" "con la licencia en el directorio 'LICENCIAS' no tiene una extensión '.txt'. " "Cambie el nombre de los archivos en consecuencia." -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -707,7 +796,7 @@ msgstr "" "En el caso de las licencias personalizadas (que empiezan por 'LicenseRef-'), " "deberá añadir estos archivos usted mismo." -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -722,7 +811,7 @@ msgstr "" "elimine el texto de la licencia no utilizado si está seguro de que ningún " "archivo o fragmento de código tiene una licencia como tal." -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -733,11 +822,11 @@ msgstr "" "archivos. Encontrará los archivos afectados en la parte superior como parte " "de los mensajes de los errores registrados." -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -935,141 +1024,202 @@ msgstr "opción inválida: %(value)r (opciones: %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 presenta errores de sintaxis" - -#~ msgid ".reuse/dep5 could not be parsed as utf-8" -#~ msgstr ".reuse/dep5 no pudo ser analizado como utf-8" +#, fuzzy, python-brace-format +#~ msgid "" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." +#~ msgstr "" +#~ "Se ha encontrado información sobre derechos de autor y licencias para " +#~ "'{original_path}' tanto en '{path}' como en el archivo DEP5 ubicado en " +#~ "'{dep5_path}'. La información de estas dos fuentes se ha agregado. En el " +#~ "futuro, este comportamiento cambiará y tendrás que activar explícitamente " +#~ "la agregación. Véase . Aún " +#~ "no es necesario hacer nada. Ejecuta con `--suppress-deprecation` para " +#~ "ocultar esta advertencia." -#~ msgid "optional arguments" -#~ msgstr "argumentos opcionales" +#~ msgid "initialize REUSE project" +#~ msgstr "inicia el proyecto REUSE" -#~ msgid "deprecated in favor of annotate" -#~ msgstr "obsoleto en favor de annotate" +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "no hay un fichero '{}', o no se ha podido leer" #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' no admite comentarios de una sola línea, no utilices --single-" -#~ "line" - -#~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" -#~ msgstr "'{path}' no admite comentarios multilínea, no utilices --multi-line" +#~ "¿Cuál es la licencia de tu proyecto? Indica el identificador de licencia " +#~ "SPDX. Consulta la lista en ." #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Los siguientes archivos no tienen una extensión reconocida. Utiliza --" -#~ "style, --force-dot-license o --skip-unrecognised:" - -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Se omitió el archivo {path} no reconocido" +#~ "¿Bajo qué otras licencias se encuentra tu proyecto? Proporciona el " +#~ "Identificador SPDX de Licencia." -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Se ha omitido el archivo '{path}' que ya contiene información REUSE" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Para terminar de añadir licencias pulsa RETORNO." -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Error: No se pudo crear un comentario para '{path}'" - -#~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." -#~ msgstr "" -#~ "Error: La cabecera de comentario generada para '{path}' carece del " -#~ "mensaje de copyright o de las frases de licencia; la plantilla " -#~ "seguramente es incorrecta. No se ha escrito una nueva cabecera." +#~ msgid "Project already initialized" +#~ msgstr "Proyecto ya inicializado" -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Cabecera de {path} correctamente cambiada" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Inicializando el proyecto para REUSE." -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaración de los derechos de autor, repetible" +#~ msgid "What is the name of the project?" +#~ msgstr "¿Cuál es el nombre del proyecto?" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX, repetible" +#~ msgid "What is the internet address of the project?" +#~ msgstr "¿Cuál es la dirección de Internet del proyecto?" -#~ msgid "file contributor, repeatable" -#~ msgstr "colaborador de archivos, repetible" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "¿Cuál es el nombre del mantenedor?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "año de la declaración de copyright; opcional" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "¿Cuál es la dirección de correo electrónico del mantenedor?" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentario a utilizar; opcional" +#~ msgid "All done! Initializing now." +#~ msgstr "¡Ya hemos terminado! Iniciando." -#~ msgid "copyright style to use, optional" -#~ msgstr "estilo del copyright a utilizar, opcional" +#~ msgid "Retrieving {}" +#~ msgstr "Recuperando {}" -#~ msgid "name of template to use, optional" -#~ msgstr "nombre de la plantilla a utilizar; opcional" +#~ msgid "{} already exists" +#~ msgstr "{} ya existe" -#~ msgid "do not include year in statement" -#~ msgstr "no incluir el año en la declaración" +#~ msgid "Could not download {}" +#~ msgstr "No se pudo descargar {}" -#~ msgid "merge copyright lines if copyright statements are identical" +#, python-brace-format +#~ msgid "" +#~ "Error: Could not copy {path}, please add {lic}.txt manually in the " +#~ "LICENCES/ directory." #~ msgstr "" -#~ "fusionar las líneas del copyright si las declaraciones del copyright son " -#~ "idénticas" - -#~ msgid "force single-line comment style, optional" -#~ msgstr "forzar el estilo del comentario de una sola línea, opcional" +#~ "Error: No se pudo copiar {path}, por favor añada {lic}.txt manualmente en " +#~ "el directorio LICENCIAS/." -#~ msgid "force multi-line comment style, optional" -#~ msgstr "forzar el estilo del comentario multilínea, opcional" +#~ msgid "Initialization complete." +#~ msgstr "Inicialización completa." -#~ msgid "write a .license file instead of a header inside the file" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." #~ msgstr "" -#~ "escribir un archivo .license en lugar de una cabecera dentro del archivo" +#~ "Agregue derechos de autor y licencias al encabezado de uno o más " +#~ "archivos.\n" +#~ "\n" +#~ "Usando --copyright y --license, puede especificar qué titulares de " +#~ "derechos de autor y licencias agregar a las cabeceras de los archivos " +#~ "dados.\n" +#~ "\n" +#~ "Usando --contributor, puede especificar personas o entidades que " +#~ "contribuyeron, pero no tienen el copyright de los archivos dados.\n" +#~ "El primer comentario se sustituye por un nuevo encabezado que contiene la " +#~ "nueva información sobre los derechos de autor y licencias y su antigua " +#~ "información. Si desea mantener intacto el primer comentario, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "El estilo del comentario debe ser auto-detectado para sus archivos. Si no " +#~ "se pudo detectar un estilo de comentario y no se especifica --skip-" +#~ "unrecognised, el proceso se aborta. Use --style para especificar o " +#~ "sobreescribir el estilo de comentario a usar.\n" +#~ "\n" +#~ "Se utiliza un estilo de comentario de una sola línea cuando está " +#~ "disponible. Si no hay un estilo de comentario de una sola línea, se " +#~ "utiliza un estilo de comentario de varias líneas. Puede forzar un cierto " +#~ "estilo de comentario usando --single-line o --multi-line.\n" +#~ "\n" +#~ "Puede cambiar la plantilla del comentario de la cabecera usando --" +#~ "template. Coloque una plantilla Jinja2 en .reuse/templates/mytemplate." +#~ "jinja2. Puede usar la plantilla especificando '--template mytemplate'. " +#~ "Lea la documentación en línea sobre cómo utilizar esta función.\n" +#~ "\n" +#~ "Si se detecta un archivo binario, o si se especifica --force-dot-license, " +#~ "la cabecera se coloca en un archivo .license." -#~ msgid "add headers to all files under specified directories recursively" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." #~ msgstr "" -#~ "añadir las cabeceras a todos los archivos de los directorios " -#~ "especificados de forma recursiva" +#~ "Descarga una licencia y guárdala en el directorio LICENSES/.\n" +#~ "\n" +#~ "El directorio LICENSES/ es automáticamente detectado en el siguiente " +#~ "orden:\n" +#~ "\n" +#~ "- El directorio LICENSES/ en la raíz del repositorio VCS.\n" +#~ "\n" +#~ "- El directorio actual, si su nombre es LICENSES.\n" +#~ "\n" +#~ "- El directorio LICENSES/ en el directorio actual.\n" +#~ "\n" +#~ "Si el directorio LICENSES/ no fuese encontrado, simplemente se creará uno." -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "no sustituyas la primera cabecera del archivo; añade una nueva" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 presenta errores de sintaxis" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "omitir los archivos con estilos de comentario no reconocidos" +#~ msgid ".reuse/dep5 could not be parsed as utf-8" +#~ msgstr ".reuse/dep5 no pudo ser analizado como utf-8" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "omitir los archivos que ya contienen la información REUSE" +#~ msgid "optional arguments" +#~ msgstr "argumentos opcionales" + +#~ msgid "deprecated in favor of annotate" +#~ msgstr "obsoleto en favor de annotate" #~ msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" #~ msgstr "" #~ "\"reuse addheader\" ha quedado obsoleto en favor de \"reuse annotate\"" -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "se requiere la opción --contributor, --copyright o --license" - #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "las opciones -exclude-year y --year son mutuamente excluyentes" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "las opciones --single-line y --multi-line se excluyen mutuamente" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "" -#~ "--skip-unrecognised no tiene efecto cuando se utiliza junto con --style" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "" #~ "--explicit-license ha quedado obsoleto en favor de --force-dot-license" -#~ msgid "template {template} could not be found" -#~ msgstr "no pudo encontrarse la plantilla {template}" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' es un fichero binario: en consecuencia, se utiliza '{new_path}' " -#~ "para la cabecera" - #~ msgid "Downloading {}" #~ msgstr "Descargando {}" diff --git a/po/fr.po b/po/fr.po index 3285544ec..ca9c497b2 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-10-04 13:12+0000\n" "Last-Translator: Walter Paulo \n" "Language-Team: French 1;\n" "X-Generator: Weblate 5.1-dev\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" +"{path} n'accepte pas les commentaires monolignes. Merci de ne pas utiliser --" +"single-line" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "" +"{path} n'accepte pas les commentaires multilinges. Merci de ne pas utiliser " +"--multi-line" + +#: src/reuse/_annotate.py:136 +#, fuzzy, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "Le fichier {path} non reconnu a été ignoré" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "Le fichier ignoré {path} contenait déjà les données REUSE" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Erreur : l'en-tête de commentaire généré dans '{path}' ne contient pas de " +"ligne ou d'expression de droits d'auteur ou de licence. Le modèle est " +"probablement incorrect. Nouvel en-tête non écrit." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "En-tête de {path} modifié avec succès" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" +"--skip-unrecognised est sans effet quand il est utilisé en même temps que --" +"style" + +#: src/reuse/_annotate.py:231 +msgid "option --contributor, --copyright or --license is required" +msgstr "une des options --contributor, --copyright ou --license est nécessaire" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "le modèle {template} est introuvable" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "écriture impossible dans '{}'" + +#: src/reuse/_annotate.py:366 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"'{path}' n'est pas une extension de fichier reconnue. Merci d'utiliser --" +"style, --force-dot-license ou --skip-unrecognised :" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "déclaration de droits d'auteur, répétable" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Identifiant SPDX, répétable" + +#: src/reuse/_annotate.py:395 +msgid "file contributor, repeatable" +msgstr "contributeur au fichier, répétable" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "année de déclaration de droits d'auteur, facultatif" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "style de commentaire à utiliser, facultatif" + +#: src/reuse/_annotate.py:417 +#, fuzzy +msgid "copyright prefix to use, optional" +msgstr "style de droits d'auteur à utiliser, facultatif" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "nom de modèle à utiliser, facultatif" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "ne pas inclure d'année dans la déclaration" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" +"fusionner les lignes de droits d'auteur si les déclarations de droits " +"d'auteur sont identiques" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "forcer le style de commentaire monoligne, facultatif" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "forcer le style de commentaire multiligne, facultatif" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "" +"ajouter récursivement les en-têtes dans tous les fichiers des répertoires " +"spécifiés" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "" +"ne pas remplacer le premier en-tête dans le fichier, mais simplement en " +"ajouter un" + +#: src/reuse/_annotate.py:473 +#, fuzzy +msgid "always write a .license file instead of a header inside the file" +msgstr "écrire un fichier .licence plutôt qu'un en-tête dans le fichier" + +#: src/reuse/_annotate.py:480 +#, fuzzy +msgid "write a .license file to files with unrecognised comment styles" +msgstr "" +"ignorer les fichiers comportant des styles de commentaires non reconnus" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "" +"ignorer les fichiers comportant des styles de commentaires non reconnus" + +#: src/reuse/_annotate.py:497 +msgid "skip files that already contain REUSE information" +msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' est un fichier binaire ; par conséquent, le fichier '{new_path}' " +"est utilisé pour l'en-tête" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -28,7 +196,7 @@ msgstr "" "REUSE. Voir pour plus d'informations, et pour la documentation en ligne." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -36,11 +204,11 @@ msgstr "" "Cette version de reuse est compatible avec la version {} de la spécification " "REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Soutenir le travail de la FSFE :" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -50,46 +218,45 @@ msgstr "" "permettent de continuer à travailler pour le Logiciel Libre partout où c'est " "nécessaire. Merci d'envisager de faire un don ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "activer les instructions de débogage" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "masquer les avertissements d'obsolescence" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "ne pas omettre les sous-modules Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "ne pas omettre les sous-projets Meson" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "pas de multiprocessing" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "définition de la racine (root) du projet" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "voir la version du programme et quitter" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "sous-commandes" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" "ajout des informations de droits d'auteur et de licence dans les en-têtes " "(header) des fichiers" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -97,101 +264,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Ajout des informations de droits d'auteur et de licence dans les en-têtes " -"d'un ou plusieurs fichiers.\n" -"\n" -"En sélectionnant --copyright et --license, vous pouvez spécifier quels " -"titulaires de droits et licences sont ajoutés aux en-têtes des fichiers " -"listés.\n" -"\n" -"En sélectionnant --contributor, vous pouvez spécifier des personnes ou une " -"organisation qui ont contribué aux fichiers listés sans être détenteurs des " -"droits d'auteur.\n" -"Le premier commentaire est remplacé par un nouvel en-tête contenant les " -"nouvelles données de droits d'auteur et de licence ainsi que les données " -"antérieures. Si vous souhaitez conserver le premier commentaire sans aucun " -"remplacement, utilisez --no-replace.\n" -"\n" -"Les styles de commentaire doivent être détectés automatiquement pour vos " -"fichiers. Si un style de commentaire ne peut pas être détecté, le processus " -"est interrompu. Utilisez --style pour spécifier ou passer outre le style de " -"commentaire utilisé.\n" -"\n" -"Un style de commentaire monoligne est utilisé s'il est disponible. Si aucun " -"style de commentaire monoligne n'est disponible, un style de commentaire " -"multiligne sera utilisé. Vous pouvez forcer le recours à un style de " -"commentaire au moyen de --single-line ou --multi-line.\n" -"\n" -"Vous pouvez modifier le modèle des commentaires d'en-tête en utilisant " -"l'option --template. Placez un modèle Jinja2 dans le répertoire .reuse/" -"templates/mytemplate.jinja2. Vous pouvez utiliser le modèle en précisant '--" -"template mytemplate'. Consultez la documentation en ligne pour plus " -"d'informations sur l'utilisation de cette fonctionnalité.\n" -"\n" -"Si un fichier binaire est détecté ou si --explicit-license est utilisé, l'en-" -"tête est placé dans un fichier .license." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "télécharger une licence et la placer dans le répertoire LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Téléchargez une licence et placez-la dans le répertoire LICENSES/.\n" -"\n" -"Les répertoires LICENSES/ se trouvent automatiquement dans l'ordre " -"suivant :\n" -"\n" -"- Le répertoire LICENSES/ à la racine du répertoire VCS.\n" -"\n" -"- Le répertoire actuel, si son nom est LICENSES.\n" -"\n" -"- Le répertoire LICENSES/ dans le répertoire courant.\n" -"\n" -"Si le répertoire LICENSES/ n'est pas trouvé, il sera simplement créé." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "initialiser le projet REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "télécharger une licence et la placer dans le répertoire LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "lister tous les fichiers non-conformes" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -229,72 +318,76 @@ msgstr "" "- Tous les fichiers disposent-ils de données de droits d'auteur et de " "licence valides ?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "imprimer la nomenclature du projet au format SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "lister toutes les licences SPDX acceptées" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, fuzzy, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr ".reuse/dep5 n'a pas pu être analysé comme fichier utf-8" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' contient une expression SPDX qui ne peut pas être analysée : le " +"fichier est ignoré" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' n'est pas un fichier" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' n'est pas un répertoire" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "'{}' ne peut être ouvert" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "écriture impossible dans le répertoire '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "écriture impossible dans '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "lecture ou écriture impossible pour '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' n'est pas une expression SPDX valide, abandon" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' n'est pas un identifiant de licence SPDX valide." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Vous vouliez dire :" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -302,254 +395,218 @@ msgstr "" "Consultez pour une liste des identifiants de " "licence SPDX valides." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Création de .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Identification de la licence SPDX" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "télécharger toutes les licences manquantes détectées dans le projet" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erreur : {spdx_identifier} existe déjà." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' ne se termine pas en .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Erreur : échec du téléchargement de licence." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Votre connexion internet fonctionne-t-elle ?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Téléchargement de {spdx_identifier} terminé." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output n'a pas d'effet s'il est utilisé en même temps que --all" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "les arguments suivants sont nécessaires : license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "--output ne peut pas être utilisé avec plus d'une licence" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"les commentaires générés ne contiennent pas de ligne ou d'expression de " -"droits d'auteur ou de licence" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Sous quelle licence est enregistré votre projet ? Merci de fournir un " -"identifiant de licence SPDX. Consultez pour la " -"liste des licences." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Sous quelle autre licence est enregistré votre projet ? Merci de fournir un " -"identifiant de licence SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Pour finir l'ajout de licences, presser ENTRÉE." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Le projet est déjà initialisé" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Initialisation du projet pour REUSE." -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Quel est le nom du projet ?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Quelle est l'adresse internet du projet ?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Quel est le nom de la personne chargée de la maintenance ?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -"Quelle est l'adresse électronique de la personne chargée de la maintenance ?" -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Tout est prêt ! Maintenant, on initialise." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} existe déjà" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "{} n'a pas pu être téléchargé" - -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Création de .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Initialisation terminée." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"les commentaires générés ne contiennent pas de ligne ou d'expression de " +"droits d'auteur ou de licence" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "empêche la sortie" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "applique le format JSON à la sortie" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "applique le format texte brut pour la sortie" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +#, fuzzy +msgid "formats output as errors per line" +msgstr "applique le format texte brut pour la sortie" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "MAUVAISES LICENCES" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' trouvé dans :" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "LICENCES OBSOLÈTES" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCES SANS EXTENSION DE FICHIER" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Les licences suivantes n'ont pas d'extension de fichier :" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "LICENCES MANQUANTES" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "LICENCES INUTILISÉES" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Les licences suivantes ne sont pas utilisées :" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ERREURS DE LECTURE" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Illisibles :" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Les fichiers suivants ne contiennent pas de données de droits d'auteur et de " "licence :" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "" "Les fichiers suivants ne contiennent pas de données de droits d'auteur :" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Les fichiers suivants ne contiennent pas de données de licence :" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RÉSUMÉ" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Mauvaises licences :" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Licences obsolètes :" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licences sans extension de fichier :" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Licences manquantes :" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Licences inutilisées :" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Licences utilisées :" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "Erreurs de lecture :" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +#, fuzzy +msgid "Files with copyright information:" msgstr "Fichiers contenant des données de droits d'auteur :" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +#, fuzzy +msgid "Files with license information:" msgstr "Fichiers contenant des données de licence :" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -557,7 +614,7 @@ msgstr "" "Félicitations ! Votre projet est conforme à la version {} de la " "spécification REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -565,59 +622,92 @@ msgstr "" "Malheureusement, votre projet n'est pas conforme à la version {} de la " "spécification REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Licences obsolètes :" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licences sans extension de fichier :" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Licences inutilisées :" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' n'est pas un identifiant de licence SPDX valide." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' est couvert par .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' contient une expression SPDX qui ne peut pas être analysée : le " -"fichier est ignoré" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -"Les données de droits d'auteur et de licence pour '{original_path}' ont été " -"trouvées dans '{path}' et dans le fichier DEP5 placé dans '{dep5_path}'. Les " -"données de ces deux sources ont été agrégées. À l'avenir, cette procédure " -"sera modifiée et vous devrez autoriser explicitement l'agrégation. Consultez " -". Aucune action de votre part " -"n'est actuellement nécessaire. Pour masquer cet avertissement à l'avenir, " -"exécutez la commande avec l'argument `--suppress-deprecation`." - -#: src/reuse/project.py:384 + +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "résolution de l'identifiant de '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} n'a pas d'extension de fichier" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -630,13 +720,13 @@ msgstr "" "fournie à, soit qu'elle débute par 'LicenseRef-' " "et qu'elle contient une extension de fichier." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant SPXD de {path} comme de {other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " @@ -645,17 +735,17 @@ msgstr "" "le projet n'est pas un répertoire VCS ou le logiciel VCS nécessaire n'est " "pas installé" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -663,7 +753,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -672,14 +762,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -688,7 +778,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -697,18 +787,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -900,119 +990,180 @@ msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 contient des erreurs de syntaxe" - -#~ msgid "optional arguments" -#~ msgstr "arguments facultatifs" - -#~ msgid "deprecated in favor of annotate" -#~ msgstr "obsolète et remplacé par annotate" - +#, fuzzy, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." #~ msgstr "" -#~ "{path} n'accepte pas les commentaires monolignes. Merci de ne pas " -#~ "utiliser --single-line" +#~ "Les données de droits d'auteur et de licence pour '{original_path}' ont " +#~ "été trouvées dans '{path}' et dans le fichier DEP5 placé dans " +#~ "'{dep5_path}'. Les données de ces deux sources ont été agrégées. À " +#~ "l'avenir, cette procédure sera modifiée et vous devrez autoriser " +#~ "explicitement l'agrégation. Consultez . Aucune action de votre part n'est actuellement nécessaire. " +#~ "Pour masquer cet avertissement à l'avenir, exécutez la commande avec " +#~ "l'argument `--suppress-deprecation`." + +#~ msgid "initialize REUSE project" +#~ msgstr "initialiser le projet REUSE" #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "{path} n'accepte pas les commentaires multilinges. Merci de ne pas " -#~ "utiliser --multi-line" +#~ "Sous quelle licence est enregistré votre projet ? Merci de fournir un " +#~ "identifiant de licence SPDX. Consultez pour " +#~ "la liste des licences." #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "'{path}' n'est pas une extension de fichier reconnue. Merci d'utiliser --" -#~ "style, --force-dot-license ou --skip-unrecognised :" +#~ "Sous quelle autre licence est enregistré votre projet ? Merci de fournir " +#~ "un identifiant de licence SPDX." -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Le fichier {path} non reconnu a été ignoré" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Pour finir l'ajout de licences, presser ENTRÉE." -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Le fichier ignoré {path} contenait déjà les données REUSE" +#~ msgid "Project already initialized" +#~ msgstr "Le projet est déjà initialisé" -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Initialisation du projet pour REUSE." -#~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." -#~ msgstr "" -#~ "Erreur : l'en-tête de commentaire généré dans '{path}' ne contient pas de " -#~ "ligne ou d'expression de droits d'auteur ou de licence. Le modèle est " -#~ "probablement incorrect. Nouvel en-tête non écrit." +#~ msgid "What is the name of the project?" +#~ msgstr "Quel est le nom du projet ?" -#~ msgid "Successfully changed header of {path}" -#~ msgstr "En-tête de {path} modifié avec succès" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Quelle est l'adresse internet du projet ?" -#~ msgid "copyright statement, repeatable" -#~ msgstr "déclaration de droits d'auteur, répétable" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Quel est le nom de la personne chargée de la maintenance ?" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identifiant SPDX, répétable" - -#~ msgid "file contributor, repeatable" -#~ msgstr "contributeur au fichier, répétable" - -#~ msgid "year of copyright statement, optional" -#~ msgstr "année de déclaration de droits d'auteur, facultatif" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "" +#~ "Quelle est l'adresse électronique de la personne chargée de la " +#~ "maintenance ?" -#~ msgid "comment style to use, optional" -#~ msgstr "style de commentaire à utiliser, facultatif" +#~ msgid "All done! Initializing now." +#~ msgstr "Tout est prêt ! Maintenant, on initialise." -#~ msgid "copyright style to use, optional" -#~ msgstr "style de droits d'auteur à utiliser, facultatif" +#~ msgid "{} already exists" +#~ msgstr "{} existe déjà" -#~ msgid "name of template to use, optional" -#~ msgstr "nom de modèle à utiliser, facultatif" +#~ msgid "Could not download {}" +#~ msgstr "{} n'a pas pu être téléchargé" -#~ msgid "do not include year in statement" -#~ msgstr "ne pas inclure d'année dans la déclaration" +#~ msgid "Initialization complete." +#~ msgstr "Initialisation terminée." -#~ msgid "merge copyright lines if copyright statements are identical" +#, fuzzy +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." #~ msgstr "" -#~ "fusionner les lignes de droits d'auteur si les déclarations de droits " -#~ "d'auteur sont identiques" - -#~ msgid "force single-line comment style, optional" -#~ msgstr "forcer le style de commentaire monoligne, facultatif" - -#~ msgid "force multi-line comment style, optional" -#~ msgstr "forcer le style de commentaire multiligne, facultatif" +#~ "Ajout des informations de droits d'auteur et de licence dans les en-têtes " +#~ "d'un ou plusieurs fichiers.\n" +#~ "\n" +#~ "En sélectionnant --copyright et --license, vous pouvez spécifier quels " +#~ "titulaires de droits et licences sont ajoutés aux en-têtes des fichiers " +#~ "listés.\n" +#~ "\n" +#~ "En sélectionnant --contributor, vous pouvez spécifier des personnes ou " +#~ "une organisation qui ont contribué aux fichiers listés sans être " +#~ "détenteurs des droits d'auteur.\n" +#~ "Le premier commentaire est remplacé par un nouvel en-tête contenant les " +#~ "nouvelles données de droits d'auteur et de licence ainsi que les données " +#~ "antérieures. Si vous souhaitez conserver le premier commentaire sans " +#~ "aucun remplacement, utilisez --no-replace.\n" +#~ "\n" +#~ "Les styles de commentaire doivent être détectés automatiquement pour vos " +#~ "fichiers. Si un style de commentaire ne peut pas être détecté, le " +#~ "processus est interrompu. Utilisez --style pour spécifier ou passer outre " +#~ "le style de commentaire utilisé.\n" +#~ "\n" +#~ "Un style de commentaire monoligne est utilisé s'il est disponible. Si " +#~ "aucun style de commentaire monoligne n'est disponible, un style de " +#~ "commentaire multiligne sera utilisé. Vous pouvez forcer le recours à un " +#~ "style de commentaire au moyen de --single-line ou --multi-line.\n" +#~ "\n" +#~ "Vous pouvez modifier le modèle des commentaires d'en-tête en utilisant " +#~ "l'option --template. Placez un modèle Jinja2 dans le répertoire .reuse/" +#~ "templates/mytemplate.jinja2. Vous pouvez utiliser le modèle en précisant " +#~ "'--template mytemplate'. Consultez la documentation en ligne pour plus " +#~ "d'informations sur l'utilisation de cette fonctionnalité.\n" +#~ "\n" +#~ "Si un fichier binaire est détecté ou si --explicit-license est utilisé, " +#~ "l'en-tête est placé dans un fichier .license." -#~ msgid "write a .license file instead of a header inside the file" -#~ msgstr "écrire un fichier .licence plutôt qu'un en-tête dans le fichier" - -#~ msgid "add headers to all files under specified directories recursively" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." #~ msgstr "" -#~ "ajouter récursivement les en-têtes dans tous les fichiers des répertoires " -#~ "spécifiés" +#~ "Téléchargez une licence et placez-la dans le répertoire LICENSES/.\n" +#~ "\n" +#~ "Les répertoires LICENSES/ se trouvent automatiquement dans l'ordre " +#~ "suivant :\n" +#~ "\n" +#~ "- Le répertoire LICENSES/ à la racine du répertoire VCS.\n" +#~ "\n" +#~ "- Le répertoire actuel, si son nom est LICENSES.\n" +#~ "\n" +#~ "- Le répertoire LICENSES/ dans le répertoire courant.\n" +#~ "\n" +#~ "Si le répertoire LICENSES/ n'est pas trouvé, il sera simplement créé." -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "" -#~ "ne pas remplacer le premier en-tête dans le fichier, mais simplement en " -#~ "ajouter un" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 contient des erreurs de syntaxe" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "" -#~ "ignorer les fichiers comportant des styles de commentaires non reconnus" +#~ msgid "optional arguments" +#~ msgstr "arguments facultatifs" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "ignorer les fichiers qui contiennent déjà les données REUSE" +#~ msgid "deprecated in favor of annotate" +#~ msgstr "obsolète et remplacé par annotate" #~ msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" #~ msgstr "\"reuse addheader\" est obsolète et remplacé par \"reuse annotate\"" -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "" -#~ "une des options --contributor, --copyright ou --license est nécessaire" - #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "les options --exclude-year et --year sont mutuellement exclusives" @@ -1020,23 +1171,10 @@ msgstr "%(prog)s : erreur : %(message)s\n" #~ msgstr "" #~ "les options --single-line et --multi-line sont mutuellement exclusives" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "" -#~ "--skip-unrecognised est sans effet quand il est utilisé en même temps que " -#~ "--style" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license est obsolète et remplacé par --force-dot-license" -#~ msgid "template {template} could not be found" -#~ msgstr "le modèle {template} est introuvable" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' est un fichier binaire ; par conséquent, le fichier '{new_path}' " -#~ "est utilisé pour l'en-tête" - #~ msgid "Downloading {}" #~ msgstr "Téléchargement de {}" diff --git a/po/gl.po b/po/gl.po index a596e0c71..b60be29b6 100644 --- a/po/gl.po +++ b/po/gl.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician for more information, and " @@ -27,18 +183,18 @@ msgstr "" " para máis información e para a documentación en liña." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versión de reuse é compatible coa versión {} da especificación REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Apoie o traballo da FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -48,45 +204,44 @@ msgstr "" "traballando polo software libre onde sexa necesario. Considere facer unha " "doazón a ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "habilitar sentencias de depuración" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non salte os submódulos de Git" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "non empregue multiprocesamento" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "definir a raíz do proxecto" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "mostrar o número de versión do programa e saír" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "subcomandos" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "engadir copyright e licenza na cabeceira dos arquivos" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -94,86 +249,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Engadir copyright e información da licenza na cabeceira de un ou varios " -"arquivos\n" -"\n" -"Pódese especificar mediante --license e --copyright a licenza e os donos do " -"copyright a engadir nas cabeceiras dos arquivos indicados.\n" -"\n" -"O estilo dos comentarios dos arquivos debería detectarse automáticamente, de " -"non se detectar o proceso abórtase. Pódese usar --style para definir ou " -"forzar o estilo de comentario a usar.\n" -"\n" -"É posible cambiar o modelo do comentario de cabeceira usando --template. Por " -"exemplo, gardando o modelo Jinja2 na carpeta .reuse/templates/mytemplate." -"jinja2 pode usar este modelo indicando '--template mytemplate'. Consulte a " -"documentación en liña para máis información sobre esta característica.\n" -"\n" -"Se o arquivo é binario ou se especifica --explicit-license, a cabeceira " -"gárdase nun arquivo .license.\n" -"\n" -"IMPORTANTE: Actualmente isto é EXPERIMENTAL!" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Descargar unha licenza e gardala na carpeta LICENSES/.\n" -"\n" -"A carpeta LICENSES/ procurase neste orde:\n" -"\n" -"- a carpeta LICENSES/ na raíz do repositorio VCS.\n" -"\n" -"- a carpeta actual se o seu nome é LICENSES.\n" -"\n" -"- a carpeta LICENSES/ no directorio actual.\n" -"\n" -"Se non se atopa a carpeta LICENSES/ créase unha." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "iniciar un proxecto REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "listar todos os arquivos que non cumplen os criterios" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -209,72 +301,76 @@ msgstr "" "\n" "- Todos os arquivos teñen información correcta de copyright e licenza?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiales do proxecto en formato SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " +"arquivo" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' non é un arquivo" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' non é un directorio" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "non se pode abrir '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "non se pode escribir no directorio '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "non se pode escribir en '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "non se pode ler ou escribir en '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non é unha expresión SPDX válida, cancelando" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non é un Identificador de Licenza SPDX válido." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -282,253 +378,215 @@ msgstr "" "Consulte unha lista de Identificadores de Licenza SPDX válidos en ." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Creando .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Identificador de Licenza SPDX da licenza" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "descargar todas as licenzas detectadas mais non atopadas no proxecto" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} xa existe." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' non remata en .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Erro: Fallo descargando a licenza." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Está a funcionar a súa conexión a internet?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Descargouse correctamente o {spdx_identifier}." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "requirense os seguintes argumentos: licenza" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "non se pode usar --output con máis dunha licenza" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"o comentario xerado non ten liñas de copyright ou expresións de licenza" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Baixo que licenza está o seu proxecto? indique o Identificador de Licenza " -"SPDX." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Baixo que outra licenza está o seu proxecto? indique o Identificador de " -"Licenza SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Para rematar de engadir licenzas, prema ENTER." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "O proxecto xa está iniciado" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Iniciando o proxecto para REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Cal é o nome do proxecto?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Cal é o enderezo en internet do proxecto?" -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Cal é o nome do mantenedor?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Cal é o correo electrónico do mantenedor?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Rematou todo! iniciando arestora." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} xa existe" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Non se pode descargar {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Creando .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Inicialización completada." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"o comentario xerado non ten liñas de copyright ou expresións de licenza" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "LICENZAS DEFECTUOSAS" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' atopado en:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "LICENZAS OBSOLETAS" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenzas son obsoletas para SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZAS SEN EXTENSIÓN DE ARQUIVO" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "As seguintes licenzas non teñen extesión de arquivo:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "LICENZAS NON ATOPADAS" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "LICENZAS SEN USO" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "As seguintes licenzas non se usan:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ERROS DE LECTURA" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Non se pode ler:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "NON SE ATOPA INFORMACIÓN DE LICENZA OU COPYRIGHT" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Os seguintes arquivos non teñen información de licenza nen de copyright:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Os seguintes arquivos non teñen información de copyright:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Os seguintes arquivos non teñen información de licenza:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Licenzas defectuosas:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Licenzas obsoletas:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licenzas sen extensión de arquivo:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Licenzas non atopadas:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Licenzas non usadas:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Licenzas usadas:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Erros de lectura: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "Arquivos con información de copyright: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "Arquivos con información de licenza: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -536,7 +594,7 @@ msgstr "" "Congratulacións! O seu proxecto cumple coa versión {} da especificación " "REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -544,52 +602,92 @@ msgstr "" "Desgraciadamente o seu proxecto non cumple coa versión {} da especificación " "REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Licenzas obsoletas:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licenzas sen extensión de arquivo:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Licenzas non usadas:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' non é un Identificador de Licenza SPDX válido." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' cuberto por .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' inclúe unha expresión SPDX que non se pode analizar, saltando o " -"arquivo" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "resolvendo o identificador de '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ten extensión de arquivo" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -602,7 +700,7 @@ msgstr "" " ou que comeza con 'LicenseRef-' e ten unha " "extensión de arquivo." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -610,23 +708,23 @@ msgstr "" "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " "{other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -634,7 +732,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -643,14 +741,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -659,7 +757,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -668,18 +766,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -864,76 +962,139 @@ msgstr "alternativa non válida: %(value)r (elixir entre %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 ten erros de sintaxe" - -#~ msgid "optional arguments" -#~ msgstr "argumentos opcionais" +#~ msgid "initialize REUSE project" +#~ msgstr "iniciar un proxecto REUSE" #, fuzzy #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' non ten unha extensión de arquivo recoñecida, precisa usar --" -#~ "style ou --explicit-license" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Erro: Non se pode crear un comentario para '{path}'" +#~ "Baixo que licenza está o seu proxecto? indique o Identificador de Licenza " +#~ "SPDX." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Erro: A cabeceira comentada xerada para '{path}' non contén liñas de " -#~ "copyright ou expresións de licenza. Posibelmente o modelo é incorrecto. " -#~ "Non se escribiu unha nova cabecereira." +#~ "Baixo que outra licenza está o seu proxecto? indique o Identificador de " +#~ "Licenza SPDX." -#~ msgid "Successfully changed header of {path}" -#~ msgstr "A cabeceira de {path} cambiada con éxito" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Para rematar de engadir licenzas, prema ENTER." -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaración de copyright, repetibel" +#~ msgid "Project already initialized" +#~ msgstr "O proxecto xa está iniciado" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX, repetibel" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Iniciando o proxecto para REUSE." -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificador SPDX, repetibel" +#~ msgid "What is the name of the project?" +#~ msgstr "Cal é o nome do proxecto?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "ano da declaración de copyright, opcional" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Cal é o enderezo en internet do proxecto?" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Cal é o nome do mantenedor?" -#, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Cal é o correo electrónico do mantenedor?" -#~ msgid "name of template to use, optional" -#~ msgstr "nome do modelo a usar, opcional" +#~ msgid "All done! Initializing now." +#~ msgstr "Rematou todo! iniciando arestora." -#~ msgid "do not include year in statement" -#~ msgstr "non incluir ano na declaración" +#~ msgid "{} already exists" +#~ msgstr "{} xa existe" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "ano da declaración de copyright, opcional" +#~ msgid "Could not download {}" +#~ msgstr "Non se pode descargar {}" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "Initialization complete." +#~ msgstr "Inicialización completada." #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "estilo de comentario a usar, opcional" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Engadir copyright e información da licenza na cabeceira de un ou varios " +#~ "arquivos\n" +#~ "\n" +#~ "Pódese especificar mediante --license e --copyright a licenza e os donos " +#~ "do copyright a engadir nas cabeceiras dos arquivos indicados.\n" +#~ "\n" +#~ "O estilo dos comentarios dos arquivos debería detectarse automáticamente, " +#~ "de non se detectar o proceso abórtase. Pódese usar --style para definir " +#~ "ou forzar o estilo de comentario a usar.\n" +#~ "\n" +#~ "É posible cambiar o modelo do comentario de cabeceira usando --template. " +#~ "Por exemplo, gardando o modelo Jinja2 na carpeta .reuse/templates/" +#~ "mytemplate.jinja2 pode usar este modelo indicando '--template " +#~ "mytemplate'. Consulte a documentación en liña para máis información sobre " +#~ "esta característica.\n" +#~ "\n" +#~ "Se o arquivo é binario ou se especifica --explicit-license, a cabeceira " +#~ "gárdase nun arquivo .license.\n" +#~ "\n" +#~ "IMPORTANTE: Actualmente isto é EXPERIMENTAL!" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "precisase a opción --copyright ou --license" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Descargar unha licenza e gardala na carpeta LICENSES/.\n" +#~ "\n" +#~ "A carpeta LICENSES/ procurase neste orde:\n" +#~ "\n" +#~ "- a carpeta LICENSES/ na raíz do repositorio VCS.\n" +#~ "\n" +#~ "- a carpeta actual se o seu nome é LICENSES.\n" +#~ "\n" +#~ "- a carpeta LICENSES/ no directorio actual.\n" +#~ "\n" +#~ "Se non se atopa a carpeta LICENSES/ créase unha." + +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 ten erros de sintaxe" + +#~ msgid "optional arguments" +#~ msgstr "argumentos opcionais" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "as opcións --exclude-year e --year non se poden usar á vez" @@ -942,12 +1103,6 @@ msgstr "%(prog)s: erro: %(message)s\n" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "as opcións --exclude-year e --year non se poden usar á vez" -#~ msgid "template {template} could not be found" -#~ msgstr "no se atopa o modelo {template}" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' é binario, logo úsase '{new_path}' para a cabeceira" - #~ msgid "Downloading {}" #~ msgstr "Descargando {}" diff --git a/po/it.po b/po/it.po index 531952240..cba72af6f 100644 --- a/po/it.po +++ b/po/it.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian for more information, and " @@ -27,7 +184,7 @@ msgstr "" " per maggiori informazioni, e per accedere alla documentazione in linea." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -35,11 +192,11 @@ msgstr "" "Questa versione di reuse è compatibile con la versione {} della Specifica " "REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Sostieni il lavoro della FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -50,47 +207,46 @@ msgstr "" "necessario. Prendi in considerazione di fare una donazione su ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "abilita le istruzioni di debug" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non omettere i sottomoduli Git" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "non utilizzare il multiprocessing" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "impostare la directory principale del progetto" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "mostra la versione del programma ed esce" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "sottocomandi" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" "aggiunge le informazioni sul copyright e sulla licenza nell'intestazione dei " "file" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -98,86 +254,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Aggiunge le informazioni sul copyright e sulla licenza nell'intestazione di " -"uno o più file.\n" -"\n" -"Usando --copyright e --license, puoi specificare i titolari del copyright e " -"le licenze da aggiungere all'intestazione dei file specificati.\n" -"\n" -"Lo stile dei commenti dovrebbe essere rilevato automaticamente per i tuoi " -"file. Se lo stile non può essere rilevato, il programma si interrompe. Usa --" -"style per specificare o forzare lo stile dei commenti da usare.\n" -"\n" -"Puoi cambiare il modello dell'intestazione utilizzando --template. Metti un " -"modello Jinja2 in .reuse/templates/miomodello.jinja2. Puoi usare il modello " -"specificando '--template miomodello'. Leggi la documentazione in linea su " -"come usare questa funzione.\n" -"\n" -"Se viene rilevato un file binario, o se --explicit-licence viene " -"specificato, l'intestazione verrà inserita nel file .license.\n" -"\n" -"IMPORTANTE: Questo è ancora SPERIMENTALE!" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Scarica una licenza e salvala nella directory LICENSES/.\n" -"\n" -"La directory LICENSES/ viene automaticamente ricercata nel seguente ordine:\n" -"\n" -"- La directory LICENSES/ sotto la directory principale del repository VCS.\n" -"\n" -"- La directory corrente se il suo nome è LICENSES.\n" -"\n" -"- La directory LICENSES/ sotto la directory corrente.\n" -"\n" -"Se la directory LICENSES/ non viene trovata, verrà semplicemente creata." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "inizializza il progetto REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "scarica una licenza e salvala nella directory LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "lista dei file non conformi" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -214,72 +307,76 @@ msgstr "" "\n" "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "stampa l'elenco dei componenti del progetto in formato SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' contiene un'espressione SPDX che non può essere parsificata, il " +"file viene saltato" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' non è un file" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' non è una directory" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "non è possibile aprire '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "non è possibile scrivere nella directory '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "non è possibile scrivere su '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "non è possibile leggere o scrivere '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non è una espressione valida SPDX, interruzione" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non è un valido Identificativo di Licenza SPDX." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -287,253 +384,215 @@ msgstr "" "Consulta per la lista degli Identificativi di " "Licenza SPDX validi." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "Creazione di .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Identificativo di Licenza SPDX" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "scarica tutte le licenze mancanti ma usate nel progetto" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Errore: {spdx_identifier} esiste già." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' non ha estensione .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Errore: Fallito lo scaricamento della licenza." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "La tua connessione Internet funziona?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Scaricamento completato di {spdx_identifier}." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "sono richiesti i seguenti parametri: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "non puoi usare --output con più di una licenza" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"nel commento generato mancano le linee sul copyright o le espressioni di " -"licenza" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Sotto quale licenza viene rilasciato il tuo progetto? Indica " -"l'Identificativo di Licenza SPDX." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Quali altre licenze utilizza il tuo progetto? Indica l'Identificativo di " -"Licenza SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Per terminare l'aggiunta di licenze, premi INVIO." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Progetto già inizializzato" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Inizializzazione del progetto per REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Qual è il nome del progetto?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Qual è l'indirizzo Internet del progetto?" -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Qual è il nome del responsabile del progetto?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Qual è l'indirizzo e-mail del responsabile del progetto?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Tutto OK! Sto inizializzando." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} esiste già" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Non è stato possibile scaricare {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Creazione di .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Inizializzazione completa." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"nel commento generato mancano le linee sul copyright o le espressioni di " +"licenza" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "LICENZE NON VALIDA" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' trovato in:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "LICENZE OBSOLETE" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Le seguenti licenze sono obsolete secondo SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZE SENZA ESTENSIONE DEL FILE" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Le seguenti licenze non hanno l'estensione del file:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "LICENZE MANCANTI" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "LICENZE NON UTILIZZATE" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Le seguenti licenze non sono utilizzate:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ERRORI DI LETTURA" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Non è possibile leggere:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANCANO LE INFORMAZIONI SU COPYRIGHT E LICENZA" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "I seguenti file non hanno informazioni sul copyright e sulla licenza:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "I seguenti file non hanno informazioni sul copyright:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "I seguenti file non hanno informazioni sulla licenza:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RAPPORTO" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Licenze non valide:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Licenze obsolete:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licenze senza estensione del file:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Licenze mancanti:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Licenze non utilizzate:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Licenze usate:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Errori di lettura: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "File con informazioni sul copyright: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "File con informazioni sulla licenza: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" @@ -541,7 +600,7 @@ msgstr "" "Congratulazioni! Il tuo progetto è conforme con la versione {} della " "Specifica REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -549,52 +608,92 @@ msgstr "" "Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " "Specifica REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Licenze obsolete:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licenze senza estensione del file:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Licenze non utilizzate:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' non è un valido Identificativo di Licenza SPDX." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' verificato da .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' contiene un'espressione SPDX che non può essere parsificata, il " -"file viene saltato" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinazione dell'identificativo di '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ha l'estensione del file" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -607,7 +706,7 @@ msgstr "" "licenze elencate su o che inizi con " "'LicenseRef-', e che abbia un'estensione del file." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -615,23 +714,23 @@ msgstr "" "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " "{other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -639,7 +738,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -648,14 +747,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -664,7 +763,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -673,18 +772,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -869,76 +968,140 @@ msgstr "scelta non valida: %(value)r (opzioni valide: %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 presenta errori di sintassi" - -#~ msgid "optional arguments" -#~ msgstr "parametri opzionali" +#~ msgid "initialize REUSE project" +#~ msgstr "inizializza il progetto REUSE" #, fuzzy #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' non ha una estensione conosciuta, usa --style o --explicit-" -#~ "license" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Errore: Non è possibile creare il commento per '{path}'" +#~ "Sotto quale licenza viene rilasciato il tuo progetto? Indica " +#~ "l'Identificativo di Licenza SPDX." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Errore: Mancano le linee sul copyright o le espressioni di licenza " -#~ "nell'intestazione generata per '{path}'. Il modello è probabilmente " -#~ "incorretto. Non è stata scritta una nuova intestazione." +#~ "Quali altre licenze utilizza il tuo progetto? Indica l'Identificativo di " +#~ "Licenza SPDX." -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Instestazione di {path} aggiornata" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Per terminare l'aggiunta di licenze, premi INVIO." -#~ msgid "copyright statement, repeatable" -#~ msgstr "dichiarazione del copyright, ripetibile" +#~ msgid "Project already initialized" +#~ msgstr "Progetto già inizializzato" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificativo SPDX, ripetibile" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Inizializzazione del progetto per REUSE." -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificativo SPDX, ripetibile" +#~ msgid "What is the name of the project?" +#~ msgstr "Qual è il nome del progetto?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "anno della dichiaraione del copyright, opzionale" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Qual è l'indirizzo Internet del progetto?" -#~ msgid "comment style to use, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Qual è il nome del responsabile del progetto?" -#, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Qual è l'indirizzo e-mail del responsabile del progetto?" -#~ msgid "name of template to use, optional" -#~ msgstr "nome del template da usare, opzionale" +#~ msgid "All done! Initializing now." +#~ msgstr "Tutto OK! Sto inizializzando." -#~ msgid "do not include year in statement" -#~ msgstr "non include l'anno nella dichiarazione" +#~ msgid "{} already exists" +#~ msgstr "{} esiste già" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "anno della dichiaraione del copyright, opzionale" +#~ msgid "Could not download {}" +#~ msgstr "Non è stato possibile scaricare {}" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "Initialization complete." +#~ msgstr "Inizializzazione completa." #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "stile dei commenti da usare, opzionale" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Aggiunge le informazioni sul copyright e sulla licenza nell'intestazione " +#~ "di uno o più file.\n" +#~ "\n" +#~ "Usando --copyright e --license, puoi specificare i titolari del copyright " +#~ "e le licenze da aggiungere all'intestazione dei file specificati.\n" +#~ "\n" +#~ "Lo stile dei commenti dovrebbe essere rilevato automaticamente per i tuoi " +#~ "file. Se lo stile non può essere rilevato, il programma si interrompe. " +#~ "Usa --style per specificare o forzare lo stile dei commenti da usare.\n" +#~ "\n" +#~ "Puoi cambiare il modello dell'intestazione utilizzando --template. Metti " +#~ "un modello Jinja2 in .reuse/templates/miomodello.jinja2. Puoi usare il " +#~ "modello specificando '--template miomodello'. Leggi la documentazione in " +#~ "linea su come usare questa funzione.\n" +#~ "\n" +#~ "Se viene rilevato un file binario, o se --explicit-licence viene " +#~ "specificato, l'intestazione verrà inserita nel file .license.\n" +#~ "\n" +#~ "IMPORTANTE: Questo è ancora SPERIMENTALE!" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "è necessario specificare il parametro --copyright o --license" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Scarica una licenza e salvala nella directory LICENSES/.\n" +#~ "\n" +#~ "La directory LICENSES/ viene automaticamente ricercata nel seguente " +#~ "ordine:\n" +#~ "\n" +#~ "- La directory LICENSES/ sotto la directory principale del repository " +#~ "VCS.\n" +#~ "\n" +#~ "- La directory corrente se il suo nome è LICENSES.\n" +#~ "\n" +#~ "- La directory LICENSES/ sotto la directory corrente.\n" +#~ "\n" +#~ "Se la directory LICENSES/ non viene trovata, verrà semplicemente creata." + +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 presenta errori di sintassi" + +#~ msgid "optional arguments" +#~ msgstr "parametri opzionali" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" @@ -947,14 +1110,6 @@ msgstr "%(prog)s: errore: %(message)s\n" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" -#~ msgid "template {template} could not be found" -#~ msgstr "il modello {template} non è stato trovato" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' è un file binario, occorre utilizzare '{new_path}' per " -#~ "l'intestazione" - #~ msgid "Downloading {}" #~ msgstr "Scaricamento {}" diff --git a/po/nl.po b/po/nl.po index 063c23924..f284e4a3e 100644 --- a/po/nl.po +++ b/po/nl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch for more information, and " @@ -28,18 +185,18 @@ msgstr "" " voor meer informatie en voor de online documentatie." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Deze versie van reuse is compatibel met versie {} van de REUSE Specificatie." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Ondersteun het werk van de FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -49,46 +206,45 @@ msgstr "" "verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " "donatie te maken bij ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "zet debug statements aan" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "sla Git-submodules niet over" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "gebruik geen multiprocessing" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "bepaal de root van het project" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "versienummer van het programma laten zien en verlaten" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "subcommando's" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" "voeg auteursrechts- en licentie-informatie toe aan de headers van bestanden" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -96,86 +252,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Voeg auteursrechts- en licentie-informatie toe aan de headers van een of " -"meer bestanden.\n" -"\n" -"Met --copyright en --license kun je de auteursrechthouders en licenties " -"specificeren die toegevoegd moeten worden aan de headers van de bestanden.\n" -"\n" -"De commentstijl wordt automatisch gedetecteerd voor uw bestanden. Als een " -"commentstijl niet gedetecteerd kan worden, stopt het proces. Gebruik --style " -"om een commentstijl te bepalen.\n" -"\n" -"U kunt het sjabloon van de header veranderen met --template. Zet een Jinja2-" -"sjabloon in .reuse/templates/mijnsjabloon.jinja2. U kunt het sjabloon " -"gebruiken door '--template mijnsjabloon' te specificeren. Lees de online " -"documentatie voor meer informatie over deze functionaliteit.\n" -"\n" -"Als een binary bestand gedetecteerd is, of als --explicit-license gebruikt " -"wordt, dan wordt de header in een .license bestand geplaatst.\n" -"\n" -"BELANGRIJK: Dit is momenteel EXPERIMENTEEL!" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Download een licentie en plaats het in de LICENSES/-map.\n" -"\n" -"De LICENSES/-map is automatisch gevonden in de volgende volgorde:\n" -"\n" -"- De LICENSES/-map in de root van de VCS-map.\n" -"\n" -"- De huidige map als de naam van de huidige map LICENSES/ is.\n" -"\n" -"- De LICENSES/-map in de huidige map.\n" -"\n" -"Als de LICENSES/-map niet gevonden kan worden, dan wordt er een gemaakt." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "initialiseer REUSE-project" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "download een licentie en plaats het in de LICENSES/-map" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "lijst maken van alle bestanden die tekortschieten" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -212,73 +305,76 @@ msgstr "" "\n" "- Bevatten alle bestanden geldige informatie over auteursricht en licenties?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "print de materiaallijst van het project in SPDX-formaat" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, fuzzy, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr "%s kon niet gedecodeerd worden" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -#, fuzzy -msgid "no '{}' file, or could not read it" -msgstr "geen debian/copyright bestand, of kon het niet lezen" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " +"bestand over" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' is geen bestand" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' is geen map" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "kan '{}' niet openen" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "kan niet schrijven naar map '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "kan niet schrijven naar '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "kan '{}' niet lezen of schrijven" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' is geen geldige SPDX Licentie Identificatie." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -286,314 +382,316 @@ msgstr "" "Zie voor een lijst met geldige SPDX Licentie " "Identificaties." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr ".reuse/dep5 aan het creëren" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "SPDX Licentie Identificatie of licentie" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "" "download alle ontbrekende licenties die in het project zijn gedetecteerd" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fout: {spdx_identifier} bestaat al." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' eindigt niet met .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Fout: downloaden van licentie mislukt." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Werkt uw internetverbinding?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} met succes gedowload." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "de volgende argumenten zijn verplicht: licentie" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "kan --output niet met meer dan een licentie gebruiken" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Onder welke licentie valt uw project? Voeg de SPDX Licientie Identificatie " -"toe." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Onder welke andere licentie valt uw project? Voeg de SPDX Licientie " -"Identificatie toe." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Typ RETURN om te stoppen met het toevoegen van licenties." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Project al geïnitialiseerd" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Project voor REUSE initialiseren." -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Wat is de naam van het project?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Wat is het internetadres van het project?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Wat is de naam van de beheerder?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Wat is het e-mailadres van de beheerder?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Klaar! Nu aan het initialiseren." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} bestaat al" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Kon {} niet downloaden" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr ".reuse/dep5 aan het creëren" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Initialisatie voltooid." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "SLECHTE LICENTIES" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' gevonden in:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "VEROUDERDE LICENTIES" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "De volgende licenties zijn verouderd door SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENTIES ZONDER BESTANDSEXTENSIE" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "De volgende licenties hebben geen bestandsextensie:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "ONTBREKENDE LICENTIES" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "ONGEBRUIKTE LICENTIES" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "De volgende licenties zijn niet gebruikt:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "LEES FOUTEN" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Kon niet lezen:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "AUTEURSRECHT- EN LICENTIE-INFORMATIE ONTBREEKT" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "De volgende bestanden bevatten geen auteursrecht- en licentie-informatie:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "De volgende bestanden hebben geen auteursrechtinformatie:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "De volgende bestanden bevatten geen licentie-informatie:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "SAMENVATTING" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Slechte licenties:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Verouderde licenties:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licenties zonder bestandsextensie:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Ontbrekende licenties:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Ongebruikte licenties:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Gebruikte licenties:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Lees fouten: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "Bestanden met licentie-informatie: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Gefeliciteerd! Uw project leeft nu versie {} van de REUSE-specificatie na :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Helaas leeft uw project versie {} van de REUSE-specificatie niet na :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Verouderde licenties:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licenties zonder bestandsextensie:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Ongebruikte licenties:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' is geen geldige SPDX Licentie Identificatie." + +#: src/reuse/lint.py:334 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' valt onder .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' bevat een SPDX-uitdrukking die niet geparsed kan worden; sla het " -"bestand over" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "identificatie van '{path}' bepalen" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} heeft geen bestandsextensie" # Niet helemaal duidelijk hoe resolving hier wordt bedoeld. -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -606,7 +704,7 @@ msgstr "" "die gevonden kan worden op of dat deze begint " "met 'LicenseRef-' en dat deze een bestandsextensie heeft." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" @@ -614,23 +712,23 @@ msgstr "" "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " "{other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -638,7 +736,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -647,14 +745,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -663,7 +761,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -672,18 +770,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -869,76 +967,143 @@ msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 kent syntaxfouten" +#~ msgid "initialize REUSE project" +#~ msgstr "initialiseer REUSE-project" -#~ msgid "optional arguments" -#~ msgstr "optionele argumenten" +#, fuzzy +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "geen debian/copyright bestand, of kon het niet lezen" #, fuzzy #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' heeft geen erkende bestandsextensie; gebruik alstublieft --style " -#~ "of --explicit-license" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Fout: Kon geen commentaar voor '{path}' creëren" +#~ "Onder welke licentie valt uw project? Voeg de SPDX Licientie " +#~ "Identificatie toe." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Fout: de gegenereerde commentaarheader voor '{path}' mist " -#~ "auteursrechtregels of licentie-uitdrukkingen. Het sjabloon is " -#~ "waarschijnlijk niet correct. Schreef geen nieuwe header." +#~ "Onder welke andere licentie valt uw project? Voeg de SPDX Licientie " +#~ "Identificatie toe." -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Succesvolle verandering van de header van {path}" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Typ RETURN om te stoppen met het toevoegen van licenties." -#~ msgid "copyright statement, repeatable" -#~ msgstr "auteursrechtverklaring (herhaalbaar)" +#~ msgid "Project already initialized" +#~ msgstr "Project al geïnitialiseerd" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Identificatie (herhaalbaar)" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Project voor REUSE initialiseren." -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "SPDX Identificatie (herhaalbaar)" +#~ msgid "What is the name of the project?" +#~ msgstr "Wat is de naam van het project?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "jaar van auteursrechtverklaring (optie)" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Wat is het internetadres van het project?" -#~ msgid "comment style to use, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Wat is de naam van de beheerder?" -#, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Wat is het e-mailadres van de beheerder?" -#~ msgid "name of template to use, optional" -#~ msgstr "naam van het te gebruiken sjabloon (optie)" +#~ msgid "All done! Initializing now." +#~ msgstr "Klaar! Nu aan het initialiseren." -#~ msgid "do not include year in statement" -#~ msgstr "voeg geen jaar toe aan verklaring" +#~ msgid "{} already exists" +#~ msgstr "{} bestaat al" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "jaar van auteursrechtverklaring (optie)" +#~ msgid "Could not download {}" +#~ msgstr "Kon {} niet downloaden" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "Initialization complete." +#~ msgstr "Initialisatie voltooid." #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "te gebruiken commentaarstijl (optie)" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Voeg auteursrechts- en licentie-informatie toe aan de headers van een of " +#~ "meer bestanden.\n" +#~ "\n" +#~ "Met --copyright en --license kun je de auteursrechthouders en licenties " +#~ "specificeren die toegevoegd moeten worden aan de headers van de " +#~ "bestanden.\n" +#~ "\n" +#~ "De commentstijl wordt automatisch gedetecteerd voor uw bestanden. Als een " +#~ "commentstijl niet gedetecteerd kan worden, stopt het proces. Gebruik --" +#~ "style om een commentstijl te bepalen.\n" +#~ "\n" +#~ "U kunt het sjabloon van de header veranderen met --template. Zet een " +#~ "Jinja2-sjabloon in .reuse/templates/mijnsjabloon.jinja2. U kunt het " +#~ "sjabloon gebruiken door '--template mijnsjabloon' te specificeren. Lees " +#~ "de online documentatie voor meer informatie over deze functionaliteit.\n" +#~ "\n" +#~ "Als een binary bestand gedetecteerd is, of als --explicit-license " +#~ "gebruikt wordt, dan wordt de header in een .license bestand geplaatst.\n" +#~ "\n" +#~ "BELANGRIJK: Dit is momenteel EXPERIMENTEEL!" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "de optie --copyright of --license is vereist" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Download een licentie en plaats het in de LICENSES/-map.\n" +#~ "\n" +#~ "De LICENSES/-map is automatisch gevonden in de volgende volgorde:\n" +#~ "\n" +#~ "- De LICENSES/-map in de root van de VCS-map.\n" +#~ "\n" +#~ "- De huidige map als de naam van de huidige map LICENSES/ is.\n" +#~ "\n" +#~ "- De LICENSES/-map in de huidige map.\n" +#~ "\n" +#~ "Als de LICENSES/-map niet gevonden kan worden, dan wordt er een gemaakt." + +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 kent syntaxfouten" + +#~ msgid "optional arguments" +#~ msgstr "optionele argumenten" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "de opties --exclude-year en --year sluiten elkaar uit" @@ -947,13 +1112,6 @@ msgstr "%(prog)s: fout: %(message)s\n" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "de opties --exclude-year en --year sluiten elkaar uit" -#~ msgid "template {template} could not be found" -#~ msgstr "sjabloon {template} kon niet worden gevonden" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' is een binary; daarom wordt '{new_path}' gebruikt voor de header" - #~ msgid "Downloading {}" #~ msgstr "{} aan het downloaden" diff --git a/po/pt.po b/po/pt.po index a4ba18867..ba66897dd 100644 --- a/po/pt.po +++ b/po/pt.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese 1;\n" "X-Generator: Weblate 4.18.1\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "" + +#: src/reuse/_annotate.py:136 +#, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Erro: Não foi possível criar um comentário para '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Erro: O cabeçalho de comentário gerado para '{path}' não contém linhas de " +"direitos de autor ou expressões de licenciamento. Provavelmente o modelo não " +"está correcto. Não foi escrito nenhum novo cabeçalho." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "O cabeçalho de {path} foi alterado com êxito" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" + +#: src/reuse/_annotate.py:231 +#, fuzzy +msgid "option --contributor, --copyright or --license is required" +msgstr "é requerida uma das opções --copyright ou --license" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "o modelo {template} não foi encontrado" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "não é possível escrever em '{}'" + +#: src/reuse/_annotate.py:366 +#, fuzzy +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" +"explicit-license" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "declaração de direitos de autor (repetível)" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Identificador SPDX (repetível)" + +#: src/reuse/_annotate.py:395 +#, fuzzy +msgid "file contributor, repeatable" +msgstr "Identificador SPDX (repetível)" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "ano da declaração de direitos de autor (opcional)" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/_annotate.py:417 +#, fuzzy +msgid "copyright prefix to use, optional" +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "nome do modelo a usar (opcional)" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "não incluir o ano na declaração" + +#: src/reuse/_annotate.py:440 +#, fuzzy +msgid "merge copyright lines if copyright statements are identical" +msgstr "ano da declaração de direitos de autor (opcional)" + +#: src/reuse/_annotate.py:446 +#, fuzzy +msgid "force single-line comment style, optional" +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/_annotate.py:451 +#, fuzzy +msgid "force multi-line comment style, optional" +msgstr "estilo de comentário a usar (opcional)" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "" + +#: src/reuse/_annotate.py:473 +msgid "always write a .license file instead of a header inside the file" +msgstr "" + +#: src/reuse/_annotate.py:480 +msgid "write a .license file to files with unrecognised comment styles" +msgstr "" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "" + +#: src/reuse/_annotate.py:497 +#, fuzzy +msgid "skip files that already contain REUSE information" +msgstr "Ficheiros com informação de licenciamento: {count} / {total}" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -27,18 +183,18 @@ msgstr "" " para mais informação e para documentação em linha." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versão do reuse é compatível com a versão {} da especificação REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Apoiar o trabalho da FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -48,45 +204,44 @@ msgstr "" "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " "Considere fazer um donativo em ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "activar expressões de depuração" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "não ignorar sub-módulos do Git" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "não usar multi-processamento" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "definir a raíz do projecto" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "mostrar o número de versão do programa e sair" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "sub-comandos" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "adicionar direitos de autor e licenciamento ao cabeçalho dos ficheiros" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -94,88 +249,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Adicionar direitos de autor e licenciamento ao cabeçalho de um ou mais " -"ficheiros.\n" -"\n" -"Usando --copyright e --license, pode-se especificar que detentores de " -"direitos de autor e que licenças adicionar aos cabeçalhos dos ficheiros em " -"causa.\n" -"\n" -"O estilo dos comentários deve ser detectado automaticamente nos ficheiros. " -"Se não for detectado nenhum estilo de comentários, o processo é abortado. " -"Usar --style para especificar ou sobre-escrever o estilo de comentários a " -"usar.\n" -"\n" -"É possível mudar o modelo de comentários de cabeçalho usando --template. " -"Colocarum modelo Jinja2 na pasta .reuse/templates/mytemplate.jinja2. Este " -"modelo pode ser usado indicando '--template mytemplate'. Consultar a " -"documentação em linha para informação adicional sobre esta funcionalidade.\n" -"\n" -"Se for detectado um ficheiro binário ou se for especificado --explicit-" -"license, o cabeçalho é colocado num ficheiro .license\n" -"\n" -"IMPORTANTE: Presentemente esta funcionalidade é EXPERIMENTAL!" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Descarregar uma licença e guardá-la na pasta LICENSES/.\n" -"\n" -"A pasta LICENSES/ é procurada automaticamente por esta ordem:\n" -"\n" -"- Pasta LICENSES/ na raíz do repositório VCS.\n" -"\n" -"- Pasta actual se o nome for LICENSES.\n" -"\n" -"- Pasta LICENSES/ na pasta actual.\n" -"\n" -"Se não for encontrada, a pasta LICENSES/ será criada." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "iniciar um projecto REUSE" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "descarregar uma licença e guardá-la na pasta LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "listar todos os ficheiros não conformes" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -213,72 +303,76 @@ msgstr "" "- Todos os ficheiros têm informação válida de direitos de autor e de " "licenciamento?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "imprimir a lista de materiais do projecto em formato SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " +"ficheiro ignorado" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' não é um ficheiro" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' não é uma pasta" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "não é possível abrir '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "não é possível escrever no directório '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "não é possível escrever em '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "não é possível ler ou escrever em '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' não é uma expressão SPDX válida; a abortar" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' não é um Identificador de Licença SPDX válido." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -286,261 +380,224 @@ msgstr "" "Consultar uma lista de Identificadores de Licença SPDX válidos em ." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr "A criar .reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Identificador de Licença SPDX da licença" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "descarregar todas as licenças detectadas como em falta no projecto" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} já existe." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' não termina em .spdx" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Erro: Falha ao descarregar a licença." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "A ligação à Internet está a funcionar?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} transferido com êxito." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "são requeridos os seguintes argumentos: licença" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "não se pode usar --output com mais do que uma licença" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"o comentário gerado não tem linhas de direitos de autor ou expressões de " -"licenciamento" - -#: src/reuse/init.py:30 -#, fuzzy +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Sob que licença está o projecto? Indicar o Identificador de Licença SPDX." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Sob que outra licença está o projecto? Indicar o Identificador de Licença " -"SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Para parar a agregação de licenças, premir INTRODUZIR/ENTER." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Projecto já iniciado" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "A iniciar o projecto para REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Qual é o nome do projecto?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Qual é o endereço do projecto na internet?" -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Qual é o nome do responsável (maintainer)?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Qual é o endereço electrónico do responsável?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Pronto! A iniciar." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} já existe" - -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Não foi possível descarregar {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "A criar .reuse/dep5" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Iniciação completada." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"o comentário gerado não tem linhas de direitos de autor ou expressões de " +"licenciamento" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "LICENÇAS IRREGULARES" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' encontrado em:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "LICENÇAS DESCONTINUADAS" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "As seguintes licenças não têm extensão de ficheiro:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "LICENÇAS EM FALTA" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "LICENÇAS NÃO USADAS" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "As seguintes licenças não estão a ser usadas:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ERROS DE LEITURA" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Não foi possível ler:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" "Os seguintes ficheiros não contêm informação de direitos de autor nem de " "licenciamento:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Os seguintes ficheiros não contêm informação de direitos de autor:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "RESUMO" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Licenças irregulares:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Licenças descontinuadas:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Licenças sem extensão de ficheiro:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Licenças em falta:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Licenças não usadas:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Licenças usadas:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 #, fuzzy msgid "Read errors:" msgstr "Erros de leitura: {count}" -#: src/reuse/lint.py:174 +#: src/reuse/lint.py:181 #, fuzzy -msgid "files with copyright information:" +msgid "Files with copyright information:" msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" -#: src/reuse/lint.py:178 +#: src/reuse/lint.py:185 #, fuzzy -msgid "files with license information:" +msgid "Files with license information:" msgstr "Ficheiros com informação de licenciamento: {count} / {total}" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Parabéns! O projecto está conforme com a versão {} da especificação REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" @@ -548,52 +605,92 @@ msgstr "" "Infelizmente, o projecto não está conforme com a versão {} da especificação " "REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Licenças descontinuadas:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Licenças sem extensão de ficheiro:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Licenças não usadas:" + +#: src/reuse/lint.py:319 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' não é um Identificador de Licença SPDX válido." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' abrangido por .reuse/dep5" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' inclui uma expressão SPDX que não pode ser analisada (parsed); " -"ficheiro ignorado" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "a determinar o identificador de '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} não tem extensão de ficheiro" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -606,30 +703,30 @@ msgstr "" "publicada em ou que começa por 'LicenseRef-' e " "tem uma extensão de ficheiro." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} é o Identificador de Licença SPDX de {path} e {other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -637,7 +734,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -646,14 +743,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -662,7 +759,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -671,18 +768,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -867,76 +964,140 @@ msgstr "alternativa inválida: %(value)r (escolher de %(choices)s)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 tem erros de sintaxe" - -#~ msgid "optional arguments" -#~ msgstr "argumentos opcionais" +#~ msgid "initialize REUSE project" +#~ msgstr "iniciar um projecto REUSE" #, fuzzy #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" -#~ "explicit-license" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Erro: Não foi possível criar um comentário para '{path}'" +#~ "Sob que licença está o projecto? Indicar o Identificador de Licença SPDX." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Erro: O cabeçalho de comentário gerado para '{path}' não contém linhas de " -#~ "direitos de autor ou expressões de licenciamento. Provavelmente o modelo " -#~ "não está correcto. Não foi escrito nenhum novo cabeçalho." +#~ "Sob que outra licença está o projecto? Indicar o Identificador de Licença " +#~ "SPDX." -#~ msgid "Successfully changed header of {path}" -#~ msgstr "O cabeçalho de {path} foi alterado com êxito" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Para parar a agregação de licenças, premir INTRODUZIR/ENTER." -#~ msgid "copyright statement, repeatable" -#~ msgstr "declaração de direitos de autor (repetível)" +#~ msgid "Project already initialized" +#~ msgstr "Projecto já iniciado" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Identificador SPDX (repetível)" +#~ msgid "Initializing project for REUSE." +#~ msgstr "A iniciar o projecto para REUSE." -#, fuzzy -#~ msgid "file contributor, repeatable" -#~ msgstr "Identificador SPDX (repetível)" +#~ msgid "What is the name of the project?" +#~ msgstr "Qual é o nome do projecto?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "ano da declaração de direitos de autor (opcional)" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Qual é o endereço do projecto na internet?" -#~ msgid "comment style to use, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Qual é o nome do responsável (maintainer)?" -#, fuzzy -#~ msgid "copyright style to use, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Qual é o endereço electrónico do responsável?" -#~ msgid "name of template to use, optional" -#~ msgstr "nome do modelo a usar (opcional)" +#~ msgid "All done! Initializing now." +#~ msgstr "Pronto! A iniciar." -#~ msgid "do not include year in statement" -#~ msgstr "não incluir o ano na declaração" +#~ msgid "{} already exists" +#~ msgstr "{} já existe" -#, fuzzy -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "ano da declaração de direitos de autor (opcional)" +#~ msgid "Could not download {}" +#~ msgstr "Não foi possível descarregar {}" -#, fuzzy -#~ msgid "force single-line comment style, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "Initialization complete." +#~ msgstr "Iniciação completada." #, fuzzy -#~ msgid "force multi-line comment style, optional" -#~ msgstr "estilo de comentário a usar (opcional)" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Adicionar direitos de autor e licenciamento ao cabeçalho de um ou mais " +#~ "ficheiros.\n" +#~ "\n" +#~ "Usando --copyright e --license, pode-se especificar que detentores de " +#~ "direitos de autor e que licenças adicionar aos cabeçalhos dos ficheiros " +#~ "em causa.\n" +#~ "\n" +#~ "O estilo dos comentários deve ser detectado automaticamente nos " +#~ "ficheiros. Se não for detectado nenhum estilo de comentários, o processo " +#~ "é abortado. Usar --style para especificar ou sobre-escrever o estilo de " +#~ "comentários a usar.\n" +#~ "\n" +#~ "É possível mudar o modelo de comentários de cabeçalho usando --template. " +#~ "Colocarum modelo Jinja2 na pasta .reuse/templates/mytemplate.jinja2. Este " +#~ "modelo pode ser usado indicando '--template mytemplate'. Consultar a " +#~ "documentação em linha para informação adicional sobre esta " +#~ "funcionalidade.\n" +#~ "\n" +#~ "Se for detectado um ficheiro binário ou se for especificado --explicit-" +#~ "license, o cabeçalho é colocado num ficheiro .license\n" +#~ "\n" +#~ "IMPORTANTE: Presentemente esta funcionalidade é EXPERIMENTAL!" -#, fuzzy -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "é requerida uma das opções --copyright ou --license" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Descarregar uma licença e guardá-la na pasta LICENSES/.\n" +#~ "\n" +#~ "A pasta LICENSES/ é procurada automaticamente por esta ordem:\n" +#~ "\n" +#~ "- Pasta LICENSES/ na raíz do repositório VCS.\n" +#~ "\n" +#~ "- Pasta actual se o nome for LICENSES.\n" +#~ "\n" +#~ "- Pasta LICENSES/ na pasta actual.\n" +#~ "\n" +#~ "Se não for encontrada, a pasta LICENSES/ será criada." + +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 tem erros de sintaxe" + +#~ msgid "optional arguments" +#~ msgstr "argumentos opcionais" #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "as opções --exclude-year e --year são mutuamente exclusivas" @@ -945,12 +1106,6 @@ msgstr "%(prog)s: erro: %(message)s\n" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "as opções --exclude-year e --year são mutuamente exclusivas" -#~ msgid "template {template} could not be found" -#~ msgstr "o modelo {template} não foi encontrado" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "'{path}' é binário, por isso é usado '{new_path}' para o cabeçalho" - #~ msgid "Downloading {}" #~ msgstr "A descarregar {}" diff --git a/po/reuse.pot b/po/reuse.pot index ee2591f28..3605e2633 100644 --- a/po/reuse.pot +++ b/po/reuse.pot @@ -9,7 +9,7 @@ msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,67 +30,210 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "" + +#: src/reuse/_annotate.py:136 +#, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" + +#: src/reuse/_annotate.py:231 +msgid "option --contributor, --copyright or --license is required" +msgstr "" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "" + +#: src/reuse/_annotate.py:366 +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "" + +#: src/reuse/_annotate.py:395 +msgid "file contributor, repeatable" +msgstr "" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "" + +#: src/reuse/_annotate.py:417 +msgid "copyright prefix to use, optional" +msgstr "" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "" + +#: src/reuse/_annotate.py:473 +msgid "always write a .license file instead of a header inside the file" +msgstr "" + +#: src/reuse/_annotate.py:480 +msgid "write a .license file to files with unrecognised comment styles" +msgstr "" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "" + +#: src/reuse/_annotate.py:497 +msgid "skip files that already contain REUSE information" +msgstr "" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " "making a donation at ." msgstr "" -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -98,56 +241,22 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." +#: src/reuse/_main.py:142 +msgid "Download a license and place it in the LICENSES/ directory." msgstr "" -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "" - -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -168,369 +277,379 @@ msgid "" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr "" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 +#, python-brace-format +msgid "Could not parse '{expression}'" msgstr "" -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:424 #, python-brace-format -msgid "Could not parse '{expression}'" +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +msgid "no '.reuse/dep5' file" +msgstr "" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "" -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "" -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "" -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." -msgstr "" - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "" - -#: src/reuse/init.py:86 -msgid "Project already initialized" +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "" - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "" - -#: src/reuse/init.py:128 -msgid "Retrieving {}" -msgstr "" - -#: src/reuse/init.py:133 -msgid "{} already exists" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:136 -msgid "Could not download {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." -msgstr "" - -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:172 -msgid "Initialization complete." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +msgid "Files with copyright information:" msgstr "" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +msgid "Files with license information:" msgstr "" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{lic_path}: deprecated license\n" msgstr "" -#: src/reuse/project.py:239 +#: src/reuse/lint.py:303 +#, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "" + +#: src/reuse/lint.py:312 +#, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "" + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, python-brace-format +msgid "'{path}' covered by {global_path}" +msgstr "" + +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -539,29 +658,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -569,7 +688,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -578,14 +697,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -594,7 +713,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -603,18 +722,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 000000000..657b6d3d0 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,1069 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" +"PO-Revision-Date: 2024-05-25 05:09+0000\n" +"Last-Translator: gfbdrgng \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.6-dev\n" + +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" +"'{path}' не поддерживает однострочные комментарии, пожалуйста, не " +"используйте --single-line" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "" +"'{path}' не поддерживает многострочные комментарии, пожалуйста, не " +"используйте --multi-line" + +#: src/reuse/_annotate.py:136 +#, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "Пропущен нераспознанный файл '{path}'" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "'{path}' не распознан; создаем '{path}. лицензия'" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "Пропущенный файл '{path}' уже содержит информацию о REUSE" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Ошибка: Не удалось создать комментарий для '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Ошибка: В сгенерированном заголовке комментария для '{path}' отсутствуют " +"строки копирайта или выражения лицензии. Вероятно, шаблон неверен. Не " +"удалось написать новый заголовок." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "Успешно изменен заголовок {path}" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "" +"--skip-unrecognised не имеет эффекта, если используется вместе с --style" + +#: src/reuse/_annotate.py:231 +msgid "option --contributor, --copyright or --license is required" +msgstr "Требуется опция --создатель, - авторское право или --лицензия" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "Шаблон {template} не найден" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "Невозможно записать в '{}'" + +#: src/reuse/_annotate.py:366 +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"Следующие файлы не имеют распознанного расширения. Пожалуйста, используйте --" +"style, --force-dot-license, --fallback-dot-license или --skip-unrecognised:" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "заявление об авторских правах, повторяемое" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Идентификатор SPDX, повторяемый" + +#: src/reuse/_annotate.py:395 +msgid "file contributor, repeatable" +msgstr "вкладчик файлов, повторяемость" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "год утверждения авторского права, необязательно" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "стиль комментария, который следует использовать, необязательно" + +#: src/reuse/_annotate.py:417 +#, fuzzy +msgid "copyright prefix to use, optional" +msgstr "стиль авторского права, который будет использоваться, необязательно" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "имя шаблона, который будет использоваться, необязательно" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "не указывайте год в отчете" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" +"объединить строки с авторскими правами, если заявления об авторских правах " +"идентичны" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "стиль однострочных комментариев, необязательно" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "установить стиль многострочного комментария, необязательно" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "рекурсивно добавлять заголовки ко всем файлам в указанных каталогах" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "не заменяйте первый заголовок в файле; просто добавьте новый" + +#: src/reuse/_annotate.py:473 +msgid "always write a .license file instead of a header inside the file" +msgstr "всегда записывайте файл .license вместо заголовка внутри файла" + +#: src/reuse/_annotate.py:480 +msgid "write a .license file to files with unrecognised comment styles" +msgstr "" +"записывать файл .license в файлы с нераспознанными стилями комментариев" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "пропускать файлы с нераспознанными стилями комментариев" + +#: src/reuse/_annotate.py:497 +msgid "skip files that already contain REUSE information" +msgstr "пропускать файлы, которые уже содержат информацию о REUSE" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' - двоичный файл, поэтому для заголовка используется '{new_path}'" + +#: src/reuse/_main.py:39 +msgid "" +"reuse is a tool for compliance with the REUSE recommendations. See for more information, and " +"for the online documentation." +msgstr "" +"reuse - это инструмент для соблюдения рекомендаций REUSE. Дополнительную " +"информацию см. на сайте , а онлайн-документацию - " +"на сайте ." + +#: src/reuse/_main.py:45 +msgid "" +"This version of reuse is compatible with version {} of the REUSE " +"Specification." +msgstr "" +"Эта версия повторного использования совместима с версией {} спецификации " +"REUSE." + +#: src/reuse/_main.py:48 +msgid "Support the FSFE's work:" +msgstr "Поддержите работу ФСПО:" + +#: src/reuse/_main.py:52 +msgid "" +"Donations are critical to our strength and autonomy. They enable us to " +"continue working for Free Software wherever necessary. Please consider " +"making a donation at ." +msgstr "" +"Пожертвования имеют решающее значение для нашей силы и самостоятельности. " +"Они позволяют нам продолжать работать во имя свободного программного " +"обеспечения везде, где это необходимо. Пожалуйста, рассмотрите возможность " +"сделать пожертвование по адресу ." + +#: src/reuse/_main.py:75 +msgid "enable debug statements" +msgstr "включить отладочные операторы" + +#: src/reuse/_main.py:80 +msgid "hide deprecation warnings" +msgstr "скрыть предупреждения об устаревании" + +#: src/reuse/_main.py:85 +msgid "do not skip over Git submodules" +msgstr "не пропускайте подмодули Git" + +#: src/reuse/_main.py:90 +msgid "do not skip over Meson subprojects" +msgstr "не пропускайте мезонные подпроекты" + +#: src/reuse/_main.py:95 +msgid "do not use multiprocessing" +msgstr "не используйте многопроцессорную обработку" + +#: src/reuse/_main.py:102 +msgid "define root of project" +msgstr "определить корень проекта" + +#: src/reuse/_main.py:107 +msgid "show program's version number and exit" +msgstr "показать номер версии программы и выйти" + +#: src/reuse/_main.py:111 +msgid "subcommands" +msgstr "подкоманды" + +#: src/reuse/_main.py:118 +msgid "add copyright and licensing into the header of files" +msgstr "" +"добавьте в заголовок файлов информацию об авторских правах и лицензировании" + +#: src/reuse/_main.py:121 +msgid "" +"Add copyright and licensing into the header of one or more files.\n" +"\n" +"By using --copyright and --license, you can specify which copyright holders " +"and licenses to add to the headers of the given files.\n" +"\n" +"By using --contributor, you can specify people or entity that contributed " +"but are not copyright holder of the given files." +msgstr "" +"Добавление авторских прав и лицензий в заголовок одного или нескольких " +"файлов.\n" +"\n" +"Используя команды --copyright и --license, вы можете указать, какие " +"авторские права и лицензии следует добавить в заголовки заданных файлов.\n" +"\n" +"Используя команду --contributor, вы можете указать людей или организации, " +"которые внесли свой вклад, но не являются владельцами авторских прав на " +"данные файлы." + +#: src/reuse/_main.py:140 +msgid "download a license and place it in the LICENSES/ directory" +msgstr "загрузите лицензию и поместите ее в каталог LICENSES/" + +#: src/reuse/_main.py:142 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Загрузите лицензию и поместите ее в каталог LICENSES/." + +#: src/reuse/_main.py:151 +msgid "list all non-compliant files" +msgstr "список всех файлов, не соответствующих требованиям" + +#: src/reuse/_main.py:154 +#, python-brace-format +msgid "" +"Lint the project directory for compliance with version {reuse_version} of " +"the REUSE Specification. You can find the latest version of the " +"specification at .\n" +"\n" +"Specifically, the following criteria are checked:\n" +"\n" +"- Are there any bad (unrecognised, not compliant with SPDX) licenses in the " +"project?\n" +"\n" +"- Are any licenses referred to inside of the project, but not included in " +"the LICENSES/ directory?\n" +"\n" +"- Are any licenses included in the LICENSES/ directory that are not used " +"inside of the project?\n" +"\n" +"- Do all files have valid copyright and licensing information?" +msgstr "" +"Проверьте каталог проекта на соответствие версии {reuse_version} " +"спецификации REUSE. Последнюю версию спецификации можно найти по адресу " +".\n" +"\n" +"В частности, проверяются следующие критерии:\n" +"\n" +"- Есть ли в проекте плохие (нераспознанные, не совместимые с SPDX) " +"лицензии?\n" +"\n" +"- Есть ли лицензии, на которые ссылаются внутри проекта, но которые не " +"включены в каталог LICENSES/?\n" +"\n" +"- Включены ли в каталог LICENSES/ какие-либо лицензии, которые не " +"используются в проекте?\n" +"\n" +"- Все ли файлы содержат достоверную информацию об авторских правах и " +"лицензировании?" + +#: src/reuse/_main.py:181 +msgid "print the project's bill of materials in SPDX format" +msgstr "распечатать ведомость материалов проекта в формате SPDX" + +#: src/reuse/_main.py:189 +msgid "list all supported SPDX licenses" +msgstr "список всех поддерживаемых лицензий SPDX" + +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "Преобразование .reuse/dep5 в REUSE.toml" + +#: src/reuse/_main.py:263 +#, python-brace-format +msgid "'{path}' could not be decoded as UTF-8." +msgstr "'{path}' не может быть декодирован как UTF-8." + +#: src/reuse/_main.py:269 +#, python-brace-format +msgid "" +"'{path}' could not be parsed. We received the following error message: " +"{message}" +msgstr "" +"'{path}' не может быть разобран. Мы получили следующее сообщение об ошибке: " +"{message}" + +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 +#, python-brace-format +msgid "Could not parse '{expression}'" +msgstr "Не удалось разобрать '{expression}'" + +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' содержит выражение SPDX, которое не может быть разобрано, что " +"приводит к пропуску файла" + +#: src/reuse/_util.py:556 +msgid "'{}' is not a file" +msgstr "'{}' не является файлом" + +#: src/reuse/_util.py:559 +msgid "'{}' is not a directory" +msgstr "'{}' не является каталогом" + +#: src/reuse/_util.py:562 +msgid "can't open '{}'" +msgstr "Невозможно открыть '{}'" + +#: src/reuse/_util.py:567 +msgid "can't write to directory '{}'" +msgstr "Невозможно записать в каталог '{}'" + +#: src/reuse/_util.py:586 +msgid "can't read or write '{}'" +msgstr "Невозможно прочитать или записать '{}'" + +#: src/reuse/_util.py:596 +msgid "'{}' is not a valid SPDX expression, aborting" +msgstr "'{}' не является правильным выражением SPDX, прерывается" + +#: src/reuse/_util.py:624 +msgid "'{}' is not a valid SPDX License Identifier." +msgstr "'{}' не является действительным идентификатором лицензии SPDX." + +#: src/reuse/_util.py:631 +msgid "Did you mean:" +msgstr "Вы имели в виду:" + +#: src/reuse/_util.py:638 +msgid "" +"See for a list of valid SPDX License " +"Identifiers." +msgstr "" +"Список допустимых идентификаторов лицензий SPDX см. в ." + +#: src/reuse/convert_dep5.py:118 +msgid "no '.reuse/dep5' file" +msgstr "Нет файла '.reuse/dep5'" + +#: src/reuse/download.py:130 +msgid "SPDX License Identifier of license" +msgstr "Лицензия SPDX Идентификатор лицензии" + +#: src/reuse/download.py:135 +msgid "download all missing licenses detected in the project" +msgstr "загрузить все отсутствующие лицензии, обнаруженные в проекте" + +#: src/reuse/download.py:145 +msgid "" +"source from which to copy custom LicenseRef- licenses, either a directory " +"that contains the file or the file itself" +msgstr "" +"источник, из которого копируются пользовательские лицензии LicenseRef-, либо " +"каталог, содержащий файл, либо сам файл" + +#: src/reuse/download.py:156 +#, python-brace-format +msgid "Error: {spdx_identifier} already exists." +msgstr "Ошибка: {spdx_identifier} уже существует." + +#: src/reuse/download.py:163 +#, python-brace-format +msgid "Error: {path} does not exist." +msgstr "Ошибка: {path} не существует." + +#: src/reuse/download.py:166 +msgid "Error: Failed to download license." +msgstr "Ошибка: Не удалось загрузить лицензию." + +#: src/reuse/download.py:171 +msgid "Is your internet connection working?" +msgstr "Работает ли ваше интернет-соединение?" + +#: src/reuse/download.py:176 +#, python-brace-format +msgid "Successfully downloaded {spdx_identifier}." +msgstr "Успешно загружен {spdx_identifier}." + +#: src/reuse/download.py:188 +msgid "--output has no effect when used together with --all" +msgstr "--output не имеет эффекта, если используется вместе с --all" + +#: src/reuse/download.py:192 +msgid "the following arguments are required: license" +msgstr "необходимы следующие аргументы: лицензия" + +#: src/reuse/download.py:194 +msgid "cannot use --output with more than one license" +msgstr "Невозможно использовать --output с более чем одной лицензией" + +#: src/reuse/global_licensing.py:109 +#, python-brace-format +msgid "" +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." +msgstr "" +"{attr_name} должно быть {type_name} (получено {value}, которое является " +"{value_class})." + +#: src/reuse/global_licensing.py:122 +#, python-brace-format +msgid "" +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." +msgstr "" +"Элемент в коллекции {attr_name} должен быть {type_name} (получил " +"{item_value}, который является {item_class})." + +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." +msgstr "{attr_name} не должно быть пустым." + +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" +"{name} должно быть {type} (получено {value}, которое является {value_type})." + +#: src/reuse/global_licensing.py:179 +#, python-brace-format +msgid "" +"The value of 'precedence' must be one of {precedence_vals} (got {received})" +msgstr "" +"Значение '\"Привилегия\" должно быть одним из {precedence_vals} (получено " +"{received})" + +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"В сгенерированном комментарии отсутствуют строки об авторских правах или " +"выражениях лицензии" + +#: src/reuse/lint.py:30 +msgid "prevents output" +msgstr "предотвращает выход" + +#: src/reuse/lint.py:33 +msgid "formats output as JSON" +msgstr "форматирует вывод в формате JSON" + +#: src/reuse/lint.py:39 +msgid "formats output as plain text" +msgstr "Форматирует вывод в виде обычного текста" + +#: src/reuse/lint.py:45 +#, fuzzy +msgid "formats output as errors per line" +msgstr "Форматирует вывод в виде обычного текста" + +#: src/reuse/lint.py:64 +msgid "BAD LICENSES" +msgstr "ПЛОХАЯ ЛИЦЕНЗИЯ" + +#: src/reuse/lint.py:66 src/reuse/lint.py:95 +msgid "'{}' found in:" +msgstr "'{}' найдено в:" + +#: src/reuse/lint.py:73 +msgid "DEPRECATED LICENSES" +msgstr "УСТАРЕВШИЕ ЛИЦЕНЗИИ" + +#: src/reuse/lint.py:75 +msgid "The following licenses are deprecated by SPDX:" +msgstr "Следующие лицензии устарели в SPDX:" + +#: src/reuse/lint.py:83 +msgid "LICENSES WITHOUT FILE EXTENSION" +msgstr "ЛИЦЕНЗИИ БЕЗ РАСШИРЕНИЯ ФАЙЛА" + +#: src/reuse/lint.py:85 +msgid "The following licenses have no file extension:" +msgstr "Следующие лицензии не имеют расширения файла:" + +#: src/reuse/lint.py:93 +msgid "MISSING LICENSES" +msgstr "ОТСУТСТВУЮЩИЕ ЛИЦЕНЗИИ" + +#: src/reuse/lint.py:102 +msgid "UNUSED LICENSES" +msgstr "НЕИСПОЛЬЗОВАННЫЕ ЛИЦЕНЗИИ" + +#: src/reuse/lint.py:103 +msgid "The following licenses are not used:" +msgstr "Следующие лицензии не используются:" + +#: src/reuse/lint.py:110 +msgid "READ ERRORS" +msgstr "ОШИБКИ ЧТЕНИЯ" + +#: src/reuse/lint.py:111 +msgid "Could not read:" +msgstr "Не удалось прочитать:" + +#: src/reuse/lint.py:132 +msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" +msgstr "ОТСУТСТВИЕ ИНФОРМАЦИИ ОБ АВТОРСКИХ ПРАВАХ И ЛИЦЕНЗИРОВАНИИ" + +#: src/reuse/lint.py:138 +msgid "The following files have no copyright and licensing information:" +msgstr "" +"Следующие файлы не содержат информации об авторских правах и лицензировании:" + +#: src/reuse/lint.py:149 +msgid "The following files have no copyright information:" +msgstr "Следующие файлы не содержат информации об авторских правах:" + +#: src/reuse/lint.py:158 +msgid "The following files have no licensing information:" +msgstr "Следующие файлы не содержат информации о лицензировании:" + +#: src/reuse/lint.py:166 +msgid "SUMMARY" +msgstr "РЕЗЮМЕ" + +#: src/reuse/lint.py:171 +msgid "Bad licenses:" +msgstr "Плохие лицензии:" + +#: src/reuse/lint.py:172 +msgid "Deprecated licenses:" +msgstr "Утраченные лицензии:" + +#: src/reuse/lint.py:173 +msgid "Licenses without file extension:" +msgstr "Лицензии без расширения файла:" + +#: src/reuse/lint.py:176 +msgid "Missing licenses:" +msgstr "Отсутствующие лицензии:" + +#: src/reuse/lint.py:177 +msgid "Unused licenses:" +msgstr "Неиспользованные лицензии:" + +#: src/reuse/lint.py:178 +msgid "Used licenses:" +msgstr "Используемые лицензии:" + +#: src/reuse/lint.py:179 +msgid "Read errors:" +msgstr "Читайте ошибки:" + +#: src/reuse/lint.py:181 +msgid "Files with copyright information:" +msgstr "Файлы с информацией об авторских правах:" + +#: src/reuse/lint.py:185 +msgid "Files with license information:" +msgstr "Файлы с информацией о лицензии:" + +#: src/reuse/lint.py:202 +msgid "" +"Congratulations! Your project is compliant with version {} of the REUSE " +"Specification :-)" +msgstr "Поздравляем! Ваш проект соответствует версии {} спецификации REUSE :-)" + +#: src/reuse/lint.py:209 +msgid "" +"Unfortunately, your project is not compliant with version {} of the REUSE " +"Specification :-(" +msgstr "" +"К сожалению, ваш проект не соответствует версии {} спецификации REUSE :-(" + +#: src/reuse/lint.py:216 +msgid "RECOMMENDATIONS" +msgstr "РЕКОМЕНДАЦИИ" + +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Утраченные лицензии:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Лицензии без расширения файла:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Неиспользованные лицензии:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' не является действительным идентификатором лицензии SPDX." + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, python-brace-format +msgid "'{path}' covered by {global_path}" +msgstr "'{path}' покрыт {global_path}" + +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" +"'{path}' покрывается исключительно REUSE.toml. Не читать содержимое файла." + +#: src/reuse/project.py:277 +#, python-brace-format +msgid "" +"'{path}' was detected as a binary file; not searching its contents for REUSE " +"information." +msgstr "" +"'{path}' был обнаружен как двоичный файл; поиск информации о REUSE в его " +"содержимом не производится." + +#: src/reuse/project.py:334 +msgid "" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." +msgstr "" +"'.reuse/dep5' является устаревшим. Вместо него рекомендуется использовать " +"REUSE.toml. Для преобразования используйте `reuse convert-dep5`." + +#: src/reuse/project.py:348 +#, python-brace-format +msgid "" +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." +msgstr "" +"Найдены оба файла '{new_path}' и '{old_path}'. Вы не можете хранить оба " +"файла одновременно; они несовместимы." + +#: src/reuse/project.py:414 +#, python-brace-format +msgid "determining identifier of '{path}'" +msgstr "определяющий идентификатор '{path}'" + +#: src/reuse/project.py:422 +#, python-brace-format +msgid "{path} does not have a file extension" +msgstr "У {path} нет расширения файла" + +#: src/reuse/project.py:432 +#, python-brace-format +msgid "" +"Could not resolve SPDX License Identifier of {path}, resolving to " +"{identifier}. Make sure the license is in the license list found at or that it starts with 'LicenseRef-', and that it has a " +"file extension." +msgstr "" +"Не удалось разрешить идентификатор лицензии SPDX {path}, разрешается " +"{identifier}. Убедитесь, что лицензия находится в списке лицензий по адресу " +" или что она начинается с 'LicenseRef-' и имеет " +"расширение файла." + +#: src/reuse/project.py:444 +#, python-brace-format +msgid "" +"{identifier} is the SPDX License Identifier of both {path} and {other_path}" +msgstr "" +"{identifier} - это идентификатор лицензии SPDX для {path} и {other_path}" + +#: src/reuse/project.py:483 +msgid "" +"project '{}' is not a VCS repository or required VCS software is not " +"installed" +msgstr "" +"Проект '{}' не является репозиторием VCS или в нем не установлено " +"необходимое программное обеспечение VCS" + +#: src/reuse/report.py:310 +#, python-brace-format +msgid "Could not read '{path}'" +msgstr "Не удалось прочитать '{path}'" + +#: src/reuse/report.py:317 +#, python-brace-format +msgid "Unexpected error occurred while parsing '{path}'" +msgstr "При разборе '{path}' произошла непредвиденная ошибка" + +#: src/reuse/report.py:438 +msgid "" +"Fix bad licenses: At least one license in the LICENSES directory and/or " +"provided by 'SPDX-License-Identifier' tags is invalid. They are either not " +"valid SPDX License Identifiers or do not start with 'LicenseRef-'. FAQ about " +"custom licenses: https://reuse.software/faq/#custom-license" +msgstr "" +"Исправление недействительных лицензий: По крайней мере одна лицензия в " +"каталоге LICENSES и/или предоставленная тегами 'SPDX-License-Identifier', " +"является недействительной. Они либо не являются действительными " +"идентификаторами лицензий SPDX, либо не начинаются с 'LicenseRef-'. Часто " +"задаваемые вопросы о пользовательских лицензиях: https://reuse.software/faq/" +"#custom-license" + +#: src/reuse/report.py:449 +msgid "" +"Fix deprecated licenses: At least one of the licenses in the LICENSES " +"directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" +"dep5' has been deprecated by SPDX. The current list and their respective " +"recommended new identifiers can be found here: " +msgstr "" +"Исправление устаревших лицензий: По крайней мере одна из лицензий в каталоге " +"LICENSES и/или предоставленная тегом 'SPDX-License-Identifier' или в файле '." +"reuse/dep5', была устаревшей в SPDX. Текущий список и рекомендуемые новые " +"идентификаторы можно найти здесь: " + +#: src/reuse/report.py:460 +msgid "" +"Fix licenses without file extension: At least one license text file in the " +"'LICENSES' directory does not have a '.txt' file extension. Please rename " +"the file(s) accordingly." +msgstr "" +"Исправьте лицензии без расширения файла: По крайней мере один текстовый файл " +"лицензии в каталоге 'LICENSES' не имеет расширения '.txt'. Пожалуйста, " +"переименуйте файл(ы) соответствующим образом." + +#: src/reuse/report.py:469 +msgid "" +"Fix missing licenses: For at least one of the license identifiers provided " +"by the 'SPDX-License-Identifier' tags, there is no corresponding license " +"text file in the 'LICENSES' directory. For SPDX license identifiers, you can " +"simply run 'reuse download --all' to get any missing ones. For custom " +"licenses (starting with 'LicenseRef-'), you need to add these files yourself." +msgstr "" +"Исправление отсутствующих лицензий: По крайней мере для одного из " +"идентификаторов лицензий, предоставляемых тегами 'SPDX-License-Identifier', " +"в каталоге 'LICENSES' нет соответствующего текстового файла лицензии. Для " +"идентификаторов лицензий SPDX можно просто выполнить команду 'reuse download " +"--all', чтобы получить все недостающие идентификаторы. Для пользовательских " +"лицензий (начинающихся с 'LicenseRef-') вам нужно добавить эти файлы " +"самостоятельно." + +#: src/reuse/report.py:481 +msgid "" +"Fix unused licenses: At least one of the license text files in 'LICENSES' is " +"not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " +"make sure that you either tag the accordingly licensed files properly, or " +"delete the unused license text if you are sure that no file or code snippet " +"is licensed as such." +msgstr "" +"Исправьте неиспользуемые лицензии: По крайней мере, на один из файлов с " +"текстом лицензии в 'LICENSES' не ссылается ни один файл, например, тег 'SPDX-" +"License-Identifier'. Пожалуйста, убедитесь, что вы либо пометили " +"соответствующие лицензионные файлы должным образом, либо удалили " +"неиспользуемый лицензионный текст, если вы уверены, что ни один файл или " +"фрагмент кода не лицензируется как таковой." + +#: src/reuse/report.py:492 +msgid "" +"Fix read errors: At least one of the files in your directory cannot be read " +"by the tool. Please check the file permissions. You will find the affected " +"files at the top of the output as part of the logged error messages." +msgstr "" +"Исправьте ошибки чтения: По крайней мере один из файлов в вашей директории " +"не может быть прочитан инструментом. Проверьте права доступа к файлам. " +"Затронутые файлы вы найдете в верхней части вывода в виде сообщений об " +"ошибках." + +#: src/reuse/report.py:501 +msgid "" +"Fix missing copyright/licensing information: For one or more files, the tool " +"cannot find copyright and/or licensing information. You typically do this by " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " +"file. The tutorial explains additional ways to do this: " +msgstr "" +"Исправление отсутствующей информации об авторских правах/лицензировании: Для " +"одного или нескольких файлов инструмент не может найти информацию об " +"авторских правах и/или лицензировании. Обычно это можно сделать, добавив к " +"каждому файлу теги 'SPDX-FileCopyrightText' и 'SPDX-License-Identifier'. В " +"учебнике описаны дополнительные способы решения этой задачи: " + +#: src/reuse/spdx.py:32 +msgid "" +"populate the LicenseConcluded field; note that reuse cannot guarantee the " +"field is accurate" +msgstr "" +"заполните поле LicenseConcluded; обратите внимание, что повторное " +"использование не может гарантировать точность поля" + +#: src/reuse/spdx.py:39 +msgid "name of the person signing off on the SPDX report" +msgstr "имя лица, подписавшего отчет SPDX" + +#: src/reuse/spdx.py:44 +msgid "name of the organization signing off on the SPDX report" +msgstr "название организации, подписавшей отчет SPDX" + +#: src/reuse/spdx.py:60 +msgid "" +"error: --creator-person=NAME or --creator-organization=NAME required when --" +"add-license-concluded is provided" +msgstr "" +"ошибка: требуется --создатель-личность= ИМЯ или -создатель-организация= ИМЯ, " +"если указано --добавить- лицензию- заключенную" + +#: src/reuse/spdx.py:75 +#, python-brace-format +msgid "" +"'{path}' does not match a common SPDX file pattern. Find the suggested " +"naming conventions here: https://spdx.github.io/spdx-spec/conformance/#44-" +"standard-data-format-requirements" +msgstr "" +"'{path}' не соответствует распространенному шаблону файлов SPDX. " +"Предлагаемые соглашения об именовании можно найти здесь: https://spdx.github." +"io/spdx-spec/conformance/#44-standard-data-format-requirements" + +#: /usr/lib/python3.10/argparse.py:308 +msgid "usage: " +msgstr "использование: " + +#: /usr/lib/python3.10/argparse.py:880 +msgid ".__call__() not defined" +msgstr ".__call__() не определено" + +#: /usr/lib/python3.10/argparse.py:1223 +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" +"неизвестный синтаксический анализатор %(parser_name)r (варианты: %(choices)s)" + +#: /usr/lib/python3.10/argparse.py:1283 +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "аргумент \"-\" с режимом %r" + +#: /usr/lib/python3.10/argparse.py:1292 +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "Невозможно открыть '%(filename)s': %(error)s" + +#: /usr/lib/python3.10/argparse.py:1501 +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "Невозможно объединить действия - две группы названы %r" + +#: /usr/lib/python3.10/argparse.py:1539 +msgid "'required' is an invalid argument for positionals" +msgstr "'\"Обязательный\" - недопустимый аргумент для позиционирования" + +#: /usr/lib/python3.10/argparse.py:1561 +#, python-format +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" +msgstr "" +"Недопустимая строка опций %(option)r: должна начинаться с символа " +"%(prefix_chars)r" + +#: /usr/lib/python3.10/argparse.py:1579 +#, python-format +msgid "dest= is required for options like %r" +msgstr "dest= требуется для опций типа %r" + +#: /usr/lib/python3.10/argparse.py:1596 +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "Недопустимое значение конфликтного_разрешения: %r" + +#: /usr/lib/python3.10/argparse.py:1614 +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +"одна,двадцать одна,тридцать одна,сорок одна,пятьдесят одна,шестьдесят одна," +"семьдесят одна,восемдесят одна,девяносто одна, сто одна противоречащая " +"строка опций: %s" +msgstr[1] "" +"две,три,четыре,двадцать две,двадцать три,двадцать четыре,тридцать две," +"тридцать три,тридцать четыре,сорок две конфликтующих строк опций: %s" +msgstr[2] "" +"ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать,тринадцать " +"конфликтующих строк опций: %s" + +#: /usr/lib/python3.10/argparse.py:1680 +msgid "mutually exclusive arguments must be optional" +msgstr "взаимоисключающие аргументы должны быть необязательными" + +#: /usr/lib/python3.10/argparse.py:1748 +msgid "positional arguments" +msgstr "позиционные аргументы" + +#: /usr/lib/python3.10/argparse.py:1749 +msgid "options" +msgstr "варианты" + +#: /usr/lib/python3.10/argparse.py:1764 +msgid "show this help message and exit" +msgstr "покажите это справочное сообщение и выйдите" + +#: /usr/lib/python3.10/argparse.py:1795 +msgid "cannot have multiple subparser arguments" +msgstr "не может иметь несколько аргументов подпарсера" + +#: /usr/lib/python3.10/argparse.py:1847 /usr/lib/python3.10/argparse.py:2362 +#, python-format +msgid "unrecognized arguments: %s" +msgstr "нераспознанные аргументы: %s" + +#: /usr/lib/python3.10/argparse.py:1948 +#, python-format +msgid "not allowed with argument %s" +msgstr "не разрешено с аргументом %s" + +#: /usr/lib/python3.10/argparse.py:1998 /usr/lib/python3.10/argparse.py:2012 +#, python-format +msgid "ignored explicit argument %r" +msgstr "проигнорирован явный аргумент %r" + +#: /usr/lib/python3.10/argparse.py:2119 +#, python-format +msgid "the following arguments are required: %s" +msgstr "требуются следующие аргументы: %s" + +#: /usr/lib/python3.10/argparse.py:2134 +#, python-format +msgid "one of the arguments %s is required" +msgstr "требуется один из аргументов %s" + +#: /usr/lib/python3.10/argparse.py:2177 +msgid "expected one argument" +msgstr "ожидается один аргумент" + +#: /usr/lib/python3.10/argparse.py:2178 +msgid "expected at most one argument" +msgstr "ожидается не более одного аргумента" + +#: /usr/lib/python3.10/argparse.py:2179 +msgid "expected at least one argument" +msgstr "ожидал по крайней мере один аргумент" + +#: /usr/lib/python3.10/argparse.py:2183 +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +"один,двадцать один,тридцать один,сорок один,пятьдесят один,шестьдесят один," +"семдесят один,восемдесят один,девяносто один,сто один ожидаемый аргумент %s" +msgstr[1] "" +"два,три,четыре,двадцать два,двадцать три,двадцать четыре,тридцать два," +"тридцать три,тридцать четыре,сорок два ожидаемых %s аргументов" +msgstr[2] "" +"ноль,пять,шесть,семь,восемь,девять,десять,одинадцать,двенадцать,тринадцать " +"ожидаемых %s аргументов" + +#: /usr/lib/python3.10/argparse.py:2241 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "Неоднозначная опция: %(option)s может соответствовать %(matches)s" + +#: /usr/lib/python3.10/argparse.py:2305 +#, python-format +msgid "unexpected option string: %s" +msgstr "Неожиданная строка опции: %s" + +#: /usr/lib/python3.10/argparse.py:2502 +#, python-format +msgid "%r is not callable" +msgstr "%r не является вызываемым" + +#: /usr/lib/python3.10/argparse.py:2519 +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "Недопустимое значение %(type)s: %(value)r" + +#: /usr/lib/python3.10/argparse.py:2530 +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "Неверный выбор: %(value)r (выберите из %(choices)s" + +#: /usr/lib/python3.10/argparse.py:2606 +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: ошибка: %(message)s\n" + +#, python-brace-format +#~ msgid "" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." +#~ msgstr "" +#~ "Информация об авторских правах и лицензировании для '{original_path}' " +#~ "была найдена как в '{path}', так и в файле DEP5, расположенном по адресу " +#~ "'{dep5_path}'. Информация из этих двух источников была объединена. Вместо " +#~ "этого рекомендуется использовать REUSE.toml, где можно указать порядок " +#~ "приоритета. Для преобразования используйте `reuse convert-dep5`. " +#~ "Запускайте с `--suppress-deprecation`, чтобы скрыть это предупреждение." diff --git a/po/sv.po b/po/sv.po index 7bd6ca291..0b17fc897 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2024-01-08 20:06+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish for more information, and " @@ -29,7 +172,7 @@ msgstr "" "reuse.software/> för mer information och för " "den web-baserade dokumentationen." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." @@ -37,11 +180,11 @@ msgstr "" "Den här versionen av reuse är kompatibel med version {} av REUSE-" "specifikationen." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Stötta FSFE's arbete:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -51,43 +194,43 @@ msgstr "" "möjligt för oss att jobba för Fri mjukvara där det är nödvändigt. Vänligen " "överväg att göra en donation till ." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "hoppa inte över undermoduler för Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "hoppa inte över underprojekt för Meson" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "definiera roten av projektet" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "visa programmets versionsnummer och avsluta" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -95,56 +238,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "initialisera REUSE-projektet" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "hämta en licens och placera den i mappen LICENSES/" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "lista alla filer som inte uppfyller kraven" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -165,73 +275,75 @@ msgid "" "- Do all files have valid copyright and licensing information?" msgstr "" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "lista alla SPDX-licenser som stöds" -#: src/reuse/_main.py:295 -#, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 +#, fuzzy, python-brace-format +msgid "'{path}' could not be decoded as UTF-8." msgstr "'{dep5}' kunde inte avkodas som UTF-8." -#: src/reuse/_main.py:302 -#, python-brace-format +#: src/reuse/_main.py:269 +#, fuzzy, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" "'{dep5}' kunde inte tolkas. Vi tog emot följande felmeddelande: {message}" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "ingen '{}'-fil eller kunde inte läsa den" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kunde inte tolka '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' är inte en fil" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' är inte en katalog" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "kan inte öppna '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "kan inte skriva till katalogen '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "kan inte skriva till '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "kan inte läsa eller skriva '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' är inte ett giltigt SPDX-uttryck, avbryter" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Menade du:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -239,298 +351,306 @@ msgstr "" "Se för en lista över giltiga SPDX-" "licensidentifierare." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +msgid "no '.reuse/dep5' file" +msgstr "" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "ladda ner alla saknade licenser som upptäckts i projektet" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fel: {spdx_identifier} existerar redan." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "Fel: {path} existerar inte." -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Fel: Hämtningen av licensen misslyckades." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Fungerar din internet-anslutning?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Hämtningen av {spdx_identifier} lyckades." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "följande argument behövs: licens" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "kan inte använda --output med mer än en licens" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." -msgstr "" - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "" - -#: src/reuse/init.py:86 -msgid "Project already initialized" +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "" - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "" - -#: src/reuse/init.py:128 -msgid "Retrieving {}" -msgstr "" - -#: src/reuse/init.py:133 -msgid "{} already exists" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." msgstr "" -#: src/reuse/init.py:136 -msgid "Could not download {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." -msgstr "" - -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:172 -msgid "Initialization complete." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" msgstr "" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +msgid "Files with copyright information:" msgstr "" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +msgid "Files with license information:" msgstr "" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "" + +#: src/reuse/lint.py:303 +#, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "" + +#: src/reuse/lint.py:312 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{lic_path}: unused license\n" msgstr "" -#: src/reuse/project.py:239 +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "" + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, python-brace-format +msgid "'{path}' covered by {global_path}" +msgstr "" + +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -539,29 +659,29 @@ msgid "" "file extension." msgstr "" -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -569,7 +689,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -578,14 +698,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -594,7 +714,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -603,18 +723,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -796,3 +916,9 @@ msgstr "" #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" + +#~ msgid "initialize REUSE project" +#~ msgstr "initialisera REUSE-projektet" + +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "ingen '{}'-fil eller kunde inte läsa den" diff --git a/po/tr.po b/po/tr.po index a392974e5..3af8604bf 100644 --- a/po/tr.po +++ b/po/tr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" "PO-Revision-Date: 2023-09-28 07:03+0000\n" "Last-Translator: \"T. E. Kalaycı\" \n" "Language-Team: Turkish for more information, and " @@ -27,17 +184,17 @@ msgstr "" " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Bu reuse sürümü, REUSE Belirtiminin {} sürümüyle uyumludur." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "FSFE'nin çalışmalarını destekleyin:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -47,44 +204,43 @@ msgstr "" "Özgür Yazılım için çalışmamızı sağlıyorlar. Lütfen adresi üzerinden bağış yapmayı değerlendirin." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "hata ayıklama cümlelerini etkinleştirir" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "kullanımdan kaldırma uyarılarını gizle" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "Git alt modüllerini atlamaz" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "Meson alt projelerini atlamaz" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "çoklu işlem kullanmaz" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "projenin kökünü tanımlar" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "programın sürüm numarasını gösterip çıkar" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "alt komutlar" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "dosya başlıklarına telif hakkı ve lisans bilgilerini ekler" -#: src/reuse/_main.py:120 -#, fuzzy +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -92,95 +248,23 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Bir veya daha fazla dosya başlığına telif hakkı ve lisans bilgisini ekle.\n" -"\n" -"İlgili dosyaların başlığına hangi telif hakkı sahiplerinin ve lisansların " -"ekleneceğini --copyright ve --license değişkenlerini kullanarak " -"belirtebilirsiniz.\n" -"\n" -"Katkıda bulunan ama ilgili dosyaların telif hakkı sahibi olmayan kişiler " -"veya oluşumlar için --contributor kullanabilirsiniz.\n" -"İlk yorum, yeni telif hakkı ve lisans bilgisiyle önceki telif hakkı ve " -"lisans bilgisini içeren yeni bir başlık ile değiştiriliyor. Eğer ilk yorumu " -"değiştirmemek istiyorsanız --no-replace kullanın.\n" -"\n" -"Yorum biçimi dosyalarınız için otomatik olarak belirlenecektir. Eğer bir " -"yorum biçimi belirlenemezse, süreç iptal edilecektir. Kullanılacak yorum " -"biçimini belirtmek için --style değişkenini kullanın.\n" -"\n" -"Mevcut olduğunda tek satırlı yorum biçimi kullanılacaktır. Eğer tek satır " -"yorum biçimi mevcut değilse, çok satırlı yorum biçimi kullanılır. Belirli " -"bir yorum biçimini --single-line veya --multi-line ile belirleyebilirsiniz.\n" -"\n" -"Başlık yorumu şablonunu --template değişkenini kullanarak " -"değiştirebilirsiniz. Bir Jinja2 şablonunu .reuse/templates/mytemplate.jinja2 " -"içerisine koyun. Şablonu '--template mytemplate' şeklinde kullanabilirsiniz. " -"Bu özelliği nasıl kullanabileceğinizi çevrimiçi belgelerden " -"öğrenebilirsiniz.\n" -"\n" -"Eğer ikili bir dosya tespit edilirse veya eğer --explicit-license " -"tanımlıysa, başlık .license dosyasına koyulacaktır." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Bir lisans indirir ve LICENSES/ dizinine yerleştirir.\n" -"\n" -"LICENSES/ dizini şu sırayla otomatik olarak aranır:\n" -"\n" -"- VCS deposunun kökündeki LICENSES/ dizini\n" -"\n" -"- Eğer ismi LICENSES ise mevcut dizin\n" -"\n" -"- Mevcut dizindeki LICENSES/ dizini\n" -"\n" -"Eğer LICENSES/ dizini bulunamazsa, yeni bir tane oluşturulur." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "REUSE projesini ilkler" +#: src/reuse/_main.py:142 +#, fuzzy +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "bütün uyumsuz dosyaları listeler" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -215,72 +299,74 @@ msgstr "" "\n" "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "projenin malzeme listesini SPDX biçiminde yazdırır" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "tüm desteklenen SPDK lisanslarını listeler" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "" + +#: src/reuse/_main.py:263 #, fuzzy, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." +msgid "'{path}' could not be decoded as UTF-8." msgstr ".reuse/dep5 utf-8 olarak çözümlenemiyor" -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "'{path}' çözümlenemeyen bir SPDX ifadesine sahip, dosya atlanıyor" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' bir dosya değil" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' bir dizin değil" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "'{}' açılamıyor" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "'{}' dizinine yazılamıyor" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "'{}' yazılamıyor" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "'{}' okunamıyor veya yazılamıyor" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Şunu mu kastettiniz:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -288,307 +374,310 @@ msgstr "" "Geçerli SPDX Lisans Kimlikleri listesi için " "adresine bakın." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +#, fuzzy +msgid "no '.reuse/dep5' file" +msgstr ".reuse/dep5 oluşturuluyor" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Lisansın SPDX Lisans Kimliği" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "projede tespit edilen bütün eksik lisansları indir" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" msgstr "" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Hata: {spdx_identifier} halihazırda mevcut." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, fuzzy, python-brace-format msgid "Error: {path} does not exist." msgstr "'{path}' .spdx ile bitmiyor" -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Hata: lisans indirme başarısız oldu." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "İnternet bağlantınız çalışıyor mu?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} başarılı bir şekilde indirildi." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--all ile birlikte kullanıldığında --output'un bir etkisi yok" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "şu değişkenler gerekiyor: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "--output birden fazla lisansla birlikte kullanılamıyor" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Projeniz hangi lisansa sahip? SPDX Lisans Kimliğini belirtin. Liste için " -" adresine bakabilirsiniz." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." -msgstr "Projeniz başka hangi lisanslara sahip? SPDX Lisans Kimliğini belirtin." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Lisans eklemeyi durdurmak için ENTER tuşuna basın." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Proje zaten ilklenmiş" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Proje REUSE için ilkleniyor." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Projenin ismi nedir?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Projenin İnternet adresi nedir?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Bakımcının adı nedir?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Bakımcının e-posta adresi nedir?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Tümü bitti! Şimdi ilkleniyor." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} zaten mevcut" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." +msgstr "" -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "{} indirilemiyor" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "" -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr ".reuse/dep5 oluşturuluyor" - -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "İlkleme tamamlandı." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "çıktıyı önler" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "çıktıyı JSON olarak biçimlendirir" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "çıktıyı düz metin olarak biçimlendirir" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +#, fuzzy +msgid "formats output as errors per line" +msgstr "çıktıyı düz metin olarak biçimlendirir" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "KÖTÜ LİSANSLAR" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' şurada mevcut:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "MODASI GEÇMİŞ LİSANSLAR" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "Şu lisanslar artık SPDX tarafından kullanılmıyor:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "DOSYA UZANTISI OLMAYAN LİSANSLAR" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Şu lisansların dosya uzantısı yok:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "EKSİK LİSANSLAR" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "KULLANILMAYAN LİSANSLAR" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Şu lisanslar kullanılmıyor:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "OKUMA HATALARI" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Okunamıyor:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "EKSİK TELİF HAKKI VE LİSANS BİLGİSİ" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "Şu dosyalarda telif hakkı ve lisans bilgisi yok:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Şu dosyalarda telif hakkı bilgisi yok:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Şu dosyalarda lisans bilgisi yok:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "ÖZET" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Kötü lisanslar:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Modası geçmiş lisanslar:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Dosya uzantısı olmayan lisanslar:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Eksik lisanslar:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Kullanılmayan lisanslar:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Kullanılan lisanslar:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "Okuma hataları:" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" +#: src/reuse/lint.py:181 +#, fuzzy +msgid "Files with copyright information:" msgstr "Telif hakkı içeren dosyalar:" -#: src/reuse/lint.py:178 -msgid "files with license information:" +#: src/reuse/lint.py:185 +#, fuzzy +msgid "Files with license information:" msgstr "Lisans bilgisi içeren dosyalar:" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Tebrikler! Projeniz REUSE Belirtiminin {} sürümüyle uyumlu :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "Maalesef, projeniz REUSE Belirtiminin {} sürümüyle uyumlu değil :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:296 +#, fuzzy, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "Modası geçmiş lisanslar:" + +#: src/reuse/lint.py:303 +#, fuzzy, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "Dosya uzantısı olmayan lisanslar:" + +#: src/reuse/lint.py:312 +#, fuzzy, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "Kullanılmayan lisanslar:" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "" + +#: src/reuse/lint.py:326 +#, python-brace-format +msgid "{path}: read error\n" +msgstr "" + +#: src/reuse/lint.py:330 +#, fuzzy, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." + +#: src/reuse/lint.py:334 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" +msgid "{path}: no copyright notice\n" +msgstr "" + +#: src/reuse/project.py:262 +#, fuzzy, python-brace-format +msgid "'{path}' covered by {global_path}" msgstr "'{path}' .reuse/dep5 ile kapsanıyor" -#: src/reuse/project.py:239 +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "" + +#: src/reuse/project.py:277 #, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" -msgstr "'{path}' çözümlenemeyen bir SPDX ifadesine sahip, dosya atlanıyor" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." +msgstr "" -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -"'{original_path}' için telif hakkı ve lisans bilgisi hem '{path}' yolunda " -"hem de '{dep5_path}' yolunda yer alan DEP5 dosyasında bulundu. Bu iki " -"kaynaktaki bilgileri birleştirildi. Gelecekte bu davranış değişecek ve " -"açıkça birleştirmeyi etkinleştirmeniz gerekecek. Daha fazla bilgi için " -" adresine bakabilirsiniz. " -"Henüz bir şey yapmanız gerek yok. Bu uyarıyı gizlemek için `--suppress-" -"deprecation` seçeneğiyle çalıştırabilirsiniz." -#: src/reuse/project.py:384 +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "'{path}' kimliği belirleniyor" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} dosya uzantısına sahip değil" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -601,31 +690,31 @@ msgstr "" "veya 'LicenseRef-' ile başladığından ve bir dosya uzantısına sahip " "olduğundan emin olun." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} hem {path} hem de {other_path} için SPDX Lisans Kimliğidir" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 #, fuzzy msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" msgstr "proje bir VCS deposu değil veya gerekli VCS yazılımı kurulu değil" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -633,7 +722,7 @@ msgid "" "custom licenses: https://reuse.software/faq/#custom-license" msgstr "" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -642,14 +731,14 @@ msgid "" "#deprecated>" msgstr "" -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " "the file(s) accordingly." msgstr "" -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -658,7 +747,7 @@ msgid "" "licenses (starting with 'LicenseRef-'), you need to add these files yourself." msgstr "" -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -667,18 +756,18 @@ msgid "" "is licensed as such." msgstr "" -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " "files at the top of the output as part of the logged error messages." msgstr "" -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" @@ -868,135 +957,182 @@ msgstr "hatalı tercih: %(value)r (%(choices)s seçilmelidir)" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 sözdizim hataları içeriyor" - -#~ msgid "optional arguments" -#~ msgstr "isteğe bağlı değişkenler" - -#~ msgid "deprecated in favor of annotate" -#~ msgstr "annotate için kullanımdan kaldırıldı" - +#, fuzzy, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." #~ msgstr "" -#~ "'{path}' tek satırlık yorumları desteklemiyor, lütfen --single-line " -#~ "kullanmayın" +#~ "'{original_path}' için telif hakkı ve lisans bilgisi hem '{path}' yolunda " +#~ "hem de '{dep5_path}' yolunda yer alan DEP5 dosyasında bulundu. Bu iki " +#~ "kaynaktaki bilgileri birleştirildi. Gelecekte bu davranış değişecek ve " +#~ "açıkça birleştirmeyi etkinleştirmeniz gerekecek. Daha fazla bilgi için " +#~ " adresine bakabilirsiniz. " +#~ "Henüz bir şey yapmanız gerek yok. Bu uyarıyı gizlemek için `--suppress-" +#~ "deprecation` seçeneğiyle çalıştırabilirsiniz." -#~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" -#~ msgstr "" -#~ "'{path}' çok satırlı yorumları desteklemiyor, lütfen --multi-line " -#~ "kullanmayın" +#~ msgid "initialize REUSE project" +#~ msgstr "REUSE projesini ilkler" #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "Aşağıdaki dosya bilinen bir dosya uzantısına sahip değil. Lütfen --style, " -#~ "--force-dot-license veya --skip-unrecognised kullanın:" - -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Tanınmayan {path} dosyası atlandı" - -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Halihazırda REUSE bilgisi içeren '{path}' dosyası atlanıyor" - -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Hata: '{path}' için yorum oluşturulamıyor" +#~ "Projeniz hangi lisansa sahip? SPDX Lisans Kimliğini belirtin. Liste için " +#~ " adresine bakabilirsiniz." #~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Hata: '{path}' için üretilen başlık yorumu telif hakkı satırlarını veya " -#~ "lisans ifadelerini içermiyor. Şablon hatalı olabilir. Yeni başlık " -#~ "yazılmadı." - -#~ msgid "Successfully changed header of {path}" -#~ msgstr "{path} başlığı başarılı bir şekilde değiştirildi" +#~ "Projeniz başka hangi lisanslara sahip? SPDX Lisans Kimliğini belirtin." -#~ msgid "copyright statement, repeatable" -#~ msgstr "telif hakkı ifadesi, tekrarlanabilir" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Lisans eklemeyi durdurmak için ENTER tuşuna basın." -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "SPDX Kimliği, tekrarlanabilir" +#~ msgid "Project already initialized" +#~ msgstr "Proje zaten ilklenmiş" -#~ msgid "file contributor, repeatable" -#~ msgstr "dosyaya katkı veren, tekrarlanabilir" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Proje REUSE için ilkleniyor." -#~ msgid "year of copyright statement, optional" -#~ msgstr "telif hakkı ifadesi, isteğe bağlı" +#~ msgid "What is the name of the project?" +#~ msgstr "Projenin ismi nedir?" -#~ msgid "comment style to use, optional" -#~ msgstr "kullanılacak yorum biçimi, isteğe bağlı" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Projenin İnternet adresi nedir?" -#~ msgid "copyright style to use, optional" -#~ msgstr "kullanılacak telif hakkı biçimi, isteğe bağlı" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Bakımcının adı nedir?" -#~ msgid "name of template to use, optional" -#~ msgstr "kullanılacak şablon ismi, isteğe bağlı" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Bakımcının e-posta adresi nedir?" -#~ msgid "do not include year in statement" -#~ msgstr "ifadede yıl içerme" +#~ msgid "All done! Initializing now." +#~ msgstr "Tümü bitti! Şimdi ilkleniyor." -#~ msgid "merge copyright lines if copyright statements are identical" -#~ msgstr "" -#~ "eğer telif hakkı ifadeleri aynıysa telif hakkı satırlarını birleştir" +#~ msgid "{} already exists" +#~ msgstr "{} zaten mevcut" -#~ msgid "force single-line comment style, optional" -#~ msgstr "tek satırlı yorum biçimi kullan, isteğe bağlı" +#~ msgid "Could not download {}" +#~ msgstr "{} indirilemiyor" -#~ msgid "force multi-line comment style, optional" -#~ msgstr "çok satırlı yorum biçimi kullan, isteğe bağlı" +#~ msgid "Initialization complete." +#~ msgstr "İlkleme tamamlandı." -#~ msgid "write a .license file instead of a header inside the file" -#~ msgstr "dosyanın başlığına yazmak yerine bir .license yazar" +#, fuzzy +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Bir veya daha fazla dosya başlığına telif hakkı ve lisans bilgisini " +#~ "ekle.\n" +#~ "\n" +#~ "İlgili dosyaların başlığına hangi telif hakkı sahiplerinin ve lisansların " +#~ "ekleneceğini --copyright ve --license değişkenlerini kullanarak " +#~ "belirtebilirsiniz.\n" +#~ "\n" +#~ "Katkıda bulunan ama ilgili dosyaların telif hakkı sahibi olmayan kişiler " +#~ "veya oluşumlar için --contributor kullanabilirsiniz.\n" +#~ "İlk yorum, yeni telif hakkı ve lisans bilgisiyle önceki telif hakkı ve " +#~ "lisans bilgisini içeren yeni bir başlık ile değiştiriliyor. Eğer ilk " +#~ "yorumu değiştirmemek istiyorsanız --no-replace kullanın.\n" +#~ "\n" +#~ "Yorum biçimi dosyalarınız için otomatik olarak belirlenecektir. Eğer bir " +#~ "yorum biçimi belirlenemezse, süreç iptal edilecektir. Kullanılacak yorum " +#~ "biçimini belirtmek için --style değişkenini kullanın.\n" +#~ "\n" +#~ "Mevcut olduğunda tek satırlı yorum biçimi kullanılacaktır. Eğer tek satır " +#~ "yorum biçimi mevcut değilse, çok satırlı yorum biçimi kullanılır. Belirli " +#~ "bir yorum biçimini --single-line veya --multi-line ile " +#~ "belirleyebilirsiniz.\n" +#~ "\n" +#~ "Başlık yorumu şablonunu --template değişkenini kullanarak " +#~ "değiştirebilirsiniz. Bir Jinja2 şablonunu .reuse/templates/mytemplate." +#~ "jinja2 içerisine koyun. Şablonu '--template mytemplate' şeklinde " +#~ "kullanabilirsiniz. Bu özelliği nasıl kullanabileceğinizi çevrimiçi " +#~ "belgelerden öğrenebilirsiniz.\n" +#~ "\n" +#~ "Eğer ikili bir dosya tespit edilirse veya eğer --explicit-license " +#~ "tanımlıysa, başlık .license dosyasına koyulacaktır." -#~ msgid "add headers to all files under specified directories recursively" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." #~ msgstr "" -#~ "başlıkları belirlenen dizinlerin altındaki tüm dosyalara yinelemeli " -#~ "olarak ekle" +#~ "Bir lisans indirir ve LICENSES/ dizinine yerleştirir.\n" +#~ "\n" +#~ "LICENSES/ dizini şu sırayla otomatik olarak aranır:\n" +#~ "\n" +#~ "- VCS deposunun kökündeki LICENSES/ dizini\n" +#~ "\n" +#~ "- Eğer ismi LICENSES ise mevcut dizin\n" +#~ "\n" +#~ "- Mevcut dizindeki LICENSES/ dizini\n" +#~ "\n" +#~ "Eğer LICENSES/ dizini bulunamazsa, yeni bir tane oluşturulur." -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "dosyadaki ilk başlığı değiştirme; sadece yeni bir tane ekle" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 sözdizim hataları içeriyor" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "tanımlanamayan yorum biçimleri içeren dosyaları atla" +#~ msgid "optional arguments" +#~ msgstr "isteğe bağlı değişkenler" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "halihazırda REUSE bilgisi içeren dosyaları atla" +#~ msgid "deprecated in favor of annotate" +#~ msgstr "annotate için kullanımdan kaldırıldı" #~ msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" #~ msgstr "'reuse addheader', 'reuse annotate' adına kullanımdan kaldırıldı" -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "--contributor, --copyright veya --license seçenekleri gereklidir" - #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "--exclude-year ve --year seçeneklerinden biri olmalıdır" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "--single-line ve --multi-line seçeneklerinden biri olmalıdır" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--skip-unrecognised, --style ile kullanıldığında etkisizdir" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "" #~ "--explicit-license, --force-dot-license adına kullanımdan kaldırıldı" -#~ msgid "template {template} could not be found" -#~ msgstr "{template} şablonu bulunamıyor" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' ikili bir dosya, bu nedenle başlık için '{new_path}' kullanılacak" - #~ msgid "Downloading {}" #~ msgstr "{} indiriliyor" diff --git a/po/uk.po b/po/uk.po index e252bcfd0..60273b9ec 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,20 +8,174 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-19 11:28+0000\n" -"PO-Revision-Date: 2023-11-04 14:36+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"POT-Creation-Date: 2024-07-03 13:09+0000\n" +"PO-Revision-Date: 2024-07-02 21:10+0000\n" +"Last-Translator: Hotripak \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.2-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.7-dev\n" -#: src/reuse/_main.py:38 +#: src/reuse/_annotate.py:74 +#, python-brace-format +msgid "" +"'{path}' does not support single-line comments, please do not use --single-" +"line" +msgstr "" +"'{path}' не підтримує однорядкові коментарі, не використовуйте --single-line" + +#: src/reuse/_annotate.py:81 +#, python-brace-format +msgid "" +"'{path}' does not support multi-line comments, please do not use --multi-line" +msgstr "" +"'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-line" + +#: src/reuse/_annotate.py:136 +#, python-brace-format +msgid "Skipped unrecognised file '{path}'" +msgstr "Пропущено нерозпізнаний файл '{path}'" + +#: src/reuse/_annotate.py:142 +#, python-brace-format +msgid "'{path}' is not recognised; creating '{path}.license'" +msgstr "'{path}' не розпізнано; створення '{path}.license'" + +#: src/reuse/_annotate.py:158 +#, python-brace-format +msgid "Skipped file '{path}' already containing REUSE information" +msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" + +#: src/reuse/_annotate.py:192 +#, python-brace-format +msgid "Error: Could not create comment for '{path}'" +msgstr "Помилка: не вдалося створити коментар для '{path}'" + +#: src/reuse/_annotate.py:199 +#, python-brace-format +msgid "" +"Error: Generated comment header for '{path}' is missing copyright lines or " +"license expressions. The template is probably incorrect. Did not write new " +"header." +msgstr "" +"Помилка: у згенерованому заголовку коментаря для '{path}' відсутні рядки " +"авторських прав або вирази ліцензії. Шаблон, ймовірно, неправильний. Не " +"записано новий заголовок." + +#. TODO: This may need to be rephrased more elegantly. +#: src/reuse/_annotate.py:210 +#, python-brace-format +msgid "Successfully changed header of {path}" +msgstr "Успішно змінено заголовок {path}" + +#: src/reuse/_annotate.py:221 +msgid "--skip-unrecognised has no effect when used together with --style" +msgstr "--skip-unrecognised не працює разом із --style" + +#: src/reuse/_annotate.py:231 +msgid "option --contributor, --copyright or --license is required" +msgstr "потрібен параметр --contributor, --copyright або --license" + +#: src/reuse/_annotate.py:272 +#, python-brace-format +msgid "template {template} could not be found" +msgstr "не вдалося знайти шаблон {template}" + +#: src/reuse/_annotate.py:341 src/reuse/_util.py:573 +msgid "can't write to '{}'" +msgstr "неможливо записати в '{}'" + +#: src/reuse/_annotate.py:366 +msgid "" +"The following files do not have a recognised file extension. Please use --" +"style, --force-dot-license, --fallback-dot-license, or --skip-unrecognised:" +msgstr "" +"Наступні файли не мають розпізнаного файлового розширення. Будь ласка, " +"використовуйте --style, --force-dot-license, --fallback-dot-license або --" +"skip-unrecognised:" + +#: src/reuse/_annotate.py:382 +msgid "copyright statement, repeatable" +msgstr "оголошення авторського права, повторюване" + +#: src/reuse/_annotate.py:389 +msgid "SPDX Identifier, repeatable" +msgstr "Ідентифікатор SPDX, повторюваний" + +#: src/reuse/_annotate.py:395 +msgid "file contributor, repeatable" +msgstr "співавтор файлу, повторюваний" + +#: src/reuse/_annotate.py:403 +msgid "year of copyright statement, optional" +msgstr "рік оголошення авторського права, необов'язково" + +#: src/reuse/_annotate.py:411 +msgid "comment style to use, optional" +msgstr "використовуваний стиль коментарів, необов'язковий" + +#: src/reuse/_annotate.py:417 +msgid "copyright prefix to use, optional" +msgstr "префікс авторського права для користування, опціонально" + +#: src/reuse/_annotate.py:430 +msgid "name of template to use, optional" +msgstr "використовувана назва шаблону, необов'язково" + +#: src/reuse/_annotate.py:435 +msgid "do not include year in statement" +msgstr "не включати рік в оголошення" + +#: src/reuse/_annotate.py:440 +msgid "merge copyright lines if copyright statements are identical" +msgstr "" +"об’єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні" + +#: src/reuse/_annotate.py:446 +msgid "force single-line comment style, optional" +msgstr "примусовий однорядковий стиль коментаря, необов'язково" + +#: src/reuse/_annotate.py:451 +msgid "force multi-line comment style, optional" +msgstr "примусовий багаторядковий стиль коментарів, необов'язково" + +#: src/reuse/_annotate.py:458 +msgid "add headers to all files under specified directories recursively" +msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" + +#: src/reuse/_annotate.py:465 +msgid "do not replace the first header in the file; just add a new one" +msgstr "не замінювати перший заголовок у файлі; просто додавати новий" + +#: src/reuse/_annotate.py:473 +msgid "always write a .license file instead of a header inside the file" +msgstr "завжди записуйте файл .license замість заголовка всередині файлу" + +#: src/reuse/_annotate.py:480 +msgid "write a .license file to files with unrecognised comment styles" +msgstr "дописати файл .license до файлів з нерозпізнаними стилями коментарів" + +#: src/reuse/_annotate.py:486 +msgid "skip files with unrecognised comment styles" +msgstr "пропускати файли з нерозпізнаними стилями коментарів" + +#: src/reuse/_annotate.py:497 +msgid "skip files that already contain REUSE information" +msgstr "пропускати файли, які вже містять інформацію REUSE" + +#: src/reuse/_annotate.py:532 +#, python-brace-format +msgid "'{path}' is a binary, therefore using '{new_path}' for the header" +msgstr "" +"'{path}' — це двійковий файл, тому для заголовка використовується " +"'{new_path}'" + +#: src/reuse/_main.py:39 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " @@ -31,17 +185,17 @@ msgstr "" "software/> для отримання додаткових відомостей і перегляду онлайн-документації." -#: src/reuse/_main.py:44 +#: src/reuse/_main.py:45 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." -#: src/reuse/_main.py:47 +#: src/reuse/_main.py:48 msgid "Support the FSFE's work:" msgstr "Підтримати роботу FSFE:" -#: src/reuse/_main.py:51 +#: src/reuse/_main.py:52 msgid "" "Donations are critical to our strength and autonomy. They enable us to " "continue working for Free Software wherever necessary. Please consider " @@ -52,43 +206,43 @@ msgstr "" "де це необхідно. Будь ласка, розгляньте можливість підтримати нас на " "." -#: src/reuse/_main.py:74 +#: src/reuse/_main.py:75 msgid "enable debug statements" msgstr "увімкнути інструкції налагодження" -#: src/reuse/_main.py:79 +#: src/reuse/_main.py:80 msgid "hide deprecation warnings" msgstr "сховати попередження про застарілість" -#: src/reuse/_main.py:84 +#: src/reuse/_main.py:85 msgid "do not skip over Git submodules" msgstr "не пропускати підмодулі Git" -#: src/reuse/_main.py:89 +#: src/reuse/_main.py:90 msgid "do not skip over Meson subprojects" msgstr "не пропускати підпроєкти Meson" -#: src/reuse/_main.py:94 +#: src/reuse/_main.py:95 msgid "do not use multiprocessing" msgstr "не використовувати багатопроцесорність" -#: src/reuse/_main.py:101 +#: src/reuse/_main.py:102 msgid "define root of project" msgstr "визначити кореневий каталог проєкту" -#: src/reuse/_main.py:106 +#: src/reuse/_main.py:107 msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" -#: src/reuse/_main.py:110 +#: src/reuse/_main.py:111 msgid "subcommands" msgstr "підкоманди" -#: src/reuse/_main.py:117 +#: src/reuse/_main.py:118 msgid "add copyright and licensing into the header of files" msgstr "додати авторські права та ліцензії в заголовок файлів" -#: src/reuse/_main.py:120 +#: src/reuse/_main.py:121 msgid "" "Add copyright and licensing into the header of one or more files.\n" "\n" @@ -96,97 +250,30 @@ msgid "" "and licenses to add to the headers of the given files.\n" "\n" "By using --contributor, you can specify people or entity that contributed " -"but are not copyright holder of the given files.\n" -"The first comment is replaced with a new header containing the new copyright " -"and licensing information and its former copyright and licensing. If you " -"want to keep the first comment intact, use --no-replace.\n" -"\n" -"The comment style should be auto-detected for your files. If a comment style " -"could not be detected and --skip-unrecognised is not specified, the process " -"aborts. Use --style to specify or override the comment style to use.\n" -"\n" -"A single-line comment style is used when it is available. If no single-line " -"comment style is available, a multi-line comment style is used. You can " -"force a certain comment style using --single-line or --multi-line.\n" -"\n" -"You can change the template of the header comment by using --template. Place " -"a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can use the " -"template by specifying '--template mytemplate'. Read the online " -"documentation on how to use this feature.\n" -"\n" -"If a binary file is detected, or if --force-dot-license is specified, the " -"header is placed in a .license file." +"but are not copyright holder of the given files." msgstr "" -"Додайте відомості про авторські права та ліцензування в заголовок одного або " -"кількох файлів.\n" -"\n" -"За допомогою --copyright і --license ви можете вказати, яких власників " -"авторських прав і ліцензій слід додати до заголовків цих файлів.\n" -"\n" -"Використовуючи --contributor, ви можете вказати людей або організацію, які " -"зробили внесок, але не є власниками авторських прав на дані файли.\n" -"Перший коментар замінено новим заголовком, що містить нову інформацію про " -"авторське право та ліцензування, а також попередні авторські права та " -"ліцензування. Якщо ви хочете залишити перший коментар недоторканим, " -"використовуйте --no-replace.\n" -"\n" -"Стиль коментарів має бути визначено автоматично для ваших файлів. Якщо стиль " -"коментаря не вдалося визначити й не вказано --skip-unrecognised, процес буде " -"перервано. Використовуйте --style, щоб вказати або перевизначити стиль " -"коментування.\n" +"Додайте інформацію про авторські права та ліцензування в заголовок одного " +"або декількох файлів.\n" "\n" -"Стиль однорядкового коментаря буде використано, якщо він доступний. Якщо " -"стиль однорядкового коментаря недоступний, використовується стиль " -"багаторядкового коментаря. Ви можете примусово застосувати певний стиль " -"коментарів за ljlfdib --single-line або --multi-line.\n" +" За допомогою --copyright і --license ви можете вказати, яких власників " +"авторських прав і ліцензій додавати до заголовків цих файлів.\n" "\n" -"Ви можете змінити шаблон заголовка коментаря за допомогою --template. " -"Помістіть шаблон Jinja2 до теки .reuse/templates/mytemplate.jinja2. Ви " -"можете використовувати шаблон, вказавши '--template mytemplate'. Прочитайте " -"онлайн-документацію про те, як користуватися цією функцією.\n" -"\n" -"Якщо виявлено двійковий файл або якщо вказано --force-dot-license, заголовок " -"буде розміщено у файлі .license." +" За допомогою --contributor ви можете вказати особу або організацію, яка " +"зробила внесок, але не є власником авторських прав на дані файли." -#: src/reuse/_main.py:163 +#: src/reuse/_main.py:140 msgid "download a license and place it in the LICENSES/ directory" msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" -#: src/reuse/_main.py:166 -msgid "" -"Download a license and place it in the LICENSES/ directory.\n" -"\n" -"The LICENSES/ directory is automatically found in the following order:\n" -"\n" -"- The LICENSES/ directory in the root of the VCS repository.\n" -"\n" -"- The current directory if its name is LICENSES.\n" -"\n" -"- The LICENSES/ directory in the current directory.\n" -"\n" -"If the LICENSES/ directory cannot be found, one is simply created." -msgstr "" -"Завантажте ліцензію та розмістіть її в каталозі LICENSES/.\n" -"\n" -"Каталог LICENSES/ автоматично розміщено в такому порядку:\n" -"\n" -"- Каталог LICENSES/ в корені репозиторію VCS.\n" -"\n" -"- Поточний каталог, якщо його назва - LICENSES.\n" -"\n" -"- Каталог LICENSES/ в поточному каталозі.\n" -"\n" -"Якщо каталог LICENSES/ не вдається знайти, він просто створюється." - -#: src/reuse/_main.py:189 -msgid "initialize REUSE project" -msgstr "ініціалізувати проєкт REUSE" +#: src/reuse/_main.py:142 +msgid "Download a license and place it in the LICENSES/ directory." +msgstr "Завантажте ліцензію та помістіть її в папку LICENSES/." -#: src/reuse/_main.py:197 +#: src/reuse/_main.py:151 msgid "list all non-compliant files" msgstr "список усіх несумісних файлів" -#: src/reuse/_main.py:200 +#: src/reuse/_main.py:154 #, python-brace-format msgid "" "Lint the project directory for compliance with version {reuse_version} of " @@ -222,74 +309,77 @@ msgstr "" "\n" "- Чи всі файли мають дійсні відомості про авторські права та ліцензії?" -#: src/reuse/_main.py:227 +#: src/reuse/_main.py:181 msgid "print the project's bill of materials in SPDX format" msgstr "друкувати опис матеріалів проєкту у форматі SPDX" -#: src/reuse/_main.py:235 +#: src/reuse/_main.py:189 msgid "list all supported SPDX licenses" msgstr "список всіх підтримуваних ліцензій SPDX" -#: src/reuse/_main.py:295 +#: src/reuse/_main.py:198 +msgid "convert .reuse/dep5 to REUSE.toml" +msgstr "конвертувати .reuse/dep5 у REUSE.toml" + +#: src/reuse/_main.py:263 #, python-brace-format -msgid "'{dep5}' could not be decoded as UTF-8." -msgstr "Не вдалося розшифрувати '{dep5}' як utf-8." +msgid "'{path}' could not be decoded as UTF-8." +msgstr "'{path}' не може бути декодовано як UTF-8." -#: src/reuse/_main.py:302 +#: src/reuse/_main.py:269 #, python-brace-format msgid "" -"'{dep5}' could not be parsed. We received the following error message: " +"'{path}' could not be parsed. We received the following error message: " "{message}" msgstr "" -"'{dep5}' не вдалося розібрати. Ми отримали таке повідомлення про помилку: " -"{message}" +"'{path}' не вдалося розібрати. Ми отримали наступне повідомлення про " +"помилку: {message}" -#: src/reuse/_util.py:261 -msgid "no '{}' file, or could not read it" -msgstr "немає файлу '{}', або неможливо його прочитати" - -#: src/reuse/_util.py:413 +#: src/reuse/_util.py:368 src/reuse/global_licensing.py:218 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" -#: src/reuse/_util.py:547 +#: src/reuse/_util.py:424 +#, python-brace-format +msgid "" +"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +msgstr "" +"'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" + +#: src/reuse/_util.py:556 msgid "'{}' is not a file" msgstr "'{}' не є файлом" -#: src/reuse/_util.py:550 +#: src/reuse/_util.py:559 msgid "'{}' is not a directory" msgstr "'{}' не є каталогом" -#: src/reuse/_util.py:553 +#: src/reuse/_util.py:562 msgid "can't open '{}'" msgstr "не вдалося відкрити '{}'" -#: src/reuse/_util.py:558 +#: src/reuse/_util.py:567 msgid "can't write to directory '{}'" msgstr "неможливо записати в каталог '{}'" -#: src/reuse/_util.py:564 -msgid "can't write to '{}'" -msgstr "неможливо записати в '{}'" - -#: src/reuse/_util.py:577 +#: src/reuse/_util.py:586 msgid "can't read or write '{}'" msgstr "неможливо прочитати чи записати '{}'" -#: src/reuse/_util.py:587 +#: src/reuse/_util.py:596 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' не є дійсним виразом SPDX, переривання" -#: src/reuse/_util.py:615 +#: src/reuse/_util.py:624 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." -#: src/reuse/_util.py:622 +#: src/reuse/_util.py:631 msgid "Did you mean:" msgstr "Ви мали на увазі:" -#: src/reuse/_util.py:629 +#: src/reuse/_util.py:638 msgid "" "See for a list of valid SPDX License " "Identifiers." @@ -297,15 +387,19 @@ msgstr "" "Перегляньте список дійсних ідентифікаторів " "ліцензії SPDX." -#: src/reuse/download.py:122 +#: src/reuse/convert_dep5.py:118 +msgid "no '.reuse/dep5' file" +msgstr "немає файлу '.reuse/dep5" + +#: src/reuse/download.py:130 msgid "SPDX License Identifier of license" msgstr "Ідентифікатор ліцензії SPDX" -#: src/reuse/download.py:127 +#: src/reuse/download.py:135 msgid "download all missing licenses detected in the project" msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" -#: src/reuse/download.py:137 +#: src/reuse/download.py:145 msgid "" "source from which to copy custom LicenseRef- licenses, either a directory " "that contains the file or the file itself" @@ -313,301 +407,301 @@ msgstr "" "джерело, з якого можна скопіювати користувацькі ліцензії LicenseRef-, або " "каталог, який містить файл, або сам файл" -#: src/reuse/download.py:148 +#: src/reuse/download.py:156 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Помилка: {spdx_identifier} вже існує." -#: src/reuse/download.py:155 +#: src/reuse/download.py:163 #, python-brace-format msgid "Error: {path} does not exist." msgstr "Помилка: {path} не існує." -#: src/reuse/download.py:158 +#: src/reuse/download.py:166 msgid "Error: Failed to download license." msgstr "Помилка: не вдалося завантажити ліцензію." -#: src/reuse/download.py:163 +#: src/reuse/download.py:171 msgid "Is your internet connection working?" msgstr "Чи працює ваше інтернет-з'єднання?" -#: src/reuse/download.py:168 +#: src/reuse/download.py:176 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Успішно завантажено {spdx_identifier}." -#: src/reuse/download.py:180 +#: src/reuse/download.py:188 msgid "--output has no effect when used together with --all" msgstr "--output не працює разом з --all" -#: src/reuse/download.py:184 +#: src/reuse/download.py:192 msgid "the following arguments are required: license" msgstr "необхідні такі аргументи: license" -#: src/reuse/download.py:186 +#: src/reuse/download.py:194 msgid "cannot use --output with more than one license" msgstr "не можна використовувати --output з кількома ліцензіями" -#: src/reuse/header.py:99 -msgid "generated comment is missing copyright lines or license expressions" -msgstr "" -"у згенерованому коментарі відсутні рядки про авторські права або вирази " -"ліцензії" - -#: src/reuse/init.py:30 +#: src/reuse/global_licensing.py:109 +#, python-brace-format msgid "" -"What license is your project under? Provide the SPDX License Identifier. See " -" for the list." +"{attr_name} must be a {type_name} (got {value} that is a {value_class})." msgstr "" -"Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX. " -"Перегляньте список ." +"{attr_name} має бути {type_name} (отримано {value}, що є {value_class})." -#: src/reuse/init.py:35 +#: src/reuse/global_licensing.py:122 +#, python-brace-format msgid "" -"What other license is your project under? Provide the SPDX License " -"Identifier." +"Item in {attr_name} collection must be a {type_name} (got {item_value} that " +"is a {item_class})." msgstr "" -"Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX." - -#: src/reuse/init.py:46 -msgid "To stop adding licenses, hit RETURN." -msgstr "Щоб припинити додавання ліцензій, натисніть RETURN." - -#: src/reuse/init.py:86 -msgid "Project already initialized" -msgstr "Проєкт уже ініціалізовано" - -#: src/reuse/init.py:90 -msgid "Initializing project for REUSE." -msgstr "Ініціалізація проєкту для REUSE." - -#: src/reuse/init.py:95 -msgid "What is the name of the project?" -msgstr "Як називається проєкт?" - -#: src/reuse/init.py:101 -msgid "What is the internet address of the project?" -msgstr "Яка інтернет-адреса проєкту?" - -#: src/reuse/init.py:107 -msgid "What is the name of the maintainer?" -msgstr "Як звуть супроводжувача?" - -#: src/reuse/init.py:113 -msgid "What is the e-mail address of the maintainer?" -msgstr "Яка адреса електронної пошти супровідника?" - -#: src/reuse/init.py:119 -msgid "All done! Initializing now." -msgstr "Усе готово! Відбувається ініціалізація." - -#: src/reuse/init.py:128 -msgid "Retrieving {}" -msgstr "Витягнення {}" +"Елемент у колекції {attr_name} має бути {type_name} (отримав {item_value}, " +"що є {item_class})." -#: src/reuse/init.py:133 -msgid "{} already exists" -msgstr "{} вже існує" +#: src/reuse/global_licensing.py:133 +#, python-brace-format +msgid "{attr_name} must not be empty." +msgstr "{attr_name} не повинне бути порожнім." -#: src/reuse/init.py:136 -msgid "Could not download {}" -msgstr "Не вдалося завантажити {}" +#: src/reuse/global_licensing.py:156 +#, python-brace-format +msgid "{name} must be a {type} (got {value} that is a {value_type})." +msgstr "{name} має бути {type} (отримано {value}, яке є {value_type})." -#: src/reuse/init.py:141 +#: src/reuse/global_licensing.py:179 #, python-brace-format msgid "" -"Error: Could not copy {path}, please add {lic}.txt manually in the LICENCES/ " -"directory." +"The value of 'precedence' must be one of {precedence_vals} (got {received})" msgstr "" -"Помилка: Не вдалося скопіювати {path}. Додайте {lic}.txt вручну до " -"директорії LICENCES/." - -#: src/reuse/init.py:149 -msgid "Creating .reuse/dep5" -msgstr "Створення .reuse/dep5" +"Значення 'precedence' має бути одним з {precedence_vals} (отримано " +"{received})" -#: src/reuse/init.py:172 -msgid "Initialization complete." -msgstr "Ініціалізація завершена." +#: src/reuse/header.py:99 +msgid "generated comment is missing copyright lines or license expressions" +msgstr "" +"у згенерованому коментарі відсутні рядки про авторські права або вирази " +"ліцензії" -#: src/reuse/lint.py:29 +#: src/reuse/lint.py:30 msgid "prevents output" msgstr "запобігає виводу" -#: src/reuse/lint.py:32 +#: src/reuse/lint.py:33 msgid "formats output as JSON" msgstr "форматує вивід як JSON" -#: src/reuse/lint.py:38 +#: src/reuse/lint.py:39 msgid "formats output as plain text" msgstr "форматує вивід як звичайний текст" -#: src/reuse/lint.py:57 +#: src/reuse/lint.py:45 +msgid "formats output as errors per line" +msgstr "форматує вивід у вигляді помилок на рядок" + +#: src/reuse/lint.py:64 msgid "BAD LICENSES" msgstr "ПОГАНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:59 src/reuse/lint.py:88 +#: src/reuse/lint.py:66 src/reuse/lint.py:95 msgid "'{}' found in:" msgstr "'{}' знайдено в:" -#: src/reuse/lint.py:66 +#: src/reuse/lint.py:73 msgid "DEPRECATED LICENSES" msgstr "ЗАСТАРІЛІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:68 +#: src/reuse/lint.py:75 msgid "The following licenses are deprecated by SPDX:" msgstr "У SPDX застаріли такі ліцензії:" -#: src/reuse/lint.py:76 +#: src/reuse/lint.py:83 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "ЛІЦЕНЗІЇ БЕЗ РОЗШИРЕННЯ ФАЙЛУ" -#: src/reuse/lint.py:78 +#: src/reuse/lint.py:85 msgid "The following licenses have no file extension:" msgstr "Ці ліцензії не мають розширення файлу:" -#: src/reuse/lint.py:86 +#: src/reuse/lint.py:93 msgid "MISSING LICENSES" msgstr "ВІДСУТНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:95 +#: src/reuse/lint.py:102 msgid "UNUSED LICENSES" msgstr "НЕВИКОРИСТАНІ ЛІЦЕНЗІЇ" -#: src/reuse/lint.py:96 +#: src/reuse/lint.py:103 msgid "The following licenses are not used:" msgstr "Не використовуються такі ліцензії:" -#: src/reuse/lint.py:103 +#: src/reuse/lint.py:110 msgid "READ ERRORS" msgstr "ПОМИЛКИ ЧИТАННЯ" -#: src/reuse/lint.py:104 +#: src/reuse/lint.py:111 msgid "Could not read:" msgstr "Не вдалося прочитати:" -#: src/reuse/lint.py:125 +#: src/reuse/lint.py:132 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "ВІДСУТНІ ВІДОМОСТІ ПРО АВТОРСЬКІ ПРАВА ТА ЛІЦЕНЗУВАННЯ" -#: src/reuse/lint.py:131 +#: src/reuse/lint.py:138 msgid "The following files have no copyright and licensing information:" msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" -#: src/reuse/lint.py:142 +#: src/reuse/lint.py:149 msgid "The following files have no copyright information:" msgstr "Такі файли не містять відомостей про авторські права:" -#: src/reuse/lint.py:151 +#: src/reuse/lint.py:158 msgid "The following files have no licensing information:" msgstr "Такі файли не мають відомостей про ліцензування:" -#: src/reuse/lint.py:159 +#: src/reuse/lint.py:166 msgid "SUMMARY" msgstr "ПІДСУМОК" -#: src/reuse/lint.py:164 +#: src/reuse/lint.py:171 msgid "Bad licenses:" msgstr "Погані ліцензії:" -#: src/reuse/lint.py:165 +#: src/reuse/lint.py:172 msgid "Deprecated licenses:" msgstr "Застарілі ліцензії:" -#: src/reuse/lint.py:166 +#: src/reuse/lint.py:173 msgid "Licenses without file extension:" msgstr "Ліцензії без розширення файлу:" -#: src/reuse/lint.py:169 +#: src/reuse/lint.py:176 msgid "Missing licenses:" msgstr "Відсутні ліцензії:" -#: src/reuse/lint.py:170 +#: src/reuse/lint.py:177 msgid "Unused licenses:" msgstr "Невикористані ліцензії:" -#: src/reuse/lint.py:171 +#: src/reuse/lint.py:178 msgid "Used licenses:" msgstr "Використані ліцензії:" -#: src/reuse/lint.py:172 +#: src/reuse/lint.py:179 msgid "Read errors:" msgstr "Помилки читання:" -#: src/reuse/lint.py:174 -msgid "files with copyright information:" -msgstr "файли з відомостями про авторські права:" +#: src/reuse/lint.py:181 +msgid "Files with copyright information:" +msgstr "Файли з інформацією про авторські права:" -#: src/reuse/lint.py:178 -msgid "files with license information:" -msgstr "файли з відомостями про ліцензію:" +#: src/reuse/lint.py:185 +msgid "Files with license information:" +msgstr "Файли з інформацією про ліцензію:" -#: src/reuse/lint.py:195 +#: src/reuse/lint.py:202 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Вітаємо! Ваш проєкт відповідає версії {} специфікації REUSE :-)" -#: src/reuse/lint.py:202 +#: src/reuse/lint.py:209 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "На жаль, ваш проєкт не сумісний із версією {} специфікації REUSE :-(" -#: src/reuse/lint.py:209 +#: src/reuse/lint.py:216 msgid "RECOMMENDATIONS" msgstr "РЕКОМЕНДАЦІЇ" -#: src/reuse/project.py:233 +#: src/reuse/lint.py:289 +#, python-brace-format +msgid "{path}: bad license {lic}\n" +msgstr "{path}: bad license {lic}\n" + +#: src/reuse/lint.py:296 +#, python-brace-format +msgid "{lic_path}: deprecated license\n" +msgstr "{lic_path}: застаріла ліцензія\n" + +#: src/reuse/lint.py:303 +#, python-brace-format +msgid "{lic_path}: license without file extension\n" +msgstr "{lic_path}: ліцензія без розширення файлу\n" + +#: src/reuse/lint.py:312 +#, python-brace-format +msgid "{lic_path}: unused license\n" +msgstr "{lic_path}: невикористана ліцензія\n" + +#: src/reuse/lint.py:319 +#, python-brace-format +msgid "{path}: missing license {lic}\n" +msgstr "{path}: зникла ліцензія {lic}\n" + +#: src/reuse/lint.py:326 #, python-brace-format -msgid "'{path}' covered by .reuse/dep5" -msgstr "'{path}' охоплюється .reuse/dep5" +msgid "{path}: read error\n" +msgstr "{path}: помилка читання\n" -#: src/reuse/project.py:239 -#, fuzzy, python-brace-format +#: src/reuse/lint.py:330 +#, python-brace-format +msgid "{path}: no license identifier\n" +msgstr "{path}: немає ідентифікатора ліцензії\n" + +#: src/reuse/lint.py:334 +#, python-brace-format +msgid "{path}: no copyright notice\n" +msgstr "{path}: без повідомлення про авторське право\n" + +#: src/reuse/project.py:262 +#, python-brace-format +msgid "'{path}' covered by {global_path}" +msgstr "'{path}' покрито за рахунок {global_path}" + +#: src/reuse/project.py:270 +#, python-brace-format +msgid "" +"'{path}' is covered exclusively by REUSE.toml. Not reading the file contents." +msgstr "'{path}' покрито виключно файлом REUSE.toml. Не читаючи вміст файлу." + +#: src/reuse/project.py:277 +#, python-brace-format msgid "" "'{path}' was detected as a binary file; not searching its contents for REUSE " "information." msgstr "" "'{path}' виявлено як двійковий файл або його розширення позначено таким, що " -"не коментується; не виконується пошук інформації у його вмісті для REUSE." +"не коментується; пошук інформації у його вмісті для REUSE не виконується." -#: src/reuse/project.py:279 -#, python-brace-format +#: src/reuse/project.py:334 msgid "" -"'{path}' holds an SPDX expression that cannot be parsed, skipping the file" +"'.reuse/dep5' is deprecated. You are recommended to instead use REUSE.toml. " +"Use `reuse convert-dep5` to convert." msgstr "" -"'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" +"'.reuse/dep5' є застарілим. Замість нього рекомендовано використовувати " +"REUSE.toml. Для перетворення використовуйте `reuse convert-dep5`." -#: src/reuse/project.py:288 +#: src/reuse/project.py:348 #, python-brace-format msgid "" -"Copyright and licensing information for '{original_path}' has been found in " -"both '{path}' and in the DEP5 file located at '{dep5_path}'. The information " -"for these two sources has been aggregated. In the future this behaviour will " -"change, and you will need to explicitly enable aggregation. See . You need do nothing yet. Run with `--" -"suppress-deprecation` to hide this warning." +"Found both '{new_path}' and '{old_path}'. You cannot keep both files " +"simultaneously; they are not intercompatible." msgstr "" -"Інформацію про авторське право та ліцензування для '{original_path}' можна " -"знайти як у '{path}', так і у файлі DEP5, розташованому за адресою " -"'{dep5_path}'. Інформація для цих двох джерел була агрегована. У майбутньому " -"ця поведінка зміниться, і вам потрібно буде явно увімкнути агрегування. " -"Перегляньте . Наразі вам не " -"потрібно нічого робити. Запустіть програму з `--suppress-deprecation`, щоб " -"сховати це попередження." - -#: src/reuse/project.py:384 +"Знайдено як '{new_path}', так і '{old_path}'. Ви не можете зберігати обидва " +"файли одночасно, вони несумісні." + +#: src/reuse/project.py:414 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "визначення ідентифікатора '{path}'" -#: src/reuse/project.py:392 +#: src/reuse/project.py:422 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} не має розширення файлу" -#: src/reuse/project.py:402 +#: src/reuse/project.py:432 #, python-brace-format msgid "" "Could not resolve SPDX License Identifier of {path}, resolving to " @@ -620,14 +714,14 @@ msgstr "" "spdx.org/licenses/> або що вона починається з 'LicenseRef-' і має розширення " "файлу." -#: src/reuse/project.py:414 +#: src/reuse/project.py:444 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" -#: src/reuse/project.py:453 +#: src/reuse/project.py:483 msgid "" "project '{}' is not a VCS repository or required VCS software is not " "installed" @@ -635,17 +729,17 @@ msgstr "" "проєкт '{}' не є репозиторієм VCS або потрібне програмне забезпечення VCS не " "встановлено" -#: src/reuse/report.py:308 +#: src/reuse/report.py:310 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не вдалося прочитати '{path}'" -#: src/reuse/report.py:315 +#: src/reuse/report.py:317 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Під час аналізу '{path}' сталася неочікувана помилка" -#: src/reuse/report.py:436 +#: src/reuse/report.py:438 msgid "" "Fix bad licenses: At least one license in the LICENSES directory and/or " "provided by 'SPDX-License-Identifier' tags is invalid. They are either not " @@ -658,7 +752,7 @@ msgstr "" "Часті запитання про користувацькі ліцензії: https://reuse.software/faq/" "#custom-license" -#: src/reuse/report.py:447 +#: src/reuse/report.py:449 msgid "" "Fix deprecated licenses: At least one of the licenses in the LICENSES " "directory and/or provided by an 'SPDX-License-Identifier' tag or in '.reuse/" @@ -671,7 +765,7 @@ msgstr "" "застаріла для SPDX. Поточний список і відповідні рекомендовані нові " "ідентифікатори можна знайти тут: " -#: src/reuse/report.py:458 +#: src/reuse/report.py:460 msgid "" "Fix licenses without file extension: At least one license text file in the " "'LICENSES' directory does not have a '.txt' file extension. Please rename " @@ -681,7 +775,7 @@ msgstr "" "ліцензії в директорії 'LICENSES' не має розширення '.txt'. Перейменуйте " "файл(и) відповідно." -#: src/reuse/report.py:467 +#: src/reuse/report.py:469 msgid "" "Fix missing licenses: For at least one of the license identifiers provided " "by the 'SPDX-License-Identifier' tags, there is no corresponding license " @@ -696,7 +790,7 @@ msgstr "" "будь-які відсутні ідентифікатори. Для користувацьких ліцензій (починаючи з " "'LicenseRef-') вам потрібно додати ці файли самостійно." -#: src/reuse/report.py:479 +#: src/reuse/report.py:481 msgid "" "Fix unused licenses: At least one of the license text files in 'LICENSES' is " "not referenced by any file, e.g. by an 'SPDX-License-Identifier' tag. Please " @@ -710,7 +804,7 @@ msgstr "" "відповідні ліцензовані файли, або видаліть невикористаний текст ліцензії, " "якщо ви впевнені, що жоден файл або фрагмент коду не ліцензований як такий." -#: src/reuse/report.py:490 +#: src/reuse/report.py:492 msgid "" "Fix read errors: At least one of the files in your directory cannot be read " "by the tool. Please check the file permissions. You will find the affected " @@ -721,18 +815,18 @@ msgstr "" "відповідні файли у верхній частині виводу як частину зареєстрованих " "повідомлень про помилки." -#: src/reuse/report.py:499 +#: src/reuse/report.py:501 msgid "" "Fix missing copyright/licensing information: For one or more files, the tool " "cannot find copyright and/or licensing information. You typically do this by " -"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer' tags to each " +"adding 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier' tags to each " "file. The tutorial explains additional ways to do this: " msgstr "" "Виправте відсутню інформацію про авторські права/ліцензування: Для одного " "або кількох файлів інструмент не може знайти інформацію про авторські права " "та/або ліцензування. Зазвичай це можна зробити, додавши до кожного файлу " -"теги 'SPDX-FileCopyrightText' і 'SPDX-License-Identifer'. У довіднику " +"теги 'SPDX-FileCopyrightText' і 'SPDX-License-Identifier'. У довіднику " "описано інші способи зробити це: " #: src/reuse/spdx.py:32 @@ -923,134 +1017,193 @@ msgstr "неприпустимий вибір: %(value)r (варто обрат msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" -#~ msgid ".reuse/dep5 has syntax errors" -#~ msgstr ".reuse/dep5 має синтаксичні помилки" - -#~ msgid "optional arguments" -#~ msgstr "необов'язкові аргументи" - -#~ msgid "deprecated in favor of annotate" -#~ msgstr "вилучено на користь анотації" - +#, python-brace-format #~ msgid "" -#~ "'{path}' does not support single-line comments, please do not use --" -#~ "single-line" +#~ "Copyright and licensing information for '{original_path}' has been found " +#~ "in both '{path}' and in the DEP5 file located at '{dep5_path}'. The " +#~ "information for these two sources has been aggregated. You are " +#~ "recommended to instead use REUSE.toml, where you can specify the order of " +#~ "precedence. Use `reuse convert-dep5` to convert. Run with `--suppress-" +#~ "deprecation` to hide this warning." #~ msgstr "" -#~ "'{path}' не підтримує однорядкові коментарі, не використовуйте --single-" -#~ "line" +#~ "Інформацію про авторське право та ліцензування для '{original_path}' " +#~ "знайдено як в '{path}', так і у файлі DEP5, розташованому за адресою " +#~ "'{dep5_path}'. Інформація з цих двох джерел була об'єднана. Замість цього " +#~ "рекомендовано використовувати REUSE.txt, де ви можете вказати порядок " +#~ "пріоритету. Використовуйте `reuse convert-dep5` для перетворення. " +#~ "Запустіть з `--suppress-deprecation`, щоб приховати це попередження." + +#~ msgid "initialize REUSE project" +#~ msgstr "ініціалізувати проєкт REUSE" + +#~ msgid "no '{}' file, or could not read it" +#~ msgstr "немає файлу '{}', або неможливо його прочитати" #~ msgid "" -#~ "'{path}' does not support multi-line comments, please do not use --multi-" -#~ "line" +#~ "What license is your project under? Provide the SPDX License Identifier. " +#~ "See for the list." #~ msgstr "" -#~ "'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-" -#~ "line" +#~ "Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX. " +#~ "Перегляньте список ." #~ msgid "" -#~ "The following files do not have a recognised file extension. Please use --" -#~ "style, --force-dot-license or --skip-unrecognised:" +#~ "What other license is your project under? Provide the SPDX License " +#~ "Identifier." #~ msgstr "" -#~ "Ці файли не мають розпізнаного розширення файлу. Використовуйте --style, " -#~ "--force-dot-license або --skip-unrecognised:" - -#~ msgid "Skipped unrecognised file {path}" -#~ msgstr "Пропущений нерозпізнаний файл {path}" - -#~ msgid "Skipped file '{path}' already containing REUSE information" -#~ msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" +#~ "Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX." -#~ msgid "Error: Could not create comment for '{path}'" -#~ msgstr "Помилка: не вдалося створити коментар для '{path}'" +#~ msgid "To stop adding licenses, hit RETURN." +#~ msgstr "Щоб припинити додавання ліцензій, натисніть RETURN." -#~ msgid "" -#~ "Error: Generated comment header for '{path}' is missing copyright lines " -#~ "or license expressions. The template is probably incorrect. Did not write " -#~ "new header." -#~ msgstr "" -#~ "Помилка: у згенерованому заголовку коментаря для '{path}' відсутні рядки " -#~ "авторських прав або вирази ліцензії. Шаблон, ймовірно, неправильний. Не " -#~ "записано новий заголовок." +#~ msgid "Project already initialized" +#~ msgstr "Проєкт уже ініціалізовано" -#~ msgid "Successfully changed header of {path}" -#~ msgstr "Успішно змінено заголовок {path}" +#~ msgid "Initializing project for REUSE." +#~ msgstr "Ініціалізація проєкту для REUSE." -#~ msgid "copyright statement, repeatable" -#~ msgstr "оголошення авторського права, повторюване" +#~ msgid "What is the name of the project?" +#~ msgstr "Як називається проєкт?" -#~ msgid "SPDX Identifier, repeatable" -#~ msgstr "Ідентифікатор SPDX, повторюваний" +#~ msgid "What is the internet address of the project?" +#~ msgstr "Яка інтернет-адреса проєкту?" -#~ msgid "file contributor, repeatable" -#~ msgstr "співавтор файлу, повторюваний" +#~ msgid "What is the name of the maintainer?" +#~ msgstr "Як звуть супроводжувача?" -#~ msgid "year of copyright statement, optional" -#~ msgstr "рік оголошення авторського права, необов'язково" +#~ msgid "What is the e-mail address of the maintainer?" +#~ msgstr "Яка адреса електронної пошти супровідника?" -#~ msgid "comment style to use, optional" -#~ msgstr "використовуваний стиль коментарів, необов'язковий" +#~ msgid "All done! Initializing now." +#~ msgstr "Усе готово! Відбувається ініціалізація." -#~ msgid "copyright style to use, optional" -#~ msgstr "використовуваний стиль авторського права, необов'язковий" +#~ msgid "Retrieving {}" +#~ msgstr "Витягнення {}" -#~ msgid "name of template to use, optional" -#~ msgstr "використовувана назва шаблону, необов'язково" +#~ msgid "{} already exists" +#~ msgstr "{} вже існує" -#~ msgid "do not include year in statement" -#~ msgstr "не включати рік в оголошення" +#~ msgid "Could not download {}" +#~ msgstr "Не вдалося завантажити {}" -#~ msgid "merge copyright lines if copyright statements are identical" +#, python-brace-format +#~ msgid "" +#~ "Error: Could not copy {path}, please add {lic}.txt manually in the " +#~ "LICENCES/ directory." #~ msgstr "" -#~ "об’єднувати рядки авторських прав, якщо оголошення авторських прав " -#~ "ідентичні" - -#~ msgid "force single-line comment style, optional" -#~ msgstr "примусовий однорядковий стиль коментаря, необов'язково" +#~ "Помилка: Не вдалося скопіювати {path}. Додайте {lic}.txt вручну до " +#~ "директорії LICENCES/." -#~ msgid "force multi-line comment style, optional" -#~ msgstr "примусовий багаторядковий стиль коментарів, необов'язково" +#~ msgid "Initialization complete." +#~ msgstr "Ініціалізація завершена." -#~ msgid "write a .license file instead of a header inside the file" -#~ msgstr "записувати файл .license замість заголовка всередині файлу" +#~ msgid "" +#~ "Add copyright and licensing into the header of one or more files.\n" +#~ "\n" +#~ "By using --copyright and --license, you can specify which copyright " +#~ "holders and licenses to add to the headers of the given files.\n" +#~ "\n" +#~ "By using --contributor, you can specify people or entity that contributed " +#~ "but are not copyright holder of the given files.\n" +#~ "The first comment is replaced with a new header containing the new " +#~ "copyright and licensing information and its former copyright and " +#~ "licensing. If you want to keep the first comment intact, use --no-" +#~ "replace.\n" +#~ "\n" +#~ "The comment style should be auto-detected for your files. If a comment " +#~ "style could not be detected and --skip-unrecognised is not specified, the " +#~ "process aborts. Use --style to specify or override the comment style to " +#~ "use.\n" +#~ "\n" +#~ "A single-line comment style is used when it is available. If no single-" +#~ "line comment style is available, a multi-line comment style is used. You " +#~ "can force a certain comment style using --single-line or --multi-line.\n" +#~ "\n" +#~ "You can change the template of the header comment by using --template. " +#~ "Place a Jinja2 template in .reuse/templates/mytemplate.jinja2. You can " +#~ "use the template by specifying '--template mytemplate'. Read the online " +#~ "documentation on how to use this feature.\n" +#~ "\n" +#~ "If a binary file is detected, or if --force-dot-license is specified, the " +#~ "header is placed in a .license file." +#~ msgstr "" +#~ "Додайте відомості про авторські права та ліцензування в заголовок одного " +#~ "або кількох файлів.\n" +#~ "\n" +#~ "За допомогою --copyright і --license ви можете вказати, яких власників " +#~ "авторських прав і ліцензій слід додати до заголовків цих файлів.\n" +#~ "\n" +#~ "Використовуючи --contributor, ви можете вказати людей або організацію, " +#~ "які зробили внесок, але не є власниками авторських прав на дані файли.\n" +#~ "Перший коментар замінено новим заголовком, що містить нову інформацію про " +#~ "авторське право та ліцензування, а також попередні авторські права та " +#~ "ліцензування. Якщо ви хочете залишити перший коментар недоторканим, " +#~ "використовуйте --no-replace.\n" +#~ "\n" +#~ "Стиль коментарів має бути визначено автоматично для ваших файлів. Якщо " +#~ "стиль коментаря не вдалося визначити й не вказано --skip-unrecognised, " +#~ "процес буде перервано. Використовуйте --style, щоб вказати або " +#~ "перевизначити стиль коментування.\n" +#~ "\n" +#~ "Стиль однорядкового коментаря буде використано, якщо він доступний. Якщо " +#~ "стиль однорядкового коментаря недоступний, використовується стиль " +#~ "багаторядкового коментаря. Ви можете примусово застосувати певний стиль " +#~ "коментарів за ljlfdib --single-line або --multi-line.\n" +#~ "\n" +#~ "Ви можете змінити шаблон заголовка коментаря за допомогою --template. " +#~ "Помістіть шаблон Jinja2 до теки .reuse/templates/mytemplate.jinja2. Ви " +#~ "можете використовувати шаблон, вказавши '--template mytemplate'. " +#~ "Прочитайте онлайн-документацію про те, як користуватися цією функцією.\n" +#~ "\n" +#~ "Якщо виявлено двійковий файл або якщо вказано --force-dot-license, " +#~ "заголовок буде розміщено у файлі .license." -#~ msgid "add headers to all files under specified directories recursively" -#~ msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" +#~ msgid "" +#~ "Download a license and place it in the LICENSES/ directory.\n" +#~ "\n" +#~ "The LICENSES/ directory is automatically found in the following order:\n" +#~ "\n" +#~ "- The LICENSES/ directory in the root of the VCS repository.\n" +#~ "\n" +#~ "- The current directory if its name is LICENSES.\n" +#~ "\n" +#~ "- The LICENSES/ directory in the current directory.\n" +#~ "\n" +#~ "If the LICENSES/ directory cannot be found, one is simply created." +#~ msgstr "" +#~ "Завантажте ліцензію та розмістіть її в каталозі LICENSES/.\n" +#~ "\n" +#~ "Каталог LICENSES/ автоматично розміщено в такому порядку:\n" +#~ "\n" +#~ "- Каталог LICENSES/ в корені репозиторію VCS.\n" +#~ "\n" +#~ "- Поточний каталог, якщо його назва - LICENSES.\n" +#~ "\n" +#~ "- Каталог LICENSES/ в поточному каталозі.\n" +#~ "\n" +#~ "Якщо каталог LICENSES/ не вдається знайти, він просто створюється." -#~ msgid "do not replace the first header in the file; just add a new one" -#~ msgstr "не замінювати перший заголовок у файлі; просто додавати новий" +#~ msgid ".reuse/dep5 has syntax errors" +#~ msgstr ".reuse/dep5 має синтаксичні помилки" -#~ msgid "skip files with unrecognised comment styles" -#~ msgstr "пропускати файли з нерозпізнаними стилями коментарів" +#~ msgid "optional arguments" +#~ msgstr "необов'язкові аргументи" -#~ msgid "skip files that already contain REUSE information" -#~ msgstr "пропускати файли, які вже містять інформацію REUSE" +#~ msgid "deprecated in favor of annotate" +#~ msgstr "вилучено на користь анотації" #~ msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" #~ msgstr "'reuse addheader' застаріло й замінено на 'reuse annotate'" -#~ msgid "option --contributor, --copyright or --license is required" -#~ msgstr "потрібен параметр --contributor, --copyright або --license" - #~ msgid "option --exclude-year and --year are mutually exclusive" #~ msgstr "параметр --exclude-year і --year взаємосуперечливі" #~ msgid "option --single-line and --multi-line are mutually exclusive" #~ msgstr "параметр --single-line і --multi-line взаємосуперечливі" -#~ msgid "--skip-unrecognised has no effect when used together with --style" -#~ msgstr "--skip-unrecognised не працює разом із --style" - #~ msgid "" #~ "--explicit-license has been deprecated in favour of --force-dot-license" #~ msgstr "--explicit-license замінено на --force-dot-license" -#~ msgid "template {template} could not be found" -#~ msgstr "не вдалося знайти шаблон {template}" - -#~ msgid "'{path}' is a binary, therefore using '{new_path}' for the header" -#~ msgstr "" -#~ "'{path}' — це двійковий файл, тому для заголовка використовується " -#~ "'{new_path}'" - #~ msgid "Downloading {}" #~ msgstr "Завантаження {}" diff --git a/poetry.lock b/poetry.lock index 6fb3e1c12..728d880a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "alabaster" version = "0.7.13" @@ -5,50 +7,83 @@ description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "astroid" -version = "2.15.8" +version = "3.2.2" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.2.2-py3-none-any.whl", hash = "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0"}, + {file = "astroid-3.2.2.tar.gz", hash = "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94"}, +] [package.dependencies] -lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + [[package]] name = "babel" -version = "2.13.1" +version = "2.15.0" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, +] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} -setuptools = {version = "*", markers = "python_version >= \"3.12\""} [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" category = "dev" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -59,17 +94,45 @@ description = "Ultra-lightweight pure Python package to check if a file is binar category = "main" optional = false python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] [package.dependencies] chardet = ">=3.0.2" [[package]] name = "black" -version = "23.10.1" +version = "24.4.2" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] [package.dependencies] click = ">=8.0.0" @@ -82,7 +145,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -93,22 +156,41 @@ description = "Define boolean algebras, create and parse boolean expressions and category = "main" optional = false python-versions = "*" +files = [ + {file = "boolean.py-4.0-py3-none-any.whl", hash = "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd"}, + {file = "boolean.py-4.0.tar.gz", hash = "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4"}, +] [[package]] -name = "bump2version" -version = "1.0.1" -description = "Version-bump your software with a single command!" +name = "bumpver" +version = "2023.1129" +description = "Bump version numbers in project files." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=2.7" +files = [ + {file = "bumpver-2023.1129-py2.py3-none-any.whl", hash = "sha256:b2a55c0224215b6ca1c3a0c99827749927b7c61cbb5dfef75565dbda8e75f687"}, + {file = "bumpver-2023.1129.tar.gz", hash = "sha256:2a09813066d92ae2eabf882d4f9a88ebd60135e828c424bdf7800e1723e15010"}, +] + +[package.dependencies] +click = {version = "*", markers = "python_version >= \"3.6\""} +colorama = ">=0.4" +lexid = "*" +looseversion = {version = "*", markers = "python_version >= \"3.5\""} +toml = "*" [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] [[package]] name = "cfgv" @@ -117,6 +199,10 @@ description = "Validate configuration and produce human readable error messages. category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] [[package]] name = "chardet" @@ -125,14 +211,110 @@ description = "Universal encoding detector for Python 3" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] [[package]] name = "charset-normalizer" -version = "3.3.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" @@ -141,6 +323,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -152,25 +338,72 @@ description = "Cross-platform colored terminal text." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" - -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "coverage" -version = "7.3.2" +version = "7.5.4" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -180,30 +413,43 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" category = "dev" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] [[package]] name = "docstring-to-markdown" -version = "0.13" +version = "0.15" description = "On the fly conversion of Python docstrings to markdown" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "docstring-to-markdown-0.15.tar.gz", hash = "sha256:e146114d9c50c181b1d25505054a8d0f7a476837f0da2c19f07e06eaed52b73d"}, + {file = "docstring_to_markdown-0.15-py3-none-any.whl", hash = "sha256:27afb3faedba81e34c33521c32bbd258d7fbb79eedf7d29bc4e81080e854aec0"}, +] [[package]] name = "docutils" @@ -212,44 +458,75 @@ description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.12.4" +version = "3.15.4" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] -typing = ["typing-extensions (>=4.7.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "freezegun" +version = "1.5.1" +description = "Let your Python tests travel through time" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, + {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, +] + +[package.dependencies] +python-dateutil = ">=2.7" [[package]] name = "furo" -version = "2023.9.10" +version = "2024.5.6" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "furo-2024.5.6-py3-none-any.whl", hash = "sha256:490a00d08c0a37ecc90de03ae9227e8eb5d6f7f750edf9807f398a2bdf2358de"}, + {file = "furo-2024.5.6.tar.gz", hash = "sha256:81f205a6605ebccbb883350432b4831c0196dd3d1bc92f61e1f459045b3d2b0b"}, +] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" sphinx = ">=6.0,<8.0" -sphinx-basic-ng = "*" +sphinx-basic-ng = ">=1.0.0.beta2" [[package]] name = "gitdb" @@ -258,42 +535,59 @@ description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.40" +version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] name = "identify" -version = "2.5.30" +version = "2.5.36" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, +] [package.extras] license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] [[package]] name = "imagesize" @@ -302,22 +596,30 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "8.0.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -326,20 +628,25 @@ description = "brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" @@ -348,6 +655,10 @@ description = "An autocompletion tool for Python that can be used for text edito category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] [package.dependencies] parso = ">=0.8.3,<0.9.0" @@ -359,11 +670,15 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.4" description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -372,35 +687,142 @@ MarkupSafe = ">=2.0" i18n = ["Babel (>=2.7)"] [[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." +name = "lexid" +version = "2021.1006" +description = "Variable width build numbers with lexical ordering." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7" +files = [ + {file = "lexid-2021.1006-py2.py3-none-any.whl", hash = "sha256:5526bb5606fd74c7add23320da5f02805bddd7c77916f2dc1943e6bada8605ed"}, + {file = "lexid-2021.1006.tar.gz", hash = "sha256:509a3a4cc926d3dbf22b203b18a4c66c25e6473fb7c0e0d30374533ac28bafe5"}, +] [[package]] name = "license-expression" -version = "30.1.1" +version = "30.3.0" description = "license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "license-expression-30.3.0.tar.gz", hash = "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5"}, + {file = "license_expression-30.3.0-py3-none-any.whl", hash = "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41"}, +] [package.dependencies] "boolean.py" = ">=4.0" [package.extras] -docs = ["Sphinx (==5.1.0)", "doc8 (>=0.8.1)", "sphinx-rtd-theme (>=0.5.0)", "sphinxcontrib-apidoc (>=0.3.0)"] +docs = ["Sphinx (>=5.0.2)", "doc8 (>=0.11.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-reredirects (>=0.1.2)", "sphinx-rtd-dark-mode (>=1.3.0)", "sphinx-rtd-theme (>=1.0.0)", "sphinxcontrib-apidoc (>=0.4.0)"] testing = ["black", "isort", "pytest (>=6,!=7.0.0)", "pytest-xdist (>=2)", "twine"] +[[package]] +name = "looseversion" +version = "1.3.0" +description = "Version numbering for anarchists and software realists" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "looseversion-1.3.0-py2.py3-none-any.whl", hash = "sha256:781ef477b45946fc03dd4c84ea87734b21137ecda0e1e122bcb3c8d16d2a56e0"}, + {file = "looseversion-1.3.0.tar.gz", hash = "sha256:ebde65f3f6bb9531a81016c6fef3eb95a61181adc47b7f949e9c0ea47911669e"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] [[package]] name = "mccabe" @@ -409,14 +831,79 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.1" +description = "Collection of plugins for markdown-it-py" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "mypy" -version = "1.6.1" +version = "1.10.1" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, +] [package.dependencies] mypy-extensions = ">=1.0.0" @@ -426,6 +913,7 @@ typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -435,73 +923,130 @@ description = "Type system extensions for programs checked with the mypy type ch category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" +name = "myst-parser" +version = "3.0.1" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = ">=3.8" +files = [ + {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"}, + {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"}, +] [package.dependencies] -setuptools = "*" +docutils = ">=0.18,<0.22" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" +pyyaml = "*" +sphinx = ">=6,<8" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] [[package]] name = "pbr" -version = "5.11.1" +version = "6.0.0" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" +files = [ + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, +] [[package]] name = "platformdirs" -version = "3.11.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -509,11 +1054,15 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.21.0" +version = "3.5.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, + {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, +] [package.dependencies] cfgv = ">=2.0.0" @@ -522,33 +1071,58 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "protokolo" +version = "2.1.4" +description = "Protokolo is a change log generator." +category = "dev" +optional = false +python-versions = "<4.0,>=3.11" +files = [ + {file = "protokolo-2.1.4-cp311-cp311-manylinux_2_36_x86_64.whl", hash = "sha256:b10ff72199e5ced3fd662a5b870b673bf37a5c990dd4eacf054bdf3ea5f2e359"}, + {file = "protokolo-2.1.4.tar.gz", hash = "sha256:451addc697e43a2aac4db612acf747ffe839686e5ea71018a5bc1ea5adeddc08"}, +] + +[package.dependencies] +attrs = ">=22.1.0" +click = ">=8.0" + [[package]] name = "pygments" -version = "2.16.1" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] [package.extras] -plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "2.17.7" +version = "3.2.5" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.2.5-py3-none-any.whl", hash = "sha256:32cd6c042b5004b8e857d727708720c54a676d1e22917cf1a2df9b4d4868abd6"}, + {file = "pylint-3.2.5.tar.gz", hash = "sha256:e9b7171e242dcc6ebd0aaa7540481d1a72860748a0a7816b8fe6cf6c80a6fe7e"}, +] [package.dependencies] -astroid = ">=2.15.8,<=2.17.0-dev0" +astroid = ">=3.2.2,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, ] -isort = ">=4.2.5,<6" +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -566,6 +1140,9 @@ description = "Isort plugin for python-lsp-server" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pyls-isort-0.2.2.tar.gz", hash = "sha256:2192bd2203db00459f85eb329521feba58af63075d2dd10a051a4eccd000bba0"}, +] [package.dependencies] isort = "*" @@ -573,53 +1150,80 @@ python-lsp-server = "*" [[package]] name = "pylsp-mypy" -version = "0.6.7" +version = "0.6.8" description = "Mypy linter for the Python LSP Server" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pylsp-mypy-0.6.8.tar.gz", hash = "sha256:3f8307ca07d7e253e50e38c5fe31c371ceace0bc33d31c3429fa035d6d41bd5f"}, + {file = "pylsp_mypy-0.6.8-py3-none-any.whl", hash = "sha256:3ea7c406d0f100317a212d8cd39075a2c139f1a4a2866d4412fe531b3f23b381"}, +] [package.dependencies] mypy = ">=0.981" python-lsp-server = ">=1.7.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = ">=1.1.0" [package.extras] test = ["coverage", "pytest", "pytest-cov", "tox"] [[package]] name = "pytest" -version = "7.4.2" +version = "8.2.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" [[package]] name = "python-debian" @@ -628,20 +1232,28 @@ description = "Debian package related modules" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "python-debian-0.1.49.tar.gz", hash = "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c"}, + {file = "python_debian-0.1.49-py3-none-any.whl", hash = "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f"}, +] [package.dependencies] chardet = "*" [[package]] name = "python-lsp-black" -version = "1.3.0" +version = "2.0.0" description = "Black plugin for the Python LSP Server" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "python-lsp-black-2.0.0.tar.gz", hash = "sha256:8286d2d310c566844b3c116b824ada6fccfa6ba228b1a09a0526b74c04e0805f"}, + {file = "python_lsp_black-2.0.0-py3-none-any.whl", hash = "sha256:d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e"}, +] [package.dependencies] -black = ">=22.3.0" +black = ">=23.11.0" python-lsp-server = ">=1.4.0" tomli = {version = "*", markers = "python_version < \"3.11\""} @@ -655,6 +1267,10 @@ description = "JSON RPC 2.0 server library" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "python-lsp-jsonrpc-1.1.2.tar.gz", hash = "sha256:4688e453eef55cd952bff762c705cedefa12055c0aec17a06f595bcc002cc912"}, + {file = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl", hash = "sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c"}, +] [package.dependencies] ujson = ">=3.0.0" @@ -664,11 +1280,15 @@ test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] [[package]] name = "python-lsp-server" -version = "1.8.2" +version = "1.11.0" description = "Python Language Server for the Language Server Protocol" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "python-lsp-server-1.11.0.tar.gz", hash = "sha256:89edd6fb3f7852e4bf5a3d1d95ea41484d1a28fa94b6e3cbff12b9db123b8e86"}, + {file = "python_lsp_server-1.11.0-py3-none-any.whl", hash = "sha256:278cb41ea69ca9f84ec99d4edc96ff5f2f9e795d240771dc46dc1653f56ddfe3"}, +] [package.dependencies] docstring-to-markdown = "*" @@ -679,26 +1299,30 @@ python-lsp-jsonrpc = ">=1.1.0,<2.0.0" ujson = ">=3.0.0" [package.extras] -all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=6.1.0,<7)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.11.0,<2.12.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.1.0,<3.2.0)", "pylint (>=2.5.0,<3)", "rope (>1.2.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] -autopep8 = ["autopep8 (>=1.6.0,<2.1.0)"] -flake8 = ["flake8 (>=6.1.0,<7)"] +all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=7,<8)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.11.0,<2.12.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.2.0,<3.3.0)", "pylint (>=3.1,<4)", "rope (>=1.11.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] +autopep8 = ["autopep8 (>=2.0.4,<2.1.0)"] +flake8 = ["flake8 (>=7,<8)"] mccabe = ["mccabe (>=0.7.0,<0.8.0)"] pycodestyle = ["pycodestyle (>=2.11.0,<2.12.0)"] pydocstyle = ["pydocstyle (>=6.3.0,<6.4.0)"] -pyflakes = ["pyflakes (>=3.1.0,<3.2.0)"] -pylint = ["pylint (>=2.5.0,<3)"] -rope = ["rope (>1.2.0)"] -test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=2.5.0,<3)", "pyqt5", "pytest", "pytest-cov"] +pyflakes = ["pyflakes (>=3.2.0,<3.3.0)"] +pylint = ["pylint (>=3.1,<4)"] +rope = ["rope (>=1.11.0)"] +test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=3.1,<4)", "pyqt5", "pytest", "pytest-cov"] websockets = ["websockets (>=10.3)"] yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] [[package]] name = "pyyaml" @@ -707,66 +1331,116 @@ description = "YAML parser and emitter for Python" category = "dev" optional = false python-versions = ">=3.6" - -[[package]] -name = "recommonmark" -version = "0.7.1" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "smmap" -version = "5.0.1" -description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "soupsieve" @@ -775,6 +1449,10 @@ description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] [[package]] name = "sphinx" @@ -783,6 +1461,10 @@ description = "Python documentation generator" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, + {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -815,6 +1497,10 @@ description = "A modern skeleton for Sphinx themes." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, + {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, +] [package.dependencies] sphinx = ">=4.0" @@ -824,15 +1510,19 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta [[package]] name = "sphinxcontrib-apidoc" -version = "0.3.0" +version = "0.5.0" description = "A Sphinx extension for running 'sphinx-apidoc' on each build" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-apidoc-0.5.0.tar.gz", hash = "sha256:65efcd92212a5f823715fb95ee098b458a6bb09a5ee617d9ed3dead97177cd55"}, + {file = "sphinxcontrib_apidoc-0.5.0-py3-none-any.whl", hash = "sha256:c671d644d6dc468be91b813dcddf74d87893bff74fe8f1b8b01b69408f0fb776"}, +] [package.dependencies] pbr = "*" -Sphinx = ">=1.6.0" +Sphinx = ">=5.0.0" [[package]] name = "sphinxcontrib-applehelp" @@ -841,6 +1531,10 @@ description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -853,6 +1547,10 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -865,6 +1563,10 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -877,6 +1579,10 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] test = ["flake8", "mypy", "pytest"] @@ -888,6 +1594,10 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] @@ -900,11 +1610,27 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomli" version = "2.0.1" @@ -912,863 +1638,179 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.5" description = "Style preserving TOML library" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, +] [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] [[package]] name = "ujson" -version = "5.8.0" +version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.6" +version = "20.26.3" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, +] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] -[[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, +] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.8" -content-hash = "a5460fc09f52a5cab5923b9ecb375b2c63e43ce859b0a518cb60b919b83583cc" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] -astroid = [ - {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, - {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, -] -babel = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, -] -binaryornot = [ - {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, - {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, -] -black = [ - {file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"}, - {file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"}, - {file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"}, - {file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"}, - {file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"}, - {file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"}, - {file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"}, - {file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"}, - {file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"}, - {file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"}, - {file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"}, - {file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"}, - {file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"}, - {file = "black-23.10.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:7670242e90dc129c539e9ca17665e39a146a761e681805c54fbd86015c7c84f7"}, - {file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"}, - {file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"}, - {file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"}, - {file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"}, -] -boolean-py = [ - {file = "boolean.py-4.0-py3-none-any.whl", hash = "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd"}, - {file = "boolean.py-4.0.tar.gz", hash = "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4"}, -] -bump2version = [ - {file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"}, - {file = "bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6"}, -] -certifi = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] -cfgv = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, -] -chardet = [ - {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, - {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, -] -charset-normalizer = [ - {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, - {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, -] -click = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -coverage = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, -] -dill = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, -] -distlib = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, -] -docstring-to-markdown = [ - {file = "docstring-to-markdown-0.13.tar.gz", hash = "sha256:3025c428638ececae920d6d26054546a20335af3504a145327e657e7ad7ce1ce"}, - {file = "docstring_to_markdown-0.13-py3-none-any.whl", hash = "sha256:aa487059d0883e70e54da25c7b230e918d9e4d40f23d6dfaa2b73e4225b2d7dd"}, -] -docutils = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] -filelock = [ - {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, - {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, -] -furo = [ - {file = "furo-2023.9.10-py3-none-any.whl", hash = "sha256:513092538537dc5c596691da06e3c370714ec99bc438680edc1debffb73e5bfc"}, - {file = "furo-2023.9.10.tar.gz", hash = "sha256:5707530a476d2a63b8cad83b4f961f3739a69f4b058bcf38a03a39fa537195b2"}, -] -gitdb = [ - {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, - {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, -] -gitpython = [ - {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, - {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, -] -identify = [ - {file = "identify-2.5.30-py2.py3-none-any.whl", hash = "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54"}, - {file = "identify-2.5.30.tar.gz", hash = "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] -iniconfig = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] -isort = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] -jedi = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] -license-expression = [ - {file = "license-expression-30.1.1.tar.gz", hash = "sha256:42375df653ad85e6f5b4b0385138b2dbea1f5d66360783d8625c3e4f97f11f0c"}, - {file = "license_expression-30.1.1-py3-none-any.whl", hash = "sha256:8d7e5e2de0d04fc104a4f952c440e8f08a5ba63480a0dad015b294770b7e58ec"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy = [ - {file = "mypy-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e5012e5cc2ac628177eaac0e83d622b2dd499e28253d4107a08ecc59ede3fc2c"}, - {file = "mypy-1.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8fbb68711905f8912e5af474ca8b78d077447d8f3918997fecbf26943ff3cbb"}, - {file = "mypy-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a1ad938fee7d2d96ca666c77b7c494c3c5bd88dff792220e1afbebb2925b5e"}, - {file = "mypy-1.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b96ae2c1279d1065413965c607712006205a9ac541895004a1e0d4f281f2ff9f"}, - {file = "mypy-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:40b1844d2e8b232ed92e50a4bd11c48d2daa351f9deee6c194b83bf03e418b0c"}, - {file = "mypy-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81af8adaa5e3099469e7623436881eff6b3b06db5ef75e6f5b6d4871263547e5"}, - {file = "mypy-1.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8c223fa57cb154c7eab5156856c231c3f5eace1e0bed9b32a24696b7ba3c3245"}, - {file = "mypy-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8032e00ce71c3ceb93eeba63963b864bf635a18f6c0c12da6c13c450eedb183"}, - {file = "mypy-1.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c46b51de523817a0045b150ed11b56f9fff55f12b9edd0f3ed35b15a2809de0"}, - {file = "mypy-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:19f905bcfd9e167159b3d63ecd8cb5e696151c3e59a1742e79bc3bcb540c42c7"}, - {file = "mypy-1.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:82e469518d3e9a321912955cc702d418773a2fd1e91c651280a1bda10622f02f"}, - {file = "mypy-1.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4473c22cc296425bbbce7e9429588e76e05bc7342da359d6520b6427bf76660"}, - {file = "mypy-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a0d7d24dfb26729e0a068639a6ce3500e31d6655df8557156c51c1cb874ce7"}, - {file = "mypy-1.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cfd13d47b29ed3bbaafaff7d8b21e90d827631afda134836962011acb5904b71"}, - {file = "mypy-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:eb4f18589d196a4cbe5290b435d135dee96567e07c2b2d43b5c4621b6501531a"}, - {file = "mypy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41697773aa0bf53ff917aa077e2cde7aa50254f28750f9b88884acea38a16169"}, - {file = "mypy-1.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7274b0c57737bd3476d2229c6389b2ec9eefeb090bbaf77777e9d6b1b5a9d143"}, - {file = "mypy-1.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbaf4662e498c8c2e352da5f5bca5ab29d378895fa2d980630656178bd607c46"}, - {file = "mypy-1.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bb8ccb4724f7d8601938571bf3f24da0da791fe2db7be3d9e79849cb64e0ae85"}, - {file = "mypy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:68351911e85145f582b5aa6cd9ad666c8958bcae897a1bfda8f4940472463c45"}, - {file = "mypy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:49ae115da099dcc0922a7a895c1eec82c1518109ea5c162ed50e3b3594c71208"}, - {file = "mypy-1.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b27958f8c76bed8edaa63da0739d76e4e9ad4ed325c814f9b3851425582a3cd"}, - {file = "mypy-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:925cd6a3b7b55dfba252b7c4561892311c5358c6b5a601847015a1ad4eb7d332"}, - {file = "mypy-1.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8f57e6b6927a49550da3d122f0cb983d400f843a8a82e65b3b380d3d7259468f"}, - {file = "mypy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a43ef1c8ddfdb9575691720b6352761f3f53d85f1b57d7745701041053deff30"}, - {file = "mypy-1.6.1-py3-none-any.whl", hash = "sha256:4cbe68ef919c28ea561165206a2dcb68591c50f3bcf777932323bc208d949cf1"}, - {file = "mypy-1.6.1.tar.gz", hash = "sha256:4d01c00d09a0be62a4ca3f933e315455bde83f37f892ba4b08ce92f3cf44bcc1"}, -] -mypy-extensions = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] -nodeenv = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] -packaging = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] -parso = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] -pathspec = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] -pbr = [ - {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, - {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, -] -platformdirs = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, -] -pluggy = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] -pre-commit = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, -] -pygments = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, -] -pylint = [ - {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, - {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, -] -pyls-isort = [ - {file = "pyls-isort-0.2.2.tar.gz", hash = "sha256:2192bd2203db00459f85eb329521feba58af63075d2dd10a051a4eccd000bba0"}, -] -pylsp-mypy = [ - {file = "pylsp-mypy-0.6.7.tar.gz", hash = "sha256:06ba6d09bdd6ec29025ccc952dd66a849361a224a9f04cebd69b9f45f7d4a064"}, - {file = "pylsp_mypy-0.6.7-py3-none-any.whl", hash = "sha256:7c50dc8bbfc45aee1efb9e7555d3bee7188c81a74098efd2e0e51ef574c8d277"}, -] -pytest = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, -] -pytest-cov = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, -] -python-debian = [ - {file = "python-debian-0.1.49.tar.gz", hash = "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c"}, - {file = "python_debian-0.1.49-py3-none-any.whl", hash = "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f"}, -] -python-lsp-black = [ - {file = "python-lsp-black-1.3.0.tar.gz", hash = "sha256:5aa257e9e7b7e5a2316ef2a9fbcd242e82e0f695bf1622e31c0bf5cd69e6113f"}, - {file = "python_lsp_black-1.3.0-py3-none-any.whl", hash = "sha256:5f583b4395d8d048885974095088ab81e36e501de369cc49a621a82473bb9070"}, -] -python-lsp-jsonrpc = [ - {file = "python-lsp-jsonrpc-1.1.2.tar.gz", hash = "sha256:4688e453eef55cd952bff762c705cedefa12055c0aec17a06f595bcc002cc912"}, - {file = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl", hash = "sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c"}, -] -python-lsp-server = [ - {file = "python-lsp-server-1.8.2.tar.gz", hash = "sha256:fd85e1c6ad95c1d276c82a33c2c85898f110afc3c7bfeaced79c0df095076fd1"}, - {file = "python_lsp_server-1.8.2-py3-none-any.whl", hash = "sha256:65cfb20c8945bdb7b6bf7577207004e05e2550dac867339ef2e3605a0eeca9ca"}, -] -pytz = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, -] -pyyaml = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] -recommonmark = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] -requests = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] -setuptools = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] -smmap = [ - {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, - {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -soupsieve = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] -sphinx = [ - {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, - {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, -] -sphinx-basic-ng = [ - {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, - {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, -] -sphinxcontrib-apidoc = [ - {file = "sphinxcontrib-apidoc-0.3.0.tar.gz", hash = "sha256:729bf592cf7b7dd57c4c05794f732dc026127275d785c2a5494521fdde773fb9"}, - {file = "sphinxcontrib_apidoc-0.3.0-py2.py3-none-any.whl", hash = "sha256:6671a46b2c6c5b0dca3d8a147849d159065e50443df79614f921b42fbd15cb09"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, -] -typing-extensions = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] -ujson = [ - {file = "ujson-5.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4511560d75b15ecb367eef561554959b9d49b6ec3b8d5634212f9fed74a6df1"}, - {file = "ujson-5.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9399eaa5d1931a0ead49dce3ffacbea63f3177978588b956036bfe53cdf6af75"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4e7bb7eba0e1963f8b768f9c458ecb193e5bf6977090182e2b4f4408f35ac76"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40931d7c08c4ce99adc4b409ddb1bbb01635a950e81239c2382cfe24251b127a"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d53039d39de65360e924b511c7ca1a67b0975c34c015dd468fca492b11caa8f7"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bdf04c6af3852161be9613e458a1fb67327910391de8ffedb8332e60800147a2"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a70f776bda2e5072a086c02792c7863ba5833d565189e09fabbd04c8b4c3abba"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f26629ac531d712f93192c233a74888bc8b8212558bd7d04c349125f10199fcf"}, - {file = "ujson-5.8.0-cp310-cp310-win32.whl", hash = "sha256:7ecc33b107ae88405aebdb8d82c13d6944be2331ebb04399134c03171509371a"}, - {file = "ujson-5.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:3b27a8da7a080add559a3b73ec9ebd52e82cc4419f7c6fb7266e62439a055ed0"}, - {file = "ujson-5.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:193349a998cd821483a25f5df30b44e8f495423840ee11b3b28df092ddfd0f7f"}, - {file = "ujson-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ddeabbc78b2aed531f167d1e70387b151900bc856d61e9325fcdfefb2a51ad8"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ce24909a9c25062e60653073dd6d5e6ec9d6ad7ed6e0069450d5b673c854405"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a2a3c7620ebe43641e926a1062bc04e92dbe90d3501687957d71b4bdddaec4"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b852bdf920fe9f84e2a2c210cc45f1b64f763b4f7d01468b33f7791698e455e"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:20768961a6a706170497129960762ded9c89fb1c10db2989c56956b162e2a8a3"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0147d41e9fb5cd174207c4a2895c5e24813204499fd0839951d4c8784a23bf5"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3673053b036fd161ae7a5a33358ccae6793ee89fd499000204676baafd7b3aa"}, - {file = "ujson-5.8.0-cp311-cp311-win32.whl", hash = "sha256:a89cf3cd8bf33a37600431b7024a7ccf499db25f9f0b332947fbc79043aad879"}, - {file = "ujson-5.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3659deec9ab9eb19e8646932bfe6fe22730757c4addbe9d7d5544e879dc1b721"}, - {file = "ujson-5.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:102bf31c56f59538cccdfec45649780ae00657e86247c07edac434cb14d5388c"}, - {file = "ujson-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:299a312c3e85edee1178cb6453645217ba23b4e3186412677fa48e9a7f986de6"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e385a7679b9088d7bc43a64811a7713cc7c33d032d020f757c54e7d41931ae"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad24ec130855d4430a682c7a60ca0bc158f8253ec81feed4073801f6b6cb681b"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16fde596d5e45bdf0d7de615346a102510ac8c405098e5595625015b0d4b5296"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6d230d870d1ce03df915e694dcfa3f4e8714369cce2346686dbe0bc8e3f135e7"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9571de0c53db5cbc265945e08f093f093af2c5a11e14772c72d8e37fceeedd08"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7cba16b26efe774c096a5e822e4f27097b7c81ed6fb5264a2b3f5fd8784bab30"}, - {file = "ujson-5.8.0-cp312-cp312-win32.whl", hash = "sha256:48c7d373ff22366eecfa36a52b9b55b0ee5bd44c2b50e16084aa88b9de038916"}, - {file = "ujson-5.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ac97b1e182d81cf395ded620528c59f4177eee024b4b39a50cdd7b720fdeec6"}, - {file = "ujson-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2a64cc32bb4a436e5813b83f5aab0889927e5ea1788bf99b930fad853c5625cb"}, - {file = "ujson-5.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e54578fa8838ddc722539a752adfce9372474114f8c127bb316db5392d942f8b"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9721cd112b5e4687cb4ade12a7b8af8b048d4991227ae8066d9c4b3a6642a582"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9707e5aacf63fb919f6237d6490c4e0244c7f8d3dc2a0f84d7dec5db7cb54c"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0be81bae295f65a6896b0c9030b55a106fb2dec69ef877253a87bc7c9c5308f7"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae7f4725c344bf437e9b881019c558416fe84ad9c6b67426416c131ad577df67"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9ab282d67ef3097105552bf151438b551cc4bedb3f24d80fada830f2e132aeb9"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94c7bd9880fa33fcf7f6d7f4cc032e2371adee3c5dba2922b918987141d1bf07"}, - {file = "ujson-5.8.0-cp38-cp38-win32.whl", hash = "sha256:bf5737dbcfe0fa0ac8fa599eceafae86b376492c8f1e4b84e3adf765f03fb564"}, - {file = "ujson-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:11da6bed916f9bfacf13f4fc6a9594abd62b2bb115acfb17a77b0f03bee4cfd5"}, - {file = "ujson-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:69b3104a2603bab510497ceabc186ba40fef38ec731c0ccaa662e01ff94a985c"}, - {file = "ujson-5.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9249fdefeb021e00b46025e77feed89cd91ffe9b3a49415239103fc1d5d9c29a"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2873d196725a8193f56dde527b322c4bc79ed97cd60f1d087826ac3290cf9207"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4dafa9010c366589f55afb0fd67084acd8added1a51251008f9ff2c3e44042"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a42baa647a50fa8bed53d4e242be61023bd37b93577f27f90ffe521ac9dc7a3"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f3554eaadffe416c6f543af442066afa6549edbc34fe6a7719818c3e72ebfe95"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fb87decf38cc82bcdea1d7511e73629e651bdec3a43ab40985167ab8449b769c"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:407d60eb942c318482bbfb1e66be093308bb11617d41c613e33b4ce5be789adc"}, - {file = "ujson-5.8.0-cp39-cp39-win32.whl", hash = "sha256:0fe1b7edaf560ca6ab023f81cbeaf9946a240876a993b8c5a21a1c539171d903"}, - {file = "ujson-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f9b63530a5392eb687baff3989d0fb5f45194ae5b1ca8276282fb647f8dcdb3"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:efeddf950fb15a832376c0c01d8d7713479fbeceaed1eaecb2665aa62c305aec"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d8283ac5d03e65f488530c43d6610134309085b71db4f675e9cf5dff96a8282"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0142f6f10f57598655340a3b2c70ed4646cbe674191da195eb0985a9813b83"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d459aca895eb17eb463b00441986b021b9312c6c8cc1d06880925c7f51009c"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d524a8c15cfc863705991d70bbec998456a42c405c291d0f84a74ad7f35c5109"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d6f84a7a175c75beecde53a624881ff618e9433045a69fcfb5e154b73cdaa377"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b748797131ac7b29826d1524db1cc366d2722ab7afacc2ce1287cdafccddbf1f"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e72ba76313d48a1a3a42e7dc9d1db32ea93fac782ad8dde6f8b13e35c229130"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f504117a39cb98abba4153bf0b46b4954cc5d62f6351a14660201500ba31fe7f"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8c91b6f4bf23f274af9002b128d133b735141e867109487d17e344d38b87d94"}, - {file = "ujson-5.8.0.tar.gz", hash = "sha256:78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425"}, -] -urllib3 = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, -] -virtualenv = [ - {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, - {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, -] -wrapt = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, -] -zipp = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] +content-hash = "3f000ef7f191dd1e5648641ddfef4e469429e33e583299bbcac630bfd59ac10b" diff --git a/pyproject.toml b/pyproject.toml index 5ac2c964d..02c3df14b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ [tool.poetry] name = "reuse" -version = "3.0.2" +version = "4.0.3" description = "reuse is a tool for compliance with the REUSE recommendations." authors = [ "Free Software Foundation Europe ", @@ -30,7 +30,9 @@ include = [ { path = "AUTHORS.rst", format = "sdist" }, { path = "README.md", format = "sdist" }, { path = "CHANGELOG.md", format = "sdist" }, + { path = "CONTRIBUTING.md", format = "sdist" }, { path = ".reuse", format = "sdist" }, + { path = "REUSE.toml", format = "sdist" }, { path = "LICENSES", format = "sdist" }, { path = "docs", format = "sdist" }, ] @@ -51,30 +53,34 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.8" -Jinja2 = "^3.0.0" -binaryornot = "^0.4.4" +Jinja2 = ">=3.0.0" +binaryornot = ">=0.4.4" "boolean.py" = ">=3.8" license-expression = ">=1.0" -python-debian = "^0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" +python-debian = ">=0.1.34,!=0.1.45,!=0.1.46,!=0.1.47" +tomlkit = ">=0.8" +attrs = ">=21.3" [tool.poetry.group.test.dependencies] pytest = ">=6.0.0" pytest-cov = ">=2.10.0" +freezegun = ">=1.0.0" [tool.poetry.group.docs.dependencies] Sphinx = ">=4.0.0" -recommonmark = "^0.7.1" -sphinxcontrib-apidoc = "^0.3.0" -furo = "^2023.3.27" +myst-parser = ">=2.0.0" +sphinxcontrib-apidoc = ">=0.3.0" +furo = ">=2023.3.27" [tool.poetry.group.dev.dependencies] black = ">=20" -isort = "^5.6.0" -pre-commit = "^2.9.0" -bump2version = "^1.0.0" -pylint = "^2.12.2" -mypy = "^1.0" -GitPython = "^3.0" +isort = ">=5.6.0" +pre-commit = ">=2.9.0" +bumpver = ">=2023.1129" +pylint = ">=2.12.2" +mypy = ">=1.0" +GitPython = ">=3.0" +protokolo = { version = ">=2.1.0", python = "^3.11" } [tool.poetry.group.lsp] optional = true @@ -96,6 +102,32 @@ script = "_build.py" requires = ["poetry-core>=1.1.0"] build-backend = "poetry.core.masonry.api" +[bumpver] +current_version = "v4.0.3" +version_pattern = "vMAJOR.MINOR.PATCH[PYTAGNUM]" +commit_message = "Bump version: {old_version} → {new_version}" +tag_message = "{new_version}" +tag_scope = "default" +pre_commit_hook = "" +post_commit_hook = "" +commit = true +tag = false +push = false + +[bumpver.file_patterns] +"pyproject.toml" = [ + '^version = "{pep440_version}"$', + '^current_version = "{version}"$', +] +"src/reuse/__init__.py" = [ + '__version__ = "{pep440_version}"$', +] + +[tool.protokolo] +changelog = "CHANGELOG.md" +markup = "markdown" +directory = "changelog.d" + [tool.black] line-length = 80 diff --git a/src/reuse/__init__.py b/src/reuse/__init__.py index 1aad2155e..514c95ded 100644 --- a/src/reuse/__init__.py +++ b/src/reuse/__init__.py @@ -21,7 +21,7 @@ import os import re from dataclasses import dataclass, field -from enum import Enum, auto +from enum import Enum from importlib.metadata import PackageNotFoundError, version from typing import Any, Dict, NamedTuple, Optional, Set, Type @@ -31,12 +31,12 @@ __version__ = version("reuse") except PackageNotFoundError: # package is not installed - __version__ = "3.0.2" + __version__ = "4.0.3" __author__ = "Carmen Bianca Bakker" __email__ = "carmenbianca@fsfe.org" __license__ = "Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND GPL-3.0-or-later" -__REUSE_version__ = "3.0" +__REUSE_version__ = "3.2" _LOGGER = logging.getLogger(__name__) @@ -64,8 +64,8 @@ ] _IGNORE_FILE_PATTERNS = [ - re.compile(r"^LICENSE"), - re.compile(r"^COPYING"), + re.compile(r"^LICENSE(\..*)?$"), + re.compile(r"^COPYING(\..*)?$"), # ".git" as file happens in submodules re.compile(r"^\.git$"), re.compile(r"^\.gitkeep$"), @@ -98,6 +98,8 @@ class SourceType(Enum): FILE_HEADER = "file-header" #: A .reuse/dep5 file containing license information. DEP5 = "dep5" + #: A REUSE.toml file containing license information. + REUSE_TOML = "reuse-toml" # TODO: In Python 3.10+, add kw_only=True @@ -156,6 +158,10 @@ def contains_copyright_or_licensing(self) -> bool: """Either *spdx_expressions* or *copyright_lines* is non-empty.""" return bool(self.spdx_expressions or self.copyright_lines) + def contains_copyright_xor_licensing(self) -> bool: + """One of *spdx_expressions* or *copyright_lines* is non-empty.""" + return bool(self.spdx_expressions) ^ bool(self.copyright_lines) + def contains_info(self) -> bool: """Any field except *path*, *source_path* and *source_type* is non-empty. diff --git a/src/reuse/_annotate.py b/src/reuse/_annotate.py index 4d282ce7b..c45918554 100644 --- a/src/reuse/_annotate.py +++ b/src/reuse/_annotate.py @@ -1,14 +1,15 @@ # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: 2019 Stefan Bakker # SPDX-FileCopyrightText: 2019 Kirill Elagin +# SPDX-FileCopyrightText: 2019 Stefan Bakker # SPDX-FileCopyrightText: 2020 Dmitry Bogatov -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# SPDX-FileCopyrightText: 2021 Alvar Penning # SPDX-FileCopyrightText: 2021 Alliander N.V. +# SPDX-FileCopyrightText: 2021 Alvar Penning # SPDX-FileCopyrightText: 2021 Robin Vobruba +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Yaman Qalieh -# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -18,7 +19,7 @@ import logging import os import sys -from argparse import ArgumentParser, Namespace +from argparse import SUPPRESS, ArgumentParser, Namespace from gettext import gettext as _ from pathlib import Path from typing import IO, Iterable, Optional, Set, Tuple, Type, cast @@ -29,7 +30,7 @@ from . import ReuseInfo from ._util import ( - _COPYRIGHT_STYLES, + _COPYRIGHT_PREFIXES, PathType, StrPath, _determine_license_path, @@ -304,13 +305,13 @@ def get_reuse_info(args: Namespace, year: Optional[str]) -> ReuseInfo: --contributor. """ expressions = set(args.license) if args.license is not None else set() - copyright_style = ( - args.copyright_style if args.copyright_style is not None else "spdx" + copyright_prefix = ( + args.copyright_prefix if args.copyright_prefix is not None else "spdx" ) copyright_lines = ( { make_copyright_line( - item, year=year, copyright_style=copyright_style + item, year=year, copyright_prefix=copyright_prefix ) for item in args.copyright } @@ -409,11 +410,17 @@ def add_arguments(parser: ArgumentParser) -> None: choices=list(NAME_STYLE_MAP), help=_("comment style to use, optional"), ) + parser.add_argument( + "--copyright-prefix", + action="store", + choices=list(_COPYRIGHT_PREFIXES.keys()), + help=_("copyright prefix to use, optional"), + ) parser.add_argument( "--copyright-style", action="store", - choices=list(_COPYRIGHT_STYLES.keys()), - help=_("copyright style to use, optional"), + dest="copyright_prefix", + help=SUPPRESS, ) parser.add_argument( "--template", @@ -478,6 +485,12 @@ def add_arguments(parser: ArgumentParser) -> None: action="store_true", help=_("skip files with unrecognised comment styles"), ) + style_mutex_group.add_argument( + "--skip-unrecognized", + dest="skip_unrecognised", + action="store_true", + help=SUPPRESS, + ) parser.add_argument( "--skip-existing", action="store_true", diff --git a/src/reuse/_main.py b/src/reuse/_main.py index 1faa3c042..fec1f7318 100644 --- a/src/reuse/_main.py +++ b/src/reuse/_main.py @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -8,27 +9,27 @@ import argparse import logging +import os import sys import warnings from gettext import gettext as _ from pathlib import Path from typing import IO, Callable, List, Optional, Type, cast -from debian.copyright import Error as DebianError - from . import ( __REUSE_version__, __version__, _annotate, + convert_dep5, download, - init, lint, spdx, supported_licenses, ) from ._format import INDENT, fill_all, fill_paragraph from ._util import PathType, setup_logging -from .project import Project +from .global_licensing import GlobalLicensingParseError +from .project import GlobalLicensingConflict, GlobalLicensingFound, Project from .vcs import find_root _LOGGER = logging.getLogger(__name__) @@ -125,32 +126,8 @@ def parser() -> argparse.ArgumentParser: " given files.\n" "\n" "By using --contributor, you can specify people or entity that" - " contributed but are not copyright holder of the given files." - "\n" - "The first comment is replaced with a new header containing" - " the new copyright and licensing information and its former" - " copyright and licensing. If you want to keep the first" - " comment intact, use --no-replace.\n" - "\n" - "The comment style should be auto-detected for your files. If" - " a comment style could not be detected and --skip-unrecognised" - " is not specified, the process aborts. Use --style to specify" - " or override the comment style to use.\n" - "\n" - "A single-line comment style is used when it is available. If" - " no single-line comment style is available, a multi-line" - " comment style is used. You can force a certain comment style" - " using --single-line or --multi-line.\n" - "\n" - "You can change the template of the header comment by using" - " --template. Place a Jinja2 template in" - " .reuse/templates/mytemplate.jinja2. You can use the template" - " by specifying" - " '--template mytemplate'. Read the online documentation on" - " how to use this feature.\n" - "\n" - "If a binary file is detected, or if --force-dot-license is" - " specified, the header is placed in a .license file." + " contributed but are not copyright holder of the given" + " files." ) ), ) @@ -162,33 +139,10 @@ def parser() -> argparse.ArgumentParser: download.run, help=_("download a license and place it in the LICENSES/ directory"), description=fill_all( - _( - "Download a license and place it in the LICENSES/ directory.\n" - "\n" - "The LICENSES/ directory is automatically found in the" - " following order:\n" - "\n" - "- The LICENSES/ directory in the root of the VCS" - " repository.\n" - "\n" - "- The current directory if its name is LICENSES.\n" - "\n" - "- The LICENSES/ directory in the current directory.\n" - "\n" - "If the LICENSES/ directory cannot be found, one is simply" - " created." - ) + _("Download a license and place it in the LICENSES/ directory.") ), ) - add_command( - subparsers, - "init", - init.add_arguments, - init.run, - help=_("initialize REUSE project"), - ) - add_command( subparsers, "lint", @@ -236,6 +190,14 @@ def parser() -> argparse.ArgumentParser: aliases=["supported-licences"], ) + add_command( + subparsers, + "convert-dep5", + convert_dep5.add_arguments, + convert_dep5.run, + help=_("convert .reuse/dep5 to REUSE.toml"), + ) + return parser @@ -281,6 +243,11 @@ def main(args: Optional[List[str]] = None, out: IO[str] = sys.stdout) -> int: out.write(f"reuse {__version__}\n") return 0 + # Very stupid workaround to not print a DEP5 deprecation warning in the + # middle of conversion to REUSE.toml. + if args and args[0] == "convert-dep5": + os.environ["_SUPPRESS_DEP5_WARNING"] = "1" + root = parsed_args.root if root is None: root = find_root() @@ -291,18 +258,22 @@ def main(args: Optional[List[str]] = None, out: IO[str] = sys.stdout) -> int: # FileNotFoundError and NotADirectoryError don't need to be caught because # argparse already made sure of these things. except UnicodeDecodeError: + found = cast(GlobalLicensingFound, Project.find_global_licensing(root)) main_parser.error( - _("'{dep5}' could not be decoded as UTF-8.").format( - dep5=root / ".reuse/dep5" - ) + _("'{path}' could not be decoded as UTF-8.").format(path=found.path) ) - except DebianError as error: + except GlobalLicensingParseError as error: + found = cast(GlobalLicensingFound, Project.find_global_licensing(root)) main_parser.error( _( - "'{dep5}' could not be parsed. We received the following error" + "'{path}' could not be parsed. We received the following error" " message: {message}" - ).format(dep5=root / ".reuse/dep5", message=str(error)) + ).format(path=found.path, message=str(error)) ) + except GlobalLicensingConflict as error: + main_parser.error(str(error)) + except OSError as error: + main_parser.error(str(error)) project.include_submodules = parsed_args.include_submodules project.include_meson_subprojects = parsed_args.include_meson_subprojects diff --git a/src/reuse/_util.py b/src/reuse/_util.py index 355c2692d..66c2c8fd9 100644 --- a/src/reuse/_util.py +++ b/src/reuse/_util.py @@ -6,6 +6,7 @@ # SPDX-FileCopyrightText: 2022 Pietro Albini # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Johannes Zarl-Zierl +# SPDX-FileCopyrightText: 2024 Rivos Inc. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -24,9 +25,10 @@ from difflib import SequenceMatcher from gettext import gettext as _ from hashlib import sha1 +from inspect import cleandoc from itertools import chain from os import PathLike -from pathlib import Path, PurePath +from pathlib import Path from typing import ( IO, Any, @@ -42,8 +44,6 @@ ) from boolean.boolean import Expression, ParseError -from debian.copyright import Copyright -from debian.copyright import Error as DebianError from license_expression import ExpressionError, Licensing from . import ReuseInfo, SourceType @@ -129,7 +129,7 @@ r"(?P.*?))" + _END_PATTERN ), ] -_COPYRIGHT_STYLES = { +_COPYRIGHT_PREFIXES = { "spdx": "SPDX-FileCopyrightText:", "spdx-c": "SPDX-FileCopyrightText: (C)", "spdx-symbol": "SPDX-FileCopyrightText: ©", @@ -188,7 +188,7 @@ def execute_command( ) -def find_licenses_directory(root: StrPath) -> Path: +def find_licenses_directory(root: Optional[StrPath] = None) -> Path: """Find the licenses directory from CWD or *root*. In the following order: - LICENSES/ in *root*. @@ -245,59 +245,15 @@ def _determine_license_suffix_path(path: StrPath) -> Path: return Path(f"{path}.license") -def _parse_dep5(path: StrPath) -> Copyright: - """Parse the dep5 file and create a dep5 Copyright object. - - Raises: - FileNotFoundError: file doesn't exist. - DebianError: file could not be parsed. - UnicodeDecodeError: could not decode file as UTF-8. - """ - path = Path(path) - try: - with path.open(encoding="utf-8") as fp: - return Copyright(fp) - except FileNotFoundError: - _LOGGER.debug(_("no '{}' file, or could not read it").format(path)) - raise - # TODO: Remove ValueError once - # - # is closed - except (DebianError, ValueError) as error: - if error.__class__ == ValueError: - raise DebianError(str(error)) from error - raise - - -def _copyright_from_dep5(path: StrPath, dep5_copyright: Copyright) -> ReuseInfo: - """Find the reuse information of *path* in the dep5 Copyright object.""" - path = PurePath(path).as_posix() - result = dep5_copyright.find_files_paragraph(path) - - if result is None: - return ReuseInfo() - - return ReuseInfo( - spdx_expressions=set( - map(_LICENSING.parse, [result.license.synopsis]) # type: ignore - ), - copyright_lines=set( - map(str.strip, result.copyright.splitlines()) # type: ignore - ), - path=path, - source_type=SourceType.DEP5, - source_path=".reuse/dep5", - ) - - -def _parse_copyright_year(year: str) -> list: +def _parse_copyright_year(year: Optional[str]) -> List[str]: """Parse copyright years and return list.""" + ret: List[str] = [] if not year: - ret = [] - elif re.match(r"\d{4}$", year): - ret = [int(year)] + return ret + if re.match(r"\d{4}$", year): + ret = [year] elif re.match(r"\d{4} ?- ?\d{4}$", year): - ret = [int(year[:4]), int(year[-4:])] + ret = [year[:4], year[-4:]] return ret @@ -363,16 +319,16 @@ def merge_copyright_lines(copyright_lines: Set[str]) -> Set[str]: item for item in copyright_in if item["statement"] == statement ] - # Get the style of the most common prefix - prefix = str( + # Get the most common prefix. + most_common = str( Counter([item["prefix"] for item in copyright_list]).most_common(1)[ 0 ][0] ) - style = "spdx" - for key, value in _COPYRIGHT_STYLES.items(): - if prefix == value: - style = key + prefix = "spdx" + for key, value in _COPYRIGHT_PREFIXES.items(): + if most_common == value: + prefix = key break # get year range if any @@ -387,7 +343,7 @@ def merge_copyright_lines(copyright_lines: Set[str]) -> Set[str]: else: year = f"{min(years)} - {max(years)}" - copyright_out.add(make_copyright_line(statement, year, style)) + copyright_out.add(make_copyright_line(statement, year, prefix)) return copyright_out @@ -429,6 +385,59 @@ def extract_reuse_info(text: str) -> ReuseInfo: ) +def reuse_info_of_file( + path: StrPath, original_path: StrPath, root: StrPath +) -> ReuseInfo: + """Open *path* and return its :class:`ReuseInfo`. + + Normally only the first few :const:`_HEADER_BYTES` are read. But if a + snippet was detected, the entire file is read. + """ + path = Path(path) + with path.open("rb") as fp: + try: + read_limit: Optional[int] = _HEADER_BYTES + # Completely read the file once + # to search for possible snippets + if _contains_snippet(fp): + _LOGGER.debug(f"'{path}' seems to contain an SPDX Snippet") + read_limit = None + # Reset read position + fp.seek(0) + # Scan the file for REUSE info, possibly limiting the read + # length + file_result = extract_reuse_info( + decoded_text_from_binary(fp, size=read_limit) + ) + if file_result.contains_copyright_or_licensing(): + source_type = SourceType.FILE_HEADER + if path.suffix == ".license": + source_type = SourceType.DOT_LICENSE + return file_result.copy( + path=relative_from_root(original_path, root).as_posix(), + source_path=relative_from_root(path, root).as_posix(), + source_type=source_type, + ) + + except (ExpressionError, ParseError): + _LOGGER.error( + _( + "'{path}' holds an SPDX expression that cannot be" + " parsed, skipping the file" + ).format(path=path) + ) + return ReuseInfo() + + +def relative_from_root(path: StrPath, root: StrPath) -> Path: + """A helper function to get *path* relative to *root*.""" + path = Path(path) + try: + return path.relative_to(root) + except ValueError: + return Path(os.path.relpath(path, start=root)) + + def find_spdx_tag(text: str, pattern: re.Pattern) -> Iterator[str]: """Extract all the values in *text* matching *pattern*'s regex, taking care of stripping extraneous whitespace of formatting. @@ -485,7 +494,7 @@ def contains_reuse_info(text: str) -> bool: def make_copyright_line( - statement: str, year: Optional[str] = None, copyright_style: str = "spdx" + statement: str, year: Optional[str] = None, copyright_prefix: str = "spdx" ) -> str: """Given a statement, prefix it with ``SPDX-FileCopyrightText:`` if it is not already prefixed with some manner of copyright tag. @@ -493,10 +502,11 @@ def make_copyright_line( if "\n" in statement: raise RuntimeError(f"Unexpected newline in '{statement}'") - copyright_prefix = _COPYRIGHT_STYLES.get(copyright_style) - if copyright_prefix is None: + prefix = _COPYRIGHT_PREFIXES.get(copyright_prefix) + if prefix is None: + # TODO: Maybe translate this. Also maybe reduce DRY here. raise RuntimeError( - "Unexpected copyright style: Need 'spdx', 'spdx-c', " + "Unexpected copyright prefix: Need 'spdx', 'spdx-c', " "'spdx-symbol', 'string', 'string-c', " "'string-symbol', or 'symbol'" ) @@ -506,8 +516,8 @@ def make_copyright_line( if match is not None: return statement if year is not None: - return f"{copyright_prefix} {year} {statement}" - return f"{copyright_prefix} {statement}" + return f"{prefix} {year} {statement}" + return f"{prefix} {statement}" def _checksum(path: StrPath) -> str: @@ -643,4 +653,9 @@ def detect_line_endings(text: str) -> str: return os.linesep +def cleandoc_nl(text: str) -> str: + """Like :func:`inspect.cleandoc`, but with a newline at the end.""" + return cleandoc(text) + "\n" + + # REUSE-IgnoreEnd diff --git a/src/reuse/comment.py b/src/reuse/comment.py index aa6b63f3e..7139feba1 100644 --- a/src/reuse/comment.py +++ b/src/reuse/comment.py @@ -1,21 +1,22 @@ # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Kirill Elagin # SPDX-FileCopyrightText: 2020 Dmitry Bogatov -# SPDX-FileCopyrightText: 2021-2022 Alliander N.V. # SPDX-FileCopyrightText: 2021 Alvar Penning -# SPDX-FileCopyrightText: 2021 Robin Vobruba # SPDX-FileCopyrightText: 2021 Matija Šuklje +# SPDX-FileCopyrightText: 2021 Robin Vobruba +# SPDX-FileCopyrightText: 2021-2022 Alliander N.V. +# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Nico Rikken -# SPDX-FileCopyrightText: 2022 Stefan Hynek -# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2022 Sebastian Crane -# SPDX-FileCopyrightText: 2023 Redradix S.L. +# SPDX-FileCopyrightText: 2022 Stefan Hynek +# SPDX-FileCopyrightText: 2023 Juelich Supercomputing Centre, Forschungszentrum Juelich GmbH # SPDX-FileCopyrightText: 2023 Kevin Meagher # SPDX-FileCopyrightText: 2023 Mathias Dannesbo -# SPDX-FileCopyrightText: 2023 Shun Sakai -# SPDX-FileCopyrightText: 2023 Juelich Supercomputing Centre, Forschungszentrum Juelich GmbH # SPDX-FileCopyrightText: 2023 Maxim Cournoyer +# SPDX-FileCopyrightText: 2023 Redradix S.L. +# SPDX-FileCopyrightText: 2023 Shun Sakai +# SPDX-FileCopyrightText: 2024 Rivos Inc. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -321,6 +322,7 @@ class BibTexCommentStyle(CommentStyle): SHORTHAND = "bibtex" MULTI_LINE = MultiLineSegments("@Comment{", "", "}") + SHEBANGS = ["% !BIB", "%!BIB"] class CCommentStyle(CommentStyle): @@ -328,6 +330,17 @@ class CCommentStyle(CommentStyle): SHORTHAND = "c" + MULTI_LINE = MultiLineSegments("/*", "*", "*/") + INDENT_BEFORE_MIDDLE = " " + INDENT_AFTER_MIDDLE = " " + INDENT_BEFORE_END = " " + + +class CppCommentStyle(CommentStyle): + """C++ comment style.""" + + SHORTHAND = "cpp" + SINGLE_LINE = "//" INDENT_AFTER_SINGLE = " " MULTI_LINE = MultiLineSegments("/*", "*", "*/") @@ -340,26 +353,15 @@ class CCommentStyle(CommentStyle): ] -class CSingleCommentStyle(CommentStyle): - """C single-only comment style.""" +class CppSingleCommentStyle(CommentStyle): + """C++ single-only comment style.""" - SHORTHAND = "csingle" + SHORTHAND = "cppsingle" SINGLE_LINE = "//" INDENT_AFTER_SINGLE = " " -class CssCommentStyle(CommentStyle): - """CSS comment style.""" - - SHORTHAND = "css" - - MULTI_LINE = MultiLineSegments("/*", "*", "*/") - INDENT_BEFORE_MIDDLE = " " - INDENT_AFTER_MIDDLE = " " - INDENT_BEFORE_END = " " - - class EmptyCommentStyle(CommentStyle): """Hacky comment style for files that have no comments.""" @@ -525,6 +527,7 @@ class TexCommentStyle(CommentStyle): SINGLE_LINE = "%" INDENT_AFTER_SINGLE = " " + SHEBANGS = ["% !TEX", "%!TEX"] class UncommentableCommentStyle(EmptyCommentStyle): @@ -533,6 +536,16 @@ class UncommentableCommentStyle(EmptyCommentStyle): """ +class UnixManCommentStyle(CommentStyle): + """UNIX manual page comment style.""" + + SHORTHAND = "man" + + # In case the below is difficult to read, the comment character is: .\" + SINGLE_LINE = r".\"" + INDENT_AFTER_SINGLE = " " + + class VelocityCommentStyle(CommentStyle): """Apache Velocity Template Language comment style.""" @@ -565,18 +578,19 @@ class XQueryCommentStyle(CommentStyle): #: A map of (common) file extensions against comment types. EXTENSION_COMMENT_STYLE_MAP = { ".adb": HaskellCommentStyle, - ".adoc": CCommentStyle, + ".adoc": CppCommentStyle, ".ads": HaskellCommentStyle, ".aes": UncommentableCommentStyle, ".ahk": SemicolonCommentStyle, ".ahkl": SemicolonCommentStyle, - ".aidl": CCommentStyle, + ".aidl": CppCommentStyle, ".applescript": AppleScriptCommentStyle, ".arb": UncommentableCommentStyle, ".asax": AspxCommentStyle, - ".asc": CCommentStyle, - ".asciidoc": CCommentStyle, + ".asc": CppCommentStyle, + ".asciidoc": CppCommentStyle, ".ashx": AspxCommentStyle, + ".asm": LispCommentStyle, # ASM assembler ".asmx": AspxCommentStyle, ".aspx": AspxCommentStyle, ".aux": TexCommentStyle, @@ -584,40 +598,47 @@ class XQueryCommentStyle(CommentStyle): ".axd": AspxCommentStyle, ".bash": PythonCommentStyle, ".bat": BatchFileCommentStyle, + ".bats": PythonCommentStyle, ".bb": PythonCommentStyle, ".bbappend": PythonCommentStyle, ".bbclass": PythonCommentStyle, ".bib": BibTexCommentStyle, ".bzl": PythonCommentStyle, ".c": CCommentStyle, - ".cc": CCommentStyle, - ".cjs": CCommentStyle, + ".cc": CppCommentStyle, + ".cjs": CppCommentStyle, ".cl": LispCommentStyle, ".clj": LispCommentStyle, ".cljc": LispCommentStyle, ".cljs": LispCommentStyle, + ".cls": TexCommentStyle, ".cmake": PythonCommentStyle, # TODO: Bracket comments not supported. - ".code-workspace": CCommentStyle, + ".code-workspace": CppCommentStyle, ".coffee": PythonCommentStyle, - ".cpp": CCommentStyle, - ".cs": CCommentStyle, + ".cpp": CppCommentStyle, + ".cs": CppCommentStyle, ".csl": HtmlCommentStyle, # Bibliography (XML based) - ".css": CssCommentStyle, + ".cson": PythonCommentStyle, + ".css": CCommentStyle, + ".csproj": HtmlCommentStyle, ".csv": UncommentableCommentStyle, - ".cxx": CCommentStyle, - ".d": CCommentStyle, - ".dart": CCommentStyle, - ".di": CCommentStyle, + ".cu": CppCommentStyle, + ".cuh": CppCommentStyle, + ".cxx": CppCommentStyle, + ".d": CppCommentStyle, + ".dart": CppCommentStyle, + ".di": CppCommentStyle, ".doc": UncommentableCommentStyle, ".docx": UncommentableCommentStyle, ".dotx": UncommentableCommentStyle, - ".dts": CCommentStyle, - ".dtsi": CCommentStyle, + ".dts": CppCommentStyle, + ".dtsi": CppCommentStyle, ".el": LispCommentStyle, ".erl": TexCommentStyle, ".ex": PythonCommentStyle, ".exs": PythonCommentStyle, ".f": FortranCommentStyle, + ".fsproj": HtmlCommentStyle, ".f03": ModernFortranCommentStyle, ".f08": ModernFortranCommentStyle, ".f90": ModernFortranCommentStyle, @@ -630,54 +651,62 @@ class XQueryCommentStyle(CommentStyle): ".for": FortranCommentStyle, ".ftn": FortranCommentStyle, ".fpp": FortranCommentStyle, - ".fs": CCommentStyle, + ".fs": CppCommentStyle, + ".fsx": CppCommentStyle, ".ftl": FtlCommentStyle, ".gemspec": PythonCommentStyle, - ".go": CCommentStyle, - ".gradle": CCommentStyle, + ".go": CppCommentStyle, + ".gradle": CppCommentStyle, ".graphql": PythonCommentStyle, - ".groovy": CCommentStyle, + ".graphqls": PythonCommentStyle, + ".gqls": PythonCommentStyle, + ".groovy": CppCommentStyle, ".h": CCommentStyle, - ".ha": CSingleCommentStyle, + ".ha": CppSingleCommentStyle, ".hbs": HandlebarsCommentStyle, ".hcl": PythonCommentStyle, - ".hh": CCommentStyle, - ".hpp": CCommentStyle, + ".hh": CppCommentStyle, + ".hjson": CppCommentStyle, + ".hpp": CppCommentStyle, ".hrl": TexCommentStyle, ".hs": HaskellCommentStyle, ".html": HtmlCommentStyle, - ".hx": CCommentStyle, - ".hxsl": CCommentStyle, + ".hx": CppCommentStyle, + ".hxsl": CppCommentStyle, ".ini": SemicolonCommentStyle, - ".ino": CCommentStyle, + ".ino": CppCommentStyle, ".ipynb": UncommentableCommentStyle, ".iuml": PlantUmlCommentStyle, - ".java": CCommentStyle, + ".java": CppCommentStyle, ".jinja": JinjaCommentStyle, ".jinja2": JinjaCommentStyle, ".jl": JuliaCommentStyle, ".jpg": UncommentableCommentStyle, ".jpeg": UncommentableCommentStyle, - ".js": CCommentStyle, + ".js": CppCommentStyle, ".json": UncommentableCommentStyle, + ".json5": CppCommentStyle, + ".jsonc": CppCommentStyle, ".jsp": AspxCommentStyle, - ".jsx": CCommentStyle, + ".jsx": CppCommentStyle, ".jy": PythonCommentStyle, ".ksh": PythonCommentStyle, - ".kt": CCommentStyle, - ".kts": CCommentStyle, + ".kt": CppCommentStyle, + ".kts": CppCommentStyle, ".l": LispCommentStyle, ".latex": TexCommentStyle, - ".ld": CCommentStyle, - ".less": CssCommentStyle, + ".ld": CppCommentStyle, + ".less": CCommentStyle, ".license": EmptyCommentStyle, ".lisp": LispCommentStyle, ".lsp": LispCommentStyle, ".lua": HaskellCommentStyle, + ".m": TexCommentStyle, ".m4": M4CommentStyle, + ".man": UnixManCommentStyle, ".markdown": HtmlCommentStyle, ".md": HtmlCommentStyle, - ".mjs": CCommentStyle, + ".mjs": CppCommentStyle, ".mk": PythonCommentStyle, ".ml": MlCommentStyle, ".mli": MlCommentStyle, @@ -699,10 +728,10 @@ class XQueryCommentStyle(CommentStyle): ".ott": UncommentableCommentStyle, ".pdf": UncommentableCommentStyle, ".pem": UncommentableCommentStyle, - ".php": CCommentStyle, - ".php3": CCommentStyle, - ".php4": CCommentStyle, - ".php5": CCommentStyle, + ".php": CppCommentStyle, + ".php3": CppCommentStyle, + ".php4": CppCommentStyle, + ".php5": CppCommentStyle, ".pl": PythonCommentStyle, ".plantuml": PlantUmlCommentStyle, ".png": UncommentableCommentStyle, @@ -713,7 +742,9 @@ class XQueryCommentStyle(CommentStyle): ".pptx": UncommentableCommentStyle, ".pri": PythonCommentStyle, ".pro": PythonCommentStyle, - ".proto": CCommentStyle, + ".props": HtmlCommentStyle, # MSBuild files + ".properties": PythonCommentStyle, + ".proto": CppCommentStyle, ".ps1": PythonCommentStyle, # TODO: Multiline comments ".psm1": PythonCommentStyle, # TODO: Multiline comments ".pu": PlantUmlCommentStyle, @@ -723,10 +754,10 @@ class XQueryCommentStyle(CommentStyle): ".pyi": PythonCommentStyle, ".pyw": PythonCommentStyle, ".pyx": PythonCommentStyle, - ".qbs": CCommentStyle, - ".qml": CCommentStyle, + ".qbs": CppCommentStyle, + ".qml": CppCommentStyle, ".qrc": HtmlCommentStyle, - ".qss": CssCommentStyle, + ".qss": CCommentStyle, ".R": PythonCommentStyle, ".rake": PythonCommentStyle, ".rb": PythonCommentStyle, @@ -734,32 +765,35 @@ class XQueryCommentStyle(CommentStyle): ".rbx": PythonCommentStyle, ".rkt": LispCommentStyle, ".Rmd": HtmlCommentStyle, - ".rs": CCommentStyle, + ".rs": CppCommentStyle, ".rss": HtmlCommentStyle, ".rst": ReStructedTextCommentStyle, - ".s": LispCommentStyle, - ".sass": CssCommentStyle, - ".sbt": CCommentStyle, - ".sc": CCommentStyle, # SuperCollider source file - ".scad": CCommentStyle, - ".scala": CCommentStyle, + ".s": PythonCommentStyle, # Assume GNU Assembler for x86 + ".sass": CCommentStyle, + ".sbt": CppCommentStyle, + ".sc": CppCommentStyle, # SuperCollider source file + ".scad": CppCommentStyle, + ".scala": CppCommentStyle, ".scm": LispCommentStyle, ".scpt": AppleScriptCommentStyle, ".scptd": AppleScriptCommentStyle, - ".scss": CssCommentStyle, + ".scss": CCommentStyle, # SuperCollider synth definition (binary) ".scsyndef": UncommentableCommentStyle, ".sh": PythonCommentStyle, ".sld": LispCommentStyle, # Scheme Library Definition (R7RS) + # Visual Studio solution file, officially uncommentable: + ".sln": UncommentableCommentStyle, ".sls": LispCommentStyle, # Scheme Library Source (R6RS) ".sml": MlCommentStyle, - ".soy": CCommentStyle, + ".soy": CppCommentStyle, ".sps": LispCommentStyle, # Scheme Program Source (R6RS) ".sql": HaskellCommentStyle, ".sty": TexCommentStyle, ".svg": UncommentableCommentStyle, ".svelte": HtmlCommentStyle, - ".swift": CCommentStyle, + ".swift": CppCommentStyle, + ".t": PythonCommentStyle, ".tcl": PythonCommentStyle, ".tex": TexCommentStyle, ".textile": HtmlCommentStyle, @@ -768,16 +802,18 @@ class XQueryCommentStyle(CommentStyle): ".thy": MlCommentStyle, ".toc": TexCommentStyle, ".toml": PythonCommentStyle, - ".ts": CCommentStyle, - ".tsx": CCommentStyle, + ".ts": CppCommentStyle, + ".tsx": CppCommentStyle, ".ttl": PythonCommentStyle, # Turtle/RDF - ".typ": CCommentStyle, # typst files + ".typ": CppCommentStyle, # typst files ".ui": HtmlCommentStyle, - ".v": CCommentStyle, # V-Lang source code - ".vala": CCommentStyle, + ".v": CppCommentStyle, # V-Lang source code + ".vala": CppCommentStyle, + ".vbproj": HtmlCommentStyle, + ".vhdl": HaskellCommentStyle, ".vim": VimCommentStyle, ".vm": VelocityCommentStyle, - ".vsh": CCommentStyle, # V-Lang script + ".vsh": CppCommentStyle, # V-Lang script ".vtl": VelocityCommentStyle, ".vue": HtmlCommentStyle, ".webp": UncommentableCommentStyle, @@ -794,7 +830,7 @@ class XQueryCommentStyle(CommentStyle): ".xsl": HtmlCommentStyle, ".yaml": PythonCommentStyle, ".yml": PythonCommentStyle, - ".zig": CSingleCommentStyle, + ".zig": CppSingleCommentStyle, ".zsh": PythonCommentStyle, } @@ -808,8 +844,10 @@ class XQueryCommentStyle(CommentStyle): ".bazelrc": PythonCommentStyle, ".browserslist": PythonCommentStyle, ".clang-format": PythonCommentStyle, + ".clang-tidy": PythonCommentStyle, ".coveragerc": PythonCommentStyle, ".dockerignore": PythonCommentStyle, + ".earthlyignore": PythonCommentStyle, ".editorconfig": PythonCommentStyle, ".empty": EmptyCommentStyle, ".eslintignore": PythonCommentStyle, @@ -817,32 +855,37 @@ class XQueryCommentStyle(CommentStyle): ".gitattributes": PythonCommentStyle, ".gitignore": PythonCommentStyle, ".gitmodules": PythonCommentStyle, + ".htaccess": PythonCommentStyle, ".mailmap": PythonCommentStyle, ".metadata": UncommentableCommentStyle, ".mdlrc": PythonCommentStyle, # Markdown-linter config ".npmignore": PythonCommentStyle, + ".npmrc": SemicolonCommentStyle, ".prettierrc": UncommentableCommentStyle, # could either be JSON or YAML ".prettierignore": PythonCommentStyle, ".pylintrc": PythonCommentStyle, ".Renviron": PythonCommentStyle, ".Rprofile": PythonCommentStyle, ".shellcheckrc": PythonCommentStyle, + ".taprc": PythonCommentStyle, ".vimrc": VimCommentStyle, + ".zshrc": PythonCommentStyle, ".yarnrc": PythonCommentStyle, "ansible.cfg": PythonCommentStyle, "archive.sctxar": UncommentableCommentStyle, # SuperCollider global archive + "Cargo.lock": UncommentableCommentStyle, "CMakeLists.txt": PythonCommentStyle, "CODEOWNERS": PythonCommentStyle, "configure.ac": M4CommentStyle, "Containerfile": PythonCommentStyle, "Dockerfile": PythonCommentStyle, "Doxyfile": PythonCommentStyle, + "Earthfile": PythonCommentStyle, "Gemfile": PythonCommentStyle, - "go.mod": CCommentStyle, + "go.mod": CppCommentStyle, "go.sum": UncommentableCommentStyle, - "gradle-wrapper.properties": PythonCommentStyle, "gradlew": PythonCommentStyle, - "Jenkinsfile": CCommentStyle, + "Jenkinsfile": CppCommentStyle, "Makefile.am": PythonCommentStyle, "Makefile": PythonCommentStyle, "MANIFEST.in": PythonCommentStyle, @@ -855,7 +898,6 @@ class XQueryCommentStyle(CommentStyle): "requirements.txt": PythonCommentStyle, "ROOT": MlCommentStyle, "setup.cfg": PythonCommentStyle, - "sonar-project.properties": PythonCommentStyle, "yarn.lock": UncommentableCommentStyle, } diff --git a/src/reuse/convert_dep5.py b/src/reuse/convert_dep5.py new file mode 100644 index 000000000..da6dca79f --- /dev/null +++ b/src/reuse/convert_dep5.py @@ -0,0 +1,126 @@ +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Logic to convert a .reuse/dep5 file to a REUSE.toml file.""" + +import re +import sys +from argparse import ArgumentParser, Namespace +from gettext import gettext as _ +from typing import IO, Any, Dict, Iterable, List, Optional, TypeVar, Union, cast + +import tomlkit +from debian.copyright import Copyright, FilesParagraph, Header + +from .global_licensing import REUSE_TOML_VERSION, ReuseDep5 +from .project import Project + +_SINGLE_ASTERISK_PATTERN = re.compile(r"(? Union[List[_T], _T]: + """Return the only item of the list if the length of the list is one, else + return the list. + """ + if len(sequence) == 1: + return sequence[0] + return sequence + + +def _header_from_dep5_header( + header: Header, +) -> Dict[str, Union[str, List[str]]]: + result: Dict[str, Union[str, List[str]]] = {} + if header.upstream_name: + result["SPDX-PackageName"] = str(header.upstream_name) + if header.upstream_contact: + result["SPDX-PackageSupplier"] = _collapse_list_if_one_item( + list(map(str, header.upstream_contact)) + ) + if header.source: + result["SPDX-PackageDownloadLocation"] = str(header.source) + if header.disclaimer: + result["SPDX-PackageComment"] = str(header.disclaimer) + return result + + +def _copyrights_from_paragraph( + paragraph: FilesParagraph, +) -> Union[str, List[str]]: + return _collapse_list_if_one_item( + [line.strip() for line in cast(str, paragraph.copyright).splitlines()] + ) + + +def _convert_asterisk(path: str) -> str: + """This solves a semantics difference. A singular asterisk is semantically + identical to a double asterisk in REUSE.toml. + """ + return _SINGLE_ASTERISK_PATTERN.sub("**", path) + + +def _paths_from_paragraph(paragraph: FilesParagraph) -> Union[str, List[str]]: + return _collapse_list_if_one_item( + [_convert_asterisk(path) for path in list(paragraph.files)] + ) + + +def _comment_from_paragraph(paragraph: FilesParagraph) -> Optional[str]: + return cast(Optional[str], paragraph.comment) + + +def _annotations_from_paragraphs( + paragraphs: Iterable[FilesParagraph], +) -> List[Dict[str, Union[str, List[str]]]]: + annotations = [] + for paragraph in paragraphs: + copyrights = _copyrights_from_paragraph(paragraph) + paths = _paths_from_paragraph(paragraph) + paragraph_result = { + "path": paths, + "precedence": "aggregate", + "SPDX-FileCopyrightText": copyrights, + "SPDX-License-Identifier": paragraph.license.to_str(), + } + comment = _comment_from_paragraph(paragraph) + if comment: + paragraph_result["SPDX-FileComment"] = comment + annotations.append(paragraph_result) + return annotations + + +def toml_from_dep5(dep5: Copyright) -> str: + """Given a Copyright object, return an equivalent REUSE.toml string.""" + header = _header_from_dep5_header(dep5.header) + annotations = _annotations_from_paragraphs(dep5.all_files_paragraphs()) + result: Dict[str, Any] = {"version": REUSE_TOML_VERSION} + result.update(header) + result["annotations"] = annotations + return tomlkit.dumps(result) + + +# pylint: disable=unused-argument +def add_arguments(parser: ArgumentParser) -> None: + """Add arguments to parser.""" + # Nothing to do. + + +# pylint: disable=unused-argument +def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: + """Convert .reuse/dep5 to REUSE.toml.""" + if not (project.root / ".reuse/dep5").exists(): + args.parser.error(_("no '.reuse/dep5' file")) + + text = toml_from_dep5( + cast(ReuseDep5, project.global_licensing).dep5_copyright + ) + (project.root / "REUSE.toml").write_text(text) + (project.root / ".reuse/dep5").unlink() + + return 0 diff --git a/src/reuse/download.py b/src/reuse/download.py index 50590d14a..29ce3f71b 100644 --- a/src/reuse/download.py +++ b/src/reuse/download.py @@ -14,7 +14,7 @@ from argparse import ArgumentParser, Namespace from gettext import gettext as _ from pathlib import Path -from typing import IO, Optional +from typing import IO, Optional, cast from urllib.error import URLError from urllib.parse import urljoin @@ -28,6 +28,7 @@ ) from .project import Project from .report import ProjectReport +from .vcs import VCSStrategyNone _LOGGER = logging.getLogger(__name__) @@ -59,7 +60,14 @@ def download_license(spdx_identifier: str) -> str: raise URLError("Status code was not 200") -def _path_to_license_file(spdx_identifier: str, root: StrPath) -> Path: +def _path_to_license_file(spdx_identifier: str, project: Project) -> Path: + root: Optional[Path] = project.root + # Hack + if cast(Path, root).name == "LICENSES" and isinstance( + project.vcs_strategy, VCSStrategyNone + ): + root = None + licenses_path = find_licenses_directory(root=root) return licenses_path / "".join((spdx_identifier, ".txt")) @@ -171,6 +179,7 @@ def _successfully_downloaded(destination: StrPath) -> None: ) out.write("\n") + licenses = args.license if args.all: # TODO: This is fairly inefficient, but gets the job done. report = ProjectReport.generate(project) @@ -184,15 +193,13 @@ def _successfully_downloaded(destination: StrPath) -> None: args.parser.error(_("the following arguments are required: license")) elif len(args.license) > 1 and args.file: args.parser.error(_("cannot use --output with more than one license")) - else: - licenses = args.license return_code = 0 for lic in licenses: if args.file: destination = args.file else: - destination = _path_to_license_file(lic, project.root) + destination = _path_to_license_file(lic, project) try: put_license_in_file( lic, destination=destination, source=args.source diff --git a/src/reuse/global_licensing.py b/src/reuse/global_licensing.py new file mode 100644 index 000000000..b66adc45a --- /dev/null +++ b/src/reuse/global_licensing.py @@ -0,0 +1,582 @@ +# SPDX-FileCopyrightText: 2023 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Code for parsing and validating REUSE.toml.""" + +# mypy: disable-error-code=attr-defined + +import contextlib +import logging +import re +from abc import ABC, abstractmethod +from collections import defaultdict +from enum import Enum +from gettext import gettext as _ +from pathlib import Path, PurePath +from typing import ( + Any, + Callable, + Collection, + Dict, + Generator, + List, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, + overload, +) + +import attrs +import tomlkit +from attr.validators import _InstanceOfValidator as _AttrInstanceOfValidator +from boolean.boolean import Expression, ParseError +from debian.copyright import Copyright +from debian.copyright import Error as DebianError +from license_expression import ExpressionError + +from . import ReuseInfo, SourceType +from ._util import _LICENSING, StrPath + +_LOGGER = logging.getLogger(__name__) + +_T = TypeVar("_T") + +#: Current version of REUSE.toml. +REUSE_TOML_VERSION = 1 + + +class PrecedenceType(Enum): + """An enum of behaviours surrounding order of precedence for entries in a + :class:`GlobalLicensing`. + """ + + #: Aggregate the results from the file with the results from the global + #: licensing file. + AGGREGATE = "aggregate" + #: Use the results that are closest to the covered file. This is typically + #: the file itself, or the global licensing file if no REUSE information + #: exists inside of the file. + CLOSEST = "closest" + #: Only use the results from the global licensing file. + OVERRIDE = "override" + + +class GlobalLicensingParseError(Exception): + """An exception representing any kind of error that occurs when trying to + parse a :class:`GlobalLicensing` file. + """ + + +class GlobalLicensingParseTypeError(TypeError, GlobalLicensingParseError): + """An exception representing a type error while trying to parse a + :class:`GlobalLicensing` file. + """ + + +class GlobalLicensingParseValueError(GlobalLicensingParseError, ValueError): + """An exception representing a value error while trying to parse a + :class:`GlobalLicensing` file. + """ + + +@attrs.define +class _CollectionOfValidator: + collection_type: Type[Collection] = attrs.field() + value_type: Type = attrs.field() + optional: bool = attrs.field(default=True) + + def __call__( + self, + instance: object, + attribute: attrs.Attribute, + value: Collection[_T], + ) -> None: + # This is a hack to display the TOML's key names instead of the Python + # attributes. + if hasattr(instance, "TOML_KEYS"): + attr_name = instance.TOML_KEYS[attribute.name] + else: + attr_name = attribute.name + + if not isinstance(value, self.collection_type): + raise GlobalLicensingParseTypeError( + _( + "{attr_name} must be a {type_name} (got {value} that is a" + " {value_class})." + ).format( + attr_name=repr(attr_name), + type_name=self.collection_type.__name__, + value=repr(value), + value_class=repr(value.__class__), + ) + ) + for item in value: + if not isinstance(item, self.value_type): + raise GlobalLicensingParseTypeError( + _( + "Item in {attr_name} collection must be a {type_name}" + " (got {item_value} that is a {item_class})." + ).format( + attr_name=repr(attr_name), + type_name=self.value_type.__name__, + item_value=repr(item), + item_class=repr(item.__class__), + ) + ) + if not self.optional and not value: + raise GlobalLicensingParseValueError( + _("{attr_name} must not be empty.").format( + attr_name=repr(attr_name) + ) + ) + + +def _validate_collection_of( + collection_type: Type[Collection], + value_type: Type[_T], + optional: bool = False, +) -> Callable[[Any, attrs.Attribute, Collection[_T]], Any]: + return _CollectionOfValidator( + collection_type, value_type, optional=optional + ) + + +class _InstanceOfValidator(_AttrInstanceOfValidator): + def __call__(self, inst: Any, attr: attrs.Attribute, value: _T) -> None: + try: + super().__call__(inst, attr, value) + except TypeError as error: + raise GlobalLicensingParseTypeError( + _( + "{name} must be a {type} (got {value} that is a" + " {value_type})." + ).format( + name=repr(error.args[1].name), + type=repr(error.args[2].__name__), + value=repr(error.args[3]), + value_type=repr(error.args[3].__class__), + ) + ) from error + + +def _instance_of( + type_: Type[_T], +) -> Callable[[Any, attrs.Attribute, _T], Any]: + return _InstanceOfValidator(type_) + + +def _str_to_global_precedence(value: Any) -> PrecedenceType: + try: + return PrecedenceType(value) + except ValueError as err: + raise GlobalLicensingParseValueError( + _( + "The value of 'precedence' must be one of {precedence_vals}" + " (got {received})" + ).format( + precedence_vals=tuple( + member.value for member in PrecedenceType + ), + received=repr(value), + ) + ) from err + + +@overload +def _str_to_set(value: str) -> Set[str]: ... + + +@overload +def _str_to_set(value: Union[None, _T, Collection[_T]]) -> Set[_T]: ... + + +def _str_to_set( + value: Union[str, None, _T, Collection[_T]] +) -> Union[Set[str], Set[_T]]: + if value is None: + return cast(Set[str], set()) + if isinstance(value, str): + return {value} + if hasattr(value, "__iter__"): + return set(value) + return {value} + + +def _str_to_set_of_expr(value: Any) -> Set[Expression]: + value = _str_to_set(value) + result = set() + for expression in value: + try: + result.add(_LICENSING.parse(expression)) + except (ExpressionError, ParseError) as error: + raise GlobalLicensingParseValueError( + _("Could not parse '{expression}'").format( + expression=expression + ) + ) from error + return result + + +@attrs.define +class GlobalLicensing(ABC): + """An abstract class that represents a configuration file that contains + licensing information that is pertinent to other files in the project. + """ + + source: str = attrs.field(validator=_instance_of(str)) + + @classmethod + @abstractmethod + def from_file(cls, path: StrPath) -> "GlobalLicensing": + """Parse the file and create a :class:`GlobalLicensing` object from its + contents. + + Raises: + FileNotFoundError: file doesn't exist. + UnicodeDecodeError: could not decode file as UTF-8. + OSError: some other error surrounding I/O. + GlobalLicensingParseError: file could not be parsed. + """ + + @abstractmethod + def reuse_info_of( + self, path: StrPath + ) -> Dict[PrecedenceType, List[ReuseInfo]]: + """Find the REUSE information of *path* defined in the configuration. + The path must be relative to the root of a + :class:`reuse.project.Project`. + + The key indicates the precedence type for the subsequent information. + """ + + +@attrs.define +class ReuseDep5(GlobalLicensing): + """A soft wrapper around :class:`Copyright`.""" + + dep5_copyright: Copyright + + @classmethod + def from_file(cls, path: StrPath) -> "ReuseDep5": + path = Path(path) + try: + with path.open(encoding="utf-8") as fp: + return cls(str(path), Copyright(fp)) + except UnicodeDecodeError: + raise + # TODO: Remove ValueError once + # + # is closed + except (DebianError, ValueError) as error: + raise GlobalLicensingParseError(str(error)) from error + + def reuse_info_of( + self, path: StrPath + ) -> Dict[PrecedenceType, List[ReuseInfo]]: + path = PurePath(path).as_posix() + result = self.dep5_copyright.find_files_paragraph(path) + + if result is None: + return {} + + return { + PrecedenceType.AGGREGATE: [ + ReuseInfo( + spdx_expressions=set( + map(_LICENSING.parse, [result.license.synopsis]) + ), + copyright_lines=set( + map(str.strip, result.copyright.splitlines()) + ), + path=path, + source_type=SourceType.DEP5, + # This is hardcoded. It must be a relative path from the + # project root. self.source is not (guaranteed) a relative + # path. + source_path=".reuse/dep5", + ) + ] + } + + +@attrs.define +class AnnotationsItem: + """A class that maps to a single [[annotations]] table element in + REUSE.toml. + """ + + TOML_KEYS = { + "paths": "path", + "precedence": "precedence", + "copyright_lines": "SPDX-FileCopyrightText", + "spdx_expressions": "SPDX-License-Identifier", + } + + paths: Set[str] = attrs.field( + converter=_str_to_set, + validator=_validate_collection_of(set, str, optional=False), + ) + precedence: PrecedenceType = attrs.field( + converter=_str_to_global_precedence, default=PrecedenceType.CLOSEST + ) + copyright_lines: Set[str] = attrs.field( + converter=_str_to_set, + validator=_validate_collection_of(set, str, optional=True), + default=None, + ) + spdx_expressions: Set[Expression] = attrs.field( + converter=_str_to_set_of_expr, + validator=_validate_collection_of(set, Expression, optional=True), + default=None, + ) + + _paths_regex: re.Pattern = attrs.field(init=False) + + def __attrs_post_init__(self) -> None: + def translate(path: str) -> str: + blocks = [] + escaping = False + globstar = False + prev_char = "" + for char in path: + if char == "\\": + if prev_char == "\\" and escaping: + escaping = False + blocks.append(r"\\") + else: + escaping = True + elif char == "*": + if escaping: + blocks.append(re.escape("*")) + escaping = False + elif prev_char == "*" and not globstar: + globstar = True + blocks.append(r".*") + elif char == "/": + if not globstar: + blocks.append("/") + escaping = False + else: + if prev_char == "*" and not globstar: + blocks.append(r"[^/]*") + blocks.append(re.escape(char)) + globstar = False + escaping = False + prev_char = char + if prev_char == "*" and not globstar: + blocks.append(r"[^/]*") + result = "".join(blocks) + return f"^({result})$" + + self._paths_regex = re.compile( + "|".join(translate(path) for path in self.paths) + ) + + @classmethod + def from_dict(cls, values: Dict[str, Any]) -> "AnnotationsItem": + """Create an :class:`AnnotationsItem` from a dictionary that uses the + key-value pairs for an [[annotations]] table in REUSE.toml. + """ + new_dict = {} + new_dict["paths"] = values.get(cls.TOML_KEYS["paths"]) + precedence = values.get(cls.TOML_KEYS["precedence"]) + if precedence is not None: + new_dict["precedence"] = precedence + new_dict["copyright_lines"] = values.get( + cls.TOML_KEYS["copyright_lines"] + ) + new_dict["spdx_expressions"] = values.get( + cls.TOML_KEYS["spdx_expressions"] + ) + return cls(**new_dict) # type: ignore + + def matches(self, path: str) -> bool: + """Determine whether *path* matches any of the paths (or path globs) in + :class:`AnnotationsItem`. + """ + return bool(self._paths_regex.match(path)) + + +@attrs.define +class ReuseTOML(GlobalLicensing): + """A class that contains the data parsed from a REUSE.toml file.""" + + version: int = attrs.field(validator=_instance_of(int)) + annotations: List[AnnotationsItem] = attrs.field( + validator=_validate_collection_of(list, AnnotationsItem, optional=True) + ) + + @classmethod + def from_dict(cls, values: Dict[str, Any], source: str) -> "ReuseTOML": + """Create a :class:`ReuseTOML` from the dict version of REUSE.toml.""" + new_dict = {} + new_dict["version"] = values.get("version") + new_dict["source"] = source + + annotation_dicts = values.get("annotations", []) + annotations = [ + AnnotationsItem.from_dict(annotation) + for annotation in annotation_dicts + ] + + new_dict["annotations"] = annotations + + return cls(**new_dict) # type: ignore + + @classmethod + def from_toml(cls, toml: str, source: str) -> "ReuseTOML": + """Create a :class:`ReuseTOML` from TOML text.""" + try: + tomldict = tomlkit.loads(toml) + except tomlkit.exceptions.TOMLKitError as error: + raise GlobalLicensingParseError(str(error)) from error + return cls.from_dict(tomldict, source) + + @classmethod + def from_file(cls, path: StrPath) -> "ReuseTOML": + with Path(path).open(encoding="utf-8") as fp: + return cls.from_toml(fp.read(), str(path)) + + def find_annotations_item(self, path: StrPath) -> Optional[AnnotationsItem]: + """Find a :class:`AnnotationsItem` that matches *path*. The latest match + in :attr:`annotations` is returned. + """ + path = PurePath(path).as_posix() + for item in reversed(self.annotations): + if item.matches(path): + return item + return None + + def reuse_info_of( + self, path: StrPath + ) -> Dict[PrecedenceType, List[ReuseInfo]]: + path = PurePath(path).as_posix() + item = self.find_annotations_item(path) + if item: + return { + item.precedence: [ + ReuseInfo( + spdx_expressions=item.spdx_expressions, + copyright_lines=item.copyright_lines, + path=path, + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + return {} + + @property + def directory(self) -> PurePath: + """The directory in which the REUSE.toml file is located.""" + return PurePath(self.source).parent + + +@attrs.define +class NestedReuseTOML(GlobalLicensing): + """A class that represents a hierarchy of :class:`ReuseTOML` objects.""" + + reuse_tomls: List[ReuseTOML] = attrs.field() + + @classmethod + def from_file(cls, path: StrPath) -> "GlobalLicensing": + """TODO: *path* is a directory instead of a file.""" + tomls = [ + ReuseTOML.from_file(toml_path) + for toml_path in cls.find_reuse_tomls(path) + ] + return cls(reuse_tomls=tomls, source=str(path)) + + def reuse_info_of( + self, path: StrPath + ) -> Dict[PrecedenceType, List[ReuseInfo]]: + path = PurePath(path) + + toml_items: List[Tuple[ReuseTOML, AnnotationsItem]] = ( + self._find_relevant_tomls_and_items(path) + ) + + result = defaultdict(list) + for keyval in toml_items: + toml = keyval[0] + item = keyval[1] + relpath = (PurePath(self.source) / path).relative_to(toml.directory) + # I'm pretty sure there should be no KeyError here. + info = toml.reuse_info_of(relpath)[item.precedence][0] + result[item.precedence].append( + # Fix the paths to be relative to self.source. As-is, they + # were relative to the directory of the respective + # REUSE.toml. + info.copy( + path=path.as_posix(), + source_path=PurePath(toml.source) + .relative_to(self.source) + .as_posix(), + ) + ) + if item.precedence == PrecedenceType.OVERRIDE: + # No more! + break + + # Clean up CLOSEST. Some items were added that are not the closest. + # Consider copyright and licensing separately. + copyright_found = False + licence_found = False + to_keep: List[ReuseInfo] = [] + for info in reversed(result[PrecedenceType.CLOSEST]): + new_info = info.copy(copyright_lines=set(), spdx_expressions=set()) + if not copyright_found and info.copyright_lines: + new_info = new_info.copy(copyright_lines=info.copyright_lines) + copyright_found = True + if not licence_found and info.spdx_expressions: + new_info = new_info.copy(spdx_expressions=info.spdx_expressions) + licence_found = True + if new_info.contains_copyright_or_licensing(): + to_keep.append(new_info) + result[PrecedenceType.CLOSEST] = list(reversed(to_keep)) + # Looping over CLOSEST created it in the defaultdict. Remove it if it's + # empty. + if not result[PrecedenceType.CLOSEST]: + del result[PrecedenceType.CLOSEST] + + return dict(result) + + @classmethod + def find_reuse_tomls(cls, path: StrPath) -> Generator[Path, None, None]: + """Find all REUSE.toml files in *path*.""" + return Path(path).rglob("**/REUSE.toml") + + def _find_relevant_tomls(self, path: StrPath) -> List[ReuseTOML]: + found = [] + for toml in self.reuse_tomls: + # TODO: When Python 3.8 is dropped, use is_relative_to instead. + with contextlib.suppress(ValueError): + PurePath(path).relative_to(toml.directory) + # No error. + found.append(toml) + # Sort from topmost to deepest directory. + found.sort(key=lambda toml: toml.directory.parts) + return found + + def _find_relevant_tomls_and_items( + self, path: StrPath + ) -> List[Tuple[ReuseTOML, AnnotationsItem]]: + # *path* is relative to the Project root, which is the *source* of + # NestedReuseTOML, which itself is a relative (to CWD) or absolute + # path. + path = PurePath(path) + adjusted_path = PurePath(self.source) / path + + tomls = self._find_relevant_tomls(adjusted_path) + toml_items: List[Tuple[ReuseTOML, AnnotationsItem]] = [] + for toml in tomls: + relpath = adjusted_path.relative_to(toml.directory) + item = toml.find_annotations_item(relpath) + if item is not None: + toml_items.append((toml, item)) + return toml_items diff --git a/src/reuse/header.py b/src/reuse/header.py index 9ad071c3b..b125e9464 100644 --- a/src/reuse/header.py +++ b/src/reuse/header.py @@ -216,8 +216,8 @@ def _extract_shebang(prefix: str, text: str) -> Tuple[str, str]: shebang_lines.append(line) text = text.replace(line, "", 1) else: - shebang = "\n".join(shebang_lines) break + shebang = "\n".join(shebang_lines) return (shebang, text) diff --git a/src/reuse/init.py b/src/reuse/init.py deleted file mode 100644 index 90d2b940b..000000000 --- a/src/reuse/init.py +++ /dev/null @@ -1,175 +0,0 @@ -# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. -# -# SPDX-License-Identifier: GPL-3.0-or-later - -"""Functions for REUSE-ifying a project.""" - -import re -import sys -from argparse import ArgumentParser, Namespace -from gettext import gettext as _ -from inspect import cleandoc -from pathlib import Path -from typing import IO, List -from urllib.error import URLError - -from ._licenses import ALL_NON_DEPRECATED_MAP -from ._util import ( - _LICENSEREF_PATTERN, - PathType, - print_incorrect_spdx_identifier, -) -from .download import _path_to_license_file, put_license_in_file -from .project import Project -from .vcs import find_root - - -def prompt_licenses(out: IO[str] = sys.stdout) -> List[str]: - """Prompt the user for a list of licenses.""" - first = _( - "What license is your project under? " - "Provide the SPDX License Identifier. " - "See for the list." - ) - multi = _( - "What other license is your project under? " - "Provide the SPDX License Identifier." - ) - licenses: List[str] = [] - - while True: - if not licenses: - out.write(first) - else: - out.write(multi) - out.write("\n") - out.write(_("To stop adding licenses, hit RETURN.")) - out.write("\n") - result = input() - out.write("\n") - if not result: - return licenses - if result not in ALL_NON_DEPRECATED_MAP and not re.match( - _LICENSEREF_PATTERN, result - ): - print_incorrect_spdx_identifier(result, out=out) - out.write("\n\n") - else: - licenses.append(result) - - -def add_arguments(parser: ArgumentParser) -> None: - """Add arguments to parser.""" - parser.add_argument( - "path", - action="store", - nargs="?", - type=PathType("r", force_directory=True), - ) - - -def run( - args: Namespace, - project: Project, - out: IO[str] = sys.stdout, -) -> int: - """List all non-compliant files.""" - # pylint: disable=too-many-statements,unused-argument - if args.path: - root = args.path - else: - root = find_root() - if root is None: - root = Path.cwd() - - if (root / ".reuse").exists(): - out.write(_("Project already initialized")) - out.write("\n") - return 1 - - out.write(_("Initializing project for REUSE.")) - out.write("\n\n") - - licenses = prompt_licenses(out=out) - - out.write(_("What is the name of the project?")) - out.write("\n") - project_name = input() - - out.write("\n") - - out.write(_("What is the internet address of the project?")) - out.write("\n") - project_url = input() - - out.write("\n") - - out.write(_("What is the name of the maintainer?")) - out.write("\n") - contact_name = input() - - out.write("\n") - - out.write(_("What is the e-mail address of the maintainer?")) - out.write("\n") - contact_address = input() - - out.write("\n") - - out.write(_("All done! Initializing now.")) - out.write("\n\n") - - # Creating files past this point! - - for lic in licenses: - destination = _path_to_license_file(lic, root=root) - - try: - out.write(_("Retrieving {}").format(lic)) - out.write("\n") - put_license_in_file(lic, destination=destination) - # TODO: exceptions - except FileExistsError: - out.write(_("{} already exists").format(destination)) - out.write("\n") - except URLError: - out.write(_("Could not download {}").format(lic)) - out.write("\n") - except FileNotFoundError as err: - out.write( - _( - "Error: Could not copy {path}, " - "please add {lic}.txt manually in the LICENCES/ directory." - ).format(path=err.filename, lic=lic) - ) - out.write("\n") - - out.write("\n") - - out.write(_("Creating .reuse/dep5")) - out.write("\n\n") - - # pylint: disable=line-too-long - dep5_text = cleandoc( - f""" - Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ - Upstream-Name: {project_name} - Upstream-Contact: {contact_name} <{contact_address}> - Source: {project_url} - - # Sample paragraph, commented out: - # - # Files: src/* - # Copyright: $YEAR $NAME <$CONTACT> - # License: ... - """ - ) - dep5_text += "\n" - - (root / ".reuse").mkdir() - (root / ".reuse/dep5").write_text(dep5_text) - - out.write(_("Initialization complete.")) - out.write("\n") - - return 0 diff --git a/src/reuse/lint.py b/src/reuse/lint.py index e9ccf1a54..257d41b9b 100644 --- a/src/reuse/lint.py +++ b/src/reuse/lint.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2023 DB Systel GmbH +# SPDX-FileCopyrightText: 2024 Nico Rikken # # SPDX-License-Identifier: GPL-3.0-or-later @@ -15,7 +16,7 @@ from io import StringIO from pathlib import Path from textwrap import TextWrapper -from typing import IO, Any +from typing import IO, Any, Optional from . import __REUSE_version__ from .project import Project @@ -37,6 +38,12 @@ def add_arguments(parser: ArgumentParser) -> None: action="store_true", help=_("formats output as plain text"), ) + mutex_group.add_argument( + "-l", + "--lines", + action="store_true", + help=_("formats output as errors per line"), + ) # pylint: disable=too-many-branches,too-many-statements,too-many-locals @@ -171,11 +178,11 @@ def format_plain(report: ProjectReport) -> str: _("Used licenses:"): ", ".join(report.used_licenses), _("Read errors:"): str(len(report.read_errors)), _( - "files with copyright information:" + "Files with copyright information:" ): f"{total_files - len(report.files_without_copyright)}" f" / {total_files}", _( - "files with license information:" + "Files with license information:" ): f"{total_files - len(report.files_without_licenses)}" f" / {total_files}", } @@ -257,6 +264,78 @@ def custom_serializer(obj: Any) -> Any: ) +def format_lines(report: ProjectReport) -> str: + """Formats data dictionary as plaintext strings to be printed to sys.stdout + Sorting of output is not guaranteed. + Symbolic links can result in multiple entries per file. + + Args: + report: ProjectReport data + + Returns: + String (in plaintext) that can be output to sys.stdout + """ + output = StringIO() + + def license_path(lic: str) -> Optional[Path]: + """Resolve a license identifier to a license path.""" + return report.licenses.get(lic) + + if not report.is_compliant: + # Bad licenses + for lic, files in sorted(report.bad_licenses.items()): + for path in sorted(files): + output.write( + _("{path}: bad license {lic}\n").format(path=path, lic=lic) + ) + + # Deprecated licenses + for lic in sorted(report.deprecated_licenses): + lic_path = license_path(lic) + output.write( + _("{lic_path}: deprecated license\n").format(lic_path=lic_path) + ) + + # Licenses without extension + for lic in sorted(report.licenses_without_extension): + lic_path = license_path(lic) + output.write( + _("{lic_path}: license without file extension\n").format( + lic_path=lic_path + ) + ) + + # Unused licenses + for lic in sorted(report.unused_licenses): + lic_path = license_path(lic) + output.write( + _("{lic_path}: unused license\n").format(lic_path=lic_path) + ) + + # Missing licenses + for lic, files in sorted(report.missing_licenses.items()): + for path in sorted(files): + output.write( + _("{path}: missing license {lic}\n").format( + path=path, lic=lic + ) + ) + + # Read errors + for path in sorted(report.read_errors): + output.write(_("{path}: read error\n").format(path=path)) + + # Without licenses + for path in report.files_without_licenses: + output.write(_("{path}: no license identifier\n").format(path=path)) + + # Without copyright + for path in report.files_without_copyright: + output.write(_("{path}: no copyright notice\n").format(path=path)) + + return output.getvalue() + + def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """List all non-compliant files.""" report = ProjectReport.generate( @@ -267,6 +346,8 @@ def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: pass elif args.json: out.write(format_json(report)) + elif args.lines: + out.write(format_lines(report)) else: out.write(format_plain(report)) diff --git a/src/reuse/project.py b/src/reuse/project.py index 1da93745b..9fc8b48de 100644 --- a/src/reuse/project.py +++ b/src/reuse/project.py @@ -14,14 +14,12 @@ import logging import os import warnings +from collections import defaultdict from gettext import gettext as _ from pathlib import Path -from typing import Dict, Iterator, List, Optional, Type +from typing import DefaultDict, Dict, Iterator, List, NamedTuple, Optional, Type from binaryornot.check import is_binary -from boolean.boolean import ParseError -from debian.copyright import Copyright -from license_expression import ExpressionError from . import ( _IGNORE_DIR_PATTERNS, @@ -29,25 +27,37 @@ _IGNORE_MESON_PARENT_DIR_PATTERNS, IdentifierNotFound, ReuseInfo, - SourceType, ) from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( - _HEADER_BYTES, _LICENSEREF_PATTERN, StrPath, - _contains_snippet, - _copyright_from_dep5, _determine_license_path, - _parse_dep5, - decoded_text_from_binary, - extract_reuse_info, + relative_from_root, + reuse_info_of_file, +) +from .global_licensing import ( + GlobalLicensing, + NestedReuseTOML, + PrecedenceType, + ReuseDep5, ) from .vcs import VCSStrategy, VCSStrategyNone, all_vcs_strategies _LOGGER = logging.getLogger(__name__) +class GlobalLicensingConflict(Exception): + """There are two global licensing files in the project that are not + compatible. + """ + + +class GlobalLicensingFound(NamedTuple): + path: Path + cls: Type[GlobalLicensing] + + class Project: """Simple object that holds the project's root, which is necessary for many interactions. @@ -60,7 +70,7 @@ def __init__( vcs_strategy: Optional[Type[VCSStrategy]] = None, license_map: Optional[Dict[str, Dict]] = None, licenses: Optional[Dict[str, Path]] = None, - dep5_copyright: Optional[Copyright] = None, + global_licensing: Optional[GlobalLicensing] = None, include_submodules: bool = False, include_meson_subprojects: bool = False, ): @@ -80,7 +90,7 @@ def __init__( licenses = {} self.licenses = licenses - self.dep5_copyright = dep5_copyright + self.global_licensing = global_licensing self.include_submodules = include_submodules self.include_meson_subprojects = include_meson_subprojects @@ -103,8 +113,12 @@ def from_directory( Raises: FileNotFoundError: if root does not exist. NotADirectoryError: if root is not a directory. - UnicodeDecodeError: if .reuse/dep5 could not be decoded. - DebianError: if .reuse/dep5 could not be parsed. + UnicodeDecodeError: if the global licensing config file could not be + decoded. + GlobalLicensingParseError: if the global licensing config file could + not be parsed. + GlobalLicensingConflict: if more than one global licensing config + file is present. """ root = Path(root) if not root.exists(): @@ -121,17 +135,16 @@ def from_directory( ) vcs_strategy = cls._detect_vcs_strategy(root) - try: - dep5_copyright: Optional[Copyright] = _parse_dep5( - root / ".reuse/dep5" - ) - except FileNotFoundError: - dep5_copyright = None + + global_licensing: Optional[GlobalLicensing] = None + found = cls.find_global_licensing(root) + if found: + global_licensing = found.cls.from_file(found.path) project = cls( root, vcs_strategy=vcs_strategy, - dep5_copyright=dep5_copyright, + global_licensing=global_licensing, include_submodules=include_submodules, include_meson_subprojects=include_meson_subprojects, ) @@ -202,16 +215,27 @@ def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: """Return REUSE info of *path*. This function will return any REUSE information that it can find: from - within the file, the .license file and/or from the .reuse/dep5 file. + within the file, the .license file, from REUSE.toml, and/or from the + .reuse/dep5 file. The presence of a .license file always means that the file itself will not be parsed for REUSE information. - When the .reuse/dep5 file covers a file and there is also REUSE - information within that file (or within its .license file), then two - :class:`ReuseInfo` objects are returned in the set, each with respective - discovered REUSE information and information about the source. + When information is found from multiple sources, and if the precedence + for that file in REUSE.toml is 'aggregate' (or if .reuse/dep5 is used), + then two (or more) :class:`ReuseInfo` objects are returned in list set, + each with respective discovered REUSE information and information about + the source. + + Alternatively, if the precedence is set to 'closest' or 'toml', or if + information was found in only one source, then a list of one item is + returned. + + The exact precedence handling is detailed in the specification. + + An empty list is returned if no information was found whatsoever. """ + # pylint: disable=too-many-branches original_path = path path = _determine_license_path(path) @@ -219,21 +243,35 @@ def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: # This means that only one 'source' of licensing/copyright information # is captured in ReuseInfo - dep5_result = ReuseInfo() + global_results: "DefaultDict[PrecedenceType, List[ReuseInfo]]" = ( + defaultdict(list) + ) file_result = ReuseInfo() - result = [] + result: List[ReuseInfo] = [] - # Search the .reuse/dep5 file for REUSE information. - if self.dep5_copyright: - dep5_result = _copyright_from_dep5( - self.relative_from_root(path), self.dep5_copyright + # Search the global licensing file for REUSE information. + if self.global_licensing: + relpath = self.relative_from_root(path) + global_results = defaultdict( + list, self.global_licensing.reuse_info_of(relpath) ) - if dep5_result.contains_copyright_or_licensing(): - _LOGGER.info( - _("'{path}' covered by .reuse/dep5").format(path=path) - ) + for info_list in global_results.values(): + for global_result in info_list: + if global_result.contains_copyright_or_licensing(): + _LOGGER.info( + _("'{path}' covered by {global_path}").format( + path=path, global_path=global_result.source_path + ) + ) - if is_binary(str(path)): + if PrecedenceType.OVERRIDE in global_results: + _LOGGER.info( + _( + "'{path}' is covered exclusively by REUSE.toml. Not reading" + " the file contents." + ).format(path=path) + ) + elif is_binary(str(path)): _LOGGER.info( _( "'{path}' was detected as a binary file; not searching its" @@ -241,87 +279,79 @@ def reuse_info_of(self, path: StrPath) -> List[ReuseInfo]: ).format(path=path) ) else: - # Search the file for REUSE information. - with path.open("rb") as fp: - try: - read_limit: Optional[int] = _HEADER_BYTES - # Completely read the file once - # to search for possible snippets - if _contains_snippet(fp): - _LOGGER.debug( - f"'{path}' seems to contain an SPDX Snippet" + file_result = reuse_info_of_file(path, original_path, self.root) + + result.extend(global_results[PrecedenceType.OVERRIDE]) + result.extend(global_results[PrecedenceType.AGGREGATE]) + if file_result.contains_info(): + result.append(file_result) + if not file_result.contains_copyright_or_licensing(): + result.extend(global_results[PrecedenceType.CLOSEST]) + # Special case: If a file contains only copyright, apply the + # REUSE.toml's licensing if it exists, and vice versa. + elif file_result.contains_copyright_xor_licensing(): + if global_results[PrecedenceType.CLOSEST]: + # There should only by a single CLOSEST result in the list. + closest = global_results[PrecedenceType.CLOSEST][0] + if file_result.copyright_lines: + result.append( + closest.copy( + copyright_lines=set(), ) - read_limit = None - # Reset read position - fp.seek(0) - # Scan the file for REUSE info, possibly limiting the read - # length - file_result = extract_reuse_info( - decoded_text_from_binary(fp, size=read_limit) ) - if file_result.contains_copyright_or_licensing(): - source_type = SourceType.FILE_HEADER - if path.suffix == ".license": - source_type = SourceType.DOT_LICENSE - file_result = file_result.copy( - path=self.relative_from_root( - original_path - ).as_posix(), - source_path=self.relative_from_root( - path - ).as_posix(), - source_type=source_type, + elif file_result.spdx_expressions: + result.append( + closest.copy( + spdx_expressions=set(), ) - - except (ExpressionError, ParseError): - _LOGGER.error( - _( - "'{path}' holds an SPDX expression that cannot be" - " parsed, skipping the file" - ).format(path=path) ) - - # There is both information in a .dep5 file and in the file header - if dep5_result.contains_info() and file_result.contains_info(): - warnings.warn( - _( - "Copyright and licensing information for" - " '{original_path}' has been found in both '{path}' and" - " in the DEP5 file located at '{dep5_path}'. The" - " information for these two sources has been" - " aggregated. In the future this behaviour will change," - " and you will need to explicitly enable aggregation." - " See" - " . You" - " need do nothing yet. Run with" - " `--suppress-deprecation` to hide this warning." - ).format( - original_path=original_path, - path=path, - dep5_path=dep5_result.source_path, - ), - PendingDeprecationWarning, - ) - if dep5_result.contains_info(): - result.append(dep5_result) - if file_result.contains_info(): - result.append(file_result) return result - @staticmethod - def _relative_from_root_static(path: StrPath, root: StrPath) -> Path: - """A static method of :method:`Project.relative_fromt_root`.""" - path = Path(path) - try: - return path.relative_to(root) - except ValueError: - return Path(os.path.relpath(path, start=root)) - def relative_from_root(self, path: StrPath) -> Path: """If the project root is /tmp/project, and *path* is /tmp/project/src/file, then return src/file. """ - return self._relative_from_root_static(path, self.root) + return relative_from_root(path, self.root) + + @classmethod + def find_global_licensing( + cls, root: Path + ) -> Optional[GlobalLicensingFound]: + """Find the path and corresponding class of a project directory's + :class:`GlobalLicensing`. + + Raises: + GlobalLicensingConflict: if more than one global licensing config + file is present. + """ + candidate: Optional[GlobalLicensingFound] = None + dep5_path = root / ".reuse/dep5" + if (dep5_path).exists(): + # Sneaky workaround to not print this warning. + if not os.environ.get("_SUPPRESS_DEP5_WARNING"): + warnings.warn( + _( + "'.reuse/dep5' is deprecated. You are recommended to" + " instead use REUSE.toml. Use `reuse convert-dep5` to" + " convert." + ), + PendingDeprecationWarning, + ) + candidate = GlobalLicensingFound(dep5_path, ReuseDep5) + toml_path = None + with contextlib.suppress(StopIteration): + toml_path = next(root.rglob("**/REUSE.toml")) + if toml_path is not None: + if candidate is not None: + raise GlobalLicensingConflict( + _( + "Found both '{new_path}' and '{old_path}'. You" + " cannot keep both files simultaneously; they are" + " not intercompatible." + ).format(new_path=toml_path, old_path=dep5_path) + ) + candidate = GlobalLicensingFound(root, NestedReuseTOML) + return candidate def _is_path_ignored(self, path: Path) -> bool: """Is *path* ignored by some mechanism?""" diff --git a/src/reuse/report.py b/src/reuse/report.py index 174dbd866..4c7eec314 100644 --- a/src/reuse/report.py +++ b/src/reuse/report.py @@ -8,6 +8,7 @@ """Module that contains reports about files and projects for linting.""" +import bdb import contextlib import datetime import logging @@ -21,16 +22,9 @@ from typing import Any, Dict, Iterable, List, NamedTuple, Optional, Set, cast from uuid import uuid4 -from debian.copyright import Copyright - from . import __REUSE_version__, __version__ -from ._util import ( - _LICENSEREF_PATTERN, - _LICENSING, - StrPath, - _checksum, - _parse_dep5, -) +from ._util import _LICENSEREF_PATTERN, _LICENSING, StrPath, _checksum +from .global_licensing import ReuseDep5 from .project import Project, ReuseInfo _LOGGER = logging.getLogger(__name__) @@ -44,38 +38,44 @@ class _MultiprocessingContainer: def __init__( self, project: Project, do_checksum: bool, add_license_concluded: bool ): - # TODO: We create a copy of the project in the following song-and-dance - # because the debian Copyright object cannot be pickled. - new_project = Project( - project.root, - vcs_strategy=project.vcs_strategy.__class__, - license_map=project.license_map, - licenses=project.licenses.copy(), - # Unset dep5_copyright - dep5_copyright=None, - include_submodules=project.include_submodules, - include_meson_subprojects=project.include_meson_subprojects, - ) - new_project.licenses_without_extension = ( - project.licenses_without_extension - ) + if isinstance(project.global_licensing, ReuseDep5): + # Remember that a dep5_copyright was (or was not) set prior. + self.has_dep5 = bool(project.global_licensing) + # TODO: We create a copy of the project in the following + # song-and-dance because the debian Copyright object cannot be + # pickled. + new_project = Project( + project.root, + vcs_strategy=project.vcs_strategy.__class__, + license_map=project.license_map, + licenses=project.licenses.copy(), + # TODO: adjust this method/class to account for REUSE.toml as + # well. Unset dep5_copyright + global_licensing=None, + include_submodules=project.include_submodules, + include_meson_subprojects=project.include_meson_subprojects, + ) + new_project.licenses_without_extension = ( + project.licenses_without_extension + ) + self.project = new_project + else: + self.has_dep5 = False + self.project = project - self.project = new_project - # Remember that a dep5_copyright was (or was not) set prior. - self.has_dep5 = bool(project.dep5_copyright) - self.dep5_copyright: Optional[Copyright] = None + self.reuse_dep5: Optional[ReuseDep5] = None self.do_checksum = do_checksum self.add_license_concluded = add_license_concluded def __call__(self, file_: StrPath) -> "_MultiprocessingResult": # By remembering that we've parsed the .reuse/dep5, we only parse it # once (the first time) inside of each process. - if self.has_dep5 and not self.dep5_copyright: + if self.has_dep5 and not self.reuse_dep5: with contextlib.suppress(Exception): - self.dep5_copyright = _parse_dep5( + self.reuse_dep5 = ReuseDep5.from_file( self.project.root / ".reuse/dep5" ) - self.project.dep5_copyright = self.dep5_copyright + self.project.global_licensing = self.reuse_dep5 # pylint: disable=broad-except try: return _MultiprocessingResult( @@ -228,8 +228,7 @@ def bill_of_materials( out.write(f"Creator: Tool: reuse-{__version__}\n") now = datetime.datetime.now(tz=datetime.timezone.utc) - now = now.replace(microsecond=0) - out.write(f"Created: {now.isoformat()}Z\n") + out.write(f"Created: {now.strftime('%Y-%m-%dT%H:%M:%SZ')}\n") out.write( "CreatorComment: This document was created automatically" " using available reuse information consistent with" @@ -240,7 +239,7 @@ def bill_of_materials( for report in reports: out.write( - "Relationship: SPDXRef-DOCUMENT describes" + "Relationship: SPDXRef-DOCUMENT DESCRIBES" f" {report.spdx_id}\n" ) @@ -303,6 +302,9 @@ def generate( for result in results: if result.error: + # Facilitate better debugging by being able to quit the program. + if isinstance(result.error, bdb.BdbQuit): + raise bdb.BdbQuit() from result.error if isinstance(result.error, (OSError, UnicodeError)): _LOGGER.error( _("Could not read '{path}'").format(path=result.path), @@ -499,7 +501,7 @@ def recommendations(self) -> List[str]: "Fix missing copyright/licensing information: For one or" " more files, the tool cannot find copyright and/or" " licensing information. You typically do this by adding" - " 'SPDX-FileCopyrightText' and 'SPDX-License-Identifer'" + " 'SPDX-FileCopyrightText' and 'SPDX-License-Identifier'" " tags to each file. The tutorial explains additional ways" " to do this: " ) @@ -539,9 +541,11 @@ def to_dict_lint(self) -> Dict[str, Any]: { "value": line, "source": reuse_info.source_path, - "source_type": reuse_info.source_type.value - if reuse_info.source_type - else None, + "source_type": ( + reuse_info.source_type.value + if reuse_info.source_type + else None + ), } for reuse_info in self.reuse_infos for line in reuse_info.copyright_lines @@ -550,9 +554,11 @@ def to_dict_lint(self) -> Dict[str, Any]: { "value": str(expression), "source": reuse_info.source_path, - "source_type": reuse_info.source_type.value - if reuse_info.source_type - else None, + "source_type": ( + reuse_info.source_type.value + if reuse_info.source_type + else None + ), } for reuse_info in self.reuse_infos for expression in reuse_info.spdx_expressions diff --git a/src/reuse/resources/exceptions.json b/src/reuse/resources/exceptions.json index 2a3cec9b6..e9bb9314b 100644 --- a/src/reuse/resources/exceptions.json +++ b/src/reuse/resources/exceptions.json @@ -1,11 +1,11 @@ { - "licenseListVersion": "3.22", + "licenseListVersion": "3.24.0", "exceptions": [ { "reference": "./389-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./389-exception.html", - "referenceNumber": 15, + "referenceNumber": 52, "name": "389 Directory Server Exception", "licenseExceptionId": "389-exception", "seeAlso": [ @@ -17,7 +17,7 @@ "reference": "./Asterisk-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Asterisk-exception.html", - "referenceNumber": 2, + "referenceNumber": 39, "name": "Asterisk exception", "licenseExceptionId": "Asterisk-exception", "seeAlso": [ @@ -25,11 +25,22 @@ "https://github.com/asterisk/libss7/blob/03e81bcd0d28ff25d4c77c78351ddadc82ff5c3f/ss7.c#L24" ] }, + { + "reference": "./Asterisk-linking-protocols-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./Asterisk-linking-protocols-exception.html", + "referenceNumber": 24, + "name": "Asterisk linking protocols exception", + "licenseExceptionId": "Asterisk-linking-protocols-exception", + "seeAlso": [ + "https://github.com/asterisk/asterisk/blob/115d7c01e32ccf4566a99e9d74e2b88830985a0b/LICENSE#L27" + ] + }, { "reference": "./Autoconf-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-2.0.html", - "referenceNumber": 22, + "referenceNumber": 60, "name": "Autoconf exception 2.0", "licenseExceptionId": "Autoconf-exception-2.0", "seeAlso": [ @@ -41,7 +52,7 @@ "reference": "./Autoconf-exception-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-3.0.html", - "referenceNumber": 62, + "referenceNumber": 42, "name": "Autoconf exception 3.0", "licenseExceptionId": "Autoconf-exception-3.0", "seeAlso": [ @@ -52,20 +63,21 @@ "reference": "./Autoconf-exception-generic.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-generic.html", - "referenceNumber": 47, + "referenceNumber": 70, "name": "Autoconf generic exception", "licenseExceptionId": "Autoconf-exception-generic", "seeAlso": [ "https://launchpad.net/ubuntu/precise/+source/xmltooling/+copyright", "https://tracker.debian.org/media/packages/s/sipwitch/copyright-1.9.15-3", - "https://opensource.apple.com/source/launchd/launchd-258.1/launchd/compile.auto.html" + "https://opensource.apple.com/source/launchd/launchd-258.1/launchd/compile.auto.html", + "https://git.savannah.gnu.org/gitweb/?p\u003dgnulib.git;a\u003dblob;f\u003dgnulib-tool;h\u003d029a8cf377ad8d8f2d9e54061bf2f20496ad2eef;hb\u003d73c74ba0197e6566da6882c87b1adee63e24d75c#l407" ] }, { "reference": "./Autoconf-exception-generic-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-generic-3.0.html", - "referenceNumber": 9, + "referenceNumber": 44, "name": "Autoconf generic exception for GPL-3.0", "licenseExceptionId": "Autoconf-exception-generic-3.0", "seeAlso": [ @@ -76,7 +88,7 @@ "reference": "./Autoconf-exception-macro.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-macro.html", - "referenceNumber": 14, + "referenceNumber": 15, "name": "Autoconf macro exception", "licenseExceptionId": "Autoconf-exception-macro", "seeAlso": [ @@ -85,11 +97,22 @@ "https://launchpad.net/ubuntu/precise/+source/xmltooling/+copyright" ] }, + { + "reference": "./Bison-exception-1.24.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./Bison-exception-1.24.html", + "referenceNumber": 4, + "name": "Bison exception 1.24", + "licenseExceptionId": "Bison-exception-1.24", + "seeAlso": [ + "https://github.com/arineng/rwhoisd/blob/master/rwhoisd/mkdb/y.tab.c#L180" + ] + }, { "reference": "./Bison-exception-2.2.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bison-exception-2.2.html", - "referenceNumber": 61, + "referenceNumber": 30, "name": "Bison exception 2.2", "licenseExceptionId": "Bison-exception-2.2", "seeAlso": [ @@ -100,7 +123,7 @@ "reference": "./Bootloader-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bootloader-exception.html", - "referenceNumber": 20, + "referenceNumber": 21, "name": "Bootloader Distribution Exception", "licenseExceptionId": "Bootloader-exception", "seeAlso": [ @@ -111,7 +134,7 @@ "reference": "./Classpath-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Classpath-exception-2.0.html", - "referenceNumber": 7, + "referenceNumber": 11, "name": "Classpath exception 2.0", "licenseExceptionId": "Classpath-exception-2.0", "seeAlso": [ @@ -123,7 +146,7 @@ "reference": "./CLISP-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./CLISP-exception-2.0.html", - "referenceNumber": 25, + "referenceNumber": 49, "name": "CLISP exception 2.0", "licenseExceptionId": "CLISP-exception-2.0", "seeAlso": [ @@ -134,21 +157,22 @@ "reference": "./cryptsetup-OpenSSL-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./cryptsetup-OpenSSL-exception.html", - "referenceNumber": 3, + "referenceNumber": 26, "name": "cryptsetup OpenSSL exception", "licenseExceptionId": "cryptsetup-OpenSSL-exception", "seeAlso": [ "https://gitlab.com/cryptsetup/cryptsetup/-/blob/main/COPYING", "https://gitlab.nic.cz/datovka/datovka/-/blob/develop/COPYING", "https://github.com/nbs-system/naxsi/blob/951123ad456bdf5ac94e8d8819342fe3d49bc002/naxsi_src/naxsi_raw.c", - "http://web.mit.edu/jgross/arch/amd64_deb60/bin/mosh" + "http://web.mit.edu/jgross/arch/amd64_deb60/bin/mosh", + "https://sourceforge.net/p/linux-ima/ima-evm-utils/ci/master/tree/src/evmctl.c#l30" ] }, { "reference": "./DigiRule-FOSS-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./DigiRule-FOSS-exception.html", - "referenceNumber": 39, + "referenceNumber": 16, "name": "DigiRule FOSS License Exception", "licenseExceptionId": "DigiRule-FOSS-exception", "seeAlso": [ @@ -159,7 +183,7 @@ "reference": "./eCos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./eCos-exception-2.0.html", - "referenceNumber": 12, + "referenceNumber": 45, "name": "eCos exception 2.0", "licenseExceptionId": "eCos-exception-2.0", "seeAlso": [ @@ -170,7 +194,7 @@ "reference": "./Fawkes-Runtime-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Fawkes-Runtime-exception.html", - "referenceNumber": 52, + "referenceNumber": 31, "name": "Fawkes Runtime Exception", "licenseExceptionId": "Fawkes-Runtime-exception", "seeAlso": [ @@ -181,18 +205,30 @@ "reference": "./FLTK-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./FLTK-exception.html", - "referenceNumber": 36, + "referenceNumber": 59, "name": "FLTK exception", "licenseExceptionId": "FLTK-exception", "seeAlso": [ "http://www.fltk.org/COPYING.php" ] }, + { + "reference": "./fmt-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./fmt-exception.html", + "referenceNumber": 48, + "name": "fmt exception", + "licenseExceptionId": "fmt-exception", + "seeAlso": [ + "https://github.com/fmtlib/fmt/blob/master/LICENSE", + "https://github.com/fmtlib/fmt/blob/2eb363297b24cd71a68ccfb20ff755430f17e60f/LICENSE#L22C1-L27C62" + ] + }, { "reference": "./Font-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Font-exception-2.0.html", - "referenceNumber": 29, + "referenceNumber": 62, "name": "Font exception 2.0", "licenseExceptionId": "Font-exception-2.0", "seeAlso": [ @@ -203,7 +239,7 @@ "reference": "./freertos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./freertos-exception-2.0.html", - "referenceNumber": 1, + "referenceNumber": 14, "name": "FreeRTOS Exception 2.0", "licenseExceptionId": "freertos-exception-2.0", "seeAlso": [ @@ -214,7 +250,7 @@ "reference": "./GCC-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0.html", - "referenceNumber": 13, + "referenceNumber": 29, "name": "GCC Runtime Library exception 2.0", "licenseExceptionId": "GCC-exception-2.0", "seeAlso": [ @@ -226,7 +262,7 @@ "reference": "./GCC-exception-2.0-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0-note.html", - "referenceNumber": 55, + "referenceNumber": 1, "name": "GCC Runtime Library exception 2.0 - note variant", "licenseExceptionId": "GCC-exception-2.0-note", "seeAlso": [ @@ -237,29 +273,52 @@ "reference": "./GCC-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-3.1.html", - "referenceNumber": 42, + "referenceNumber": 64, "name": "GCC Runtime Library exception 3.1", "licenseExceptionId": "GCC-exception-3.1", "seeAlso": [ "http://www.gnu.org/licenses/gcc-exception-3.1.html" ] }, + { + "reference": "./Gmsh-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./Gmsh-exception.html", + "referenceNumber": 25, + "name": "Gmsh exception\u003e", + "licenseExceptionId": "Gmsh-exception", + "seeAlso": [ + "https://gitlab.onelab.info/gmsh/gmsh/-/raw/master/LICENSE.txt" + ] + }, { "reference": "./GNAT-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNAT-exception.html", - "referenceNumber": 44, + "referenceNumber": 18, "name": "GNAT exception", "licenseExceptionId": "GNAT-exception", "seeAlso": [ "https://github.com/AdaCore/florist/blob/master/libsrc/posix-configurable_file_limits.adb" ] }, + { + "reference": "./GNOME-examples-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./GNOME-examples-exception.html", + "referenceNumber": 40, + "name": "GNOME examples exception", + "licenseExceptionId": "GNOME-examples-exception", + "seeAlso": [ + "https://gitlab.gnome.org/Archive/gnome-devel-docs/-/blob/master/platform-demos/C/legal.xml?ref_type\u003dheads", + "http://meldmerge.org/help/" + ] + }, { "reference": "./GNU-compiler-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNU-compiler-exception.html", - "referenceNumber": 8, + "referenceNumber": 9, "name": "GNU Compiler Exception", "licenseExceptionId": "GNU-compiler-exception", "seeAlso": [ @@ -270,7 +329,7 @@ "reference": "./gnu-javamail-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./gnu-javamail-exception.html", - "referenceNumber": 59, + "referenceNumber": 20, "name": "GNU JavaMail exception", "licenseExceptionId": "gnu-javamail-exception", "seeAlso": [ @@ -281,7 +340,7 @@ "reference": "./GPL-3.0-interface-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-interface-exception.html", - "referenceNumber": 31, + "referenceNumber": 3, "name": "GPL-3.0 Interface Exception", "licenseExceptionId": "GPL-3.0-interface-exception", "seeAlso": [ @@ -292,7 +351,7 @@ "reference": "./GPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-exception.html", - "referenceNumber": 45, + "referenceNumber": 41, "name": "GPL-3.0 Linking Exception", "licenseExceptionId": "GPL-3.0-linking-exception", "seeAlso": [ @@ -303,7 +362,7 @@ "reference": "./GPL-3.0-linking-source-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-source-exception.html", - "referenceNumber": 58, + "referenceNumber": 68, "name": "GPL-3.0 Linking Exception (with Corresponding Source)", "licenseExceptionId": "GPL-3.0-linking-source-exception", "seeAlso": [ @@ -315,7 +374,7 @@ "reference": "./GPL-CC-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-CC-1.0.html", - "referenceNumber": 11, + "referenceNumber": 50, "name": "GPL Cooperation Commitment 1.0", "licenseExceptionId": "GPL-CC-1.0", "seeAlso": [ @@ -327,7 +386,7 @@ "reference": "./GStreamer-exception-2005.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2005.html", - "referenceNumber": 24, + "referenceNumber": 61, "name": "GStreamer Exception (2005)", "licenseExceptionId": "GStreamer-exception-2005", "seeAlso": [ @@ -338,7 +397,7 @@ "reference": "./GStreamer-exception-2008.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2008.html", - "referenceNumber": 51, + "referenceNumber": 10, "name": "GStreamer Exception (2008)", "licenseExceptionId": "GStreamer-exception-2008", "seeAlso": [ @@ -349,7 +408,7 @@ "reference": "./i2p-gpl-java-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./i2p-gpl-java-exception.html", - "referenceNumber": 18, + "referenceNumber": 13, "name": "i2p GPL+Java Exception", "licenseExceptionId": "i2p-gpl-java-exception", "seeAlso": [ @@ -360,7 +419,7 @@ "reference": "./KiCad-libraries-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./KiCad-libraries-exception.html", - "referenceNumber": 54, + "referenceNumber": 8, "name": "KiCad Libraries Exception", "licenseExceptionId": "KiCad-libraries-exception", "seeAlso": [ @@ -371,7 +430,7 @@ "reference": "./LGPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LGPL-3.0-linking-exception.html", - "referenceNumber": 48, + "referenceNumber": 7, "name": "LGPL-3.0 Linking Exception", "licenseExceptionId": "LGPL-3.0-linking-exception", "seeAlso": [ @@ -384,7 +443,7 @@ "reference": "./libpri-OpenH323-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./libpri-OpenH323-exception.html", - "referenceNumber": 23, + "referenceNumber": 5, "name": "libpri OpenH323 exception", "licenseExceptionId": "libpri-OpenH323-exception", "seeAlso": [ @@ -395,7 +454,7 @@ "reference": "./Libtool-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Libtool-exception.html", - "referenceNumber": 37, + "referenceNumber": 63, "name": "Libtool Exception", "licenseExceptionId": "Libtool-exception", "seeAlso": [ @@ -407,7 +466,7 @@ "reference": "./Linux-syscall-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Linux-syscall-note.html", - "referenceNumber": 63, + "referenceNumber": 54, "name": "Linux Syscall Note", "licenseExceptionId": "Linux-syscall-note", "seeAlso": [ @@ -418,7 +477,7 @@ "reference": "./LLGPL.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLGPL.html", - "referenceNumber": 17, + "referenceNumber": 19, "name": "LLGPL Preamble", "licenseExceptionId": "LLGPL", "seeAlso": [ @@ -429,7 +488,7 @@ "reference": "./LLVM-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLVM-exception.html", - "referenceNumber": 30, + "referenceNumber": 57, "name": "LLVM Exception", "licenseExceptionId": "LLVM-exception", "seeAlso": [ @@ -440,7 +499,7 @@ "reference": "./LZMA-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LZMA-exception.html", - "referenceNumber": 49, + "referenceNumber": 2, "name": "LZMA exception", "licenseExceptionId": "LZMA-exception", "seeAlso": [ @@ -451,7 +510,7 @@ "reference": "./mif-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./mif-exception.html", - "referenceNumber": 53, + "referenceNumber": 6, "name": "Macros and Inline Functions Exception", "licenseExceptionId": "mif-exception", "seeAlso": [ @@ -464,7 +523,7 @@ "reference": "./Nokia-Qt-exception-1.1.json", "isDeprecatedLicenseId": true, "detailsUrl": "./Nokia-Qt-exception-1.1.html", - "referenceNumber": 46, + "referenceNumber": 51, "name": "Nokia Qt LGPL exception 1.1", "licenseExceptionId": "Nokia-Qt-exception-1.1", "seeAlso": [ @@ -475,7 +534,7 @@ "reference": "./OCaml-LGPL-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCaml-LGPL-linking-exception.html", - "referenceNumber": 35, + "referenceNumber": 43, "name": "OCaml LGPL Linking Exception", "licenseExceptionId": "OCaml-LGPL-linking-exception", "seeAlso": [ @@ -486,7 +545,7 @@ "reference": "./OCCT-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCCT-exception-1.0.html", - "referenceNumber": 16, + "referenceNumber": 56, "name": "Open CASCADE Exception 1.0", "licenseExceptionId": "OCCT-exception-1.0", "seeAlso": [ @@ -497,7 +556,7 @@ "reference": "./OpenJDK-assembly-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OpenJDK-assembly-exception-1.0.html", - "referenceNumber": 26, + "referenceNumber": 35, "name": "OpenJDK Assembly exception 1.0", "licenseExceptionId": "OpenJDK-assembly-exception-1.0", "seeAlso": [ @@ -508,7 +567,7 @@ "reference": "./openvpn-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./openvpn-openssl-exception.html", - "referenceNumber": 56, + "referenceNumber": 55, "name": "OpenVPN OpenSSL Exception", "licenseExceptionId": "openvpn-openssl-exception", "seeAlso": [ @@ -516,11 +575,22 @@ "https://github.com/psycopg/psycopg2/blob/2_9_3/LICENSE#L14" ] }, + { + "reference": "./PCRE2-exception.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./PCRE2-exception.html", + "referenceNumber": 27, + "name": "PCRE2 exception", + "licenseExceptionId": "PCRE2-exception", + "seeAlso": [ + "https://www.pcre.org/licence.txt" + ] + }, { "reference": "./PS-or-PDF-font-exception-20170817.json", "isDeprecatedLicenseId": false, "detailsUrl": "./PS-or-PDF-font-exception-20170817.html", - "referenceNumber": 43, + "referenceNumber": 67, "name": "PS/PDF font exception (2017-08-17)", "licenseExceptionId": "PS-or-PDF-font-exception-20170817", "seeAlso": [ @@ -531,7 +601,7 @@ "reference": "./QPL-1.0-INRIA-2004-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./QPL-1.0-INRIA-2004-exception.html", - "referenceNumber": 19, + "referenceNumber": 47, "name": "INRIA QPL 1.0 2004 variant exception", "licenseExceptionId": "QPL-1.0-INRIA-2004-exception", "seeAlso": [ @@ -543,7 +613,7 @@ "reference": "./Qt-GPL-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-GPL-exception-1.0.html", - "referenceNumber": 50, + "referenceNumber": 46, "name": "Qt GPL exception 1.0", "licenseExceptionId": "Qt-GPL-exception-1.0", "seeAlso": [ @@ -554,7 +624,7 @@ "reference": "./Qt-LGPL-exception-1.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-LGPL-exception-1.1.html", - "referenceNumber": 10, + "referenceNumber": 65, "name": "Qt LGPL exception 1.1", "licenseExceptionId": "Qt-LGPL-exception-1.1", "seeAlso": [ @@ -565,18 +635,30 @@ "reference": "./Qwt-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qwt-exception-1.0.html", - "referenceNumber": 40, + "referenceNumber": 58, "name": "Qwt exception 1.0", "licenseExceptionId": "Qwt-exception-1.0", "seeAlso": [ "http://qwt.sourceforge.net/qwtlicense.html" ] }, + { + "reference": "./RRDtool-FLOSS-exception-2.0.json", + "isDeprecatedLicenseId": false, + "detailsUrl": "./RRDtool-FLOSS-exception-2.0.html", + "referenceNumber": 22, + "name": "RRDtool FLOSS exception 2.0", + "licenseExceptionId": "RRDtool-FLOSS-exception-2.0", + "seeAlso": [ + "https://github.com/oetiker/rrdtool-1.x/blob/master/COPYRIGHT#L25-L90", + "https://oss.oetiker.ch/rrdtool/license.en.html" + ] + }, { "reference": "./SANE-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SANE-exception.html", - "referenceNumber": 27, + "referenceNumber": 12, "name": "SANE Exception", "licenseExceptionId": "SANE-exception", "seeAlso": [ @@ -589,7 +671,7 @@ "reference": "./SHL-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.0.html", - "referenceNumber": 6, + "referenceNumber": 17, "name": "Solderpad Hardware License v2.0", "licenseExceptionId": "SHL-2.0", "seeAlso": [ @@ -611,7 +693,7 @@ "reference": "./stunnel-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./stunnel-exception.html", - "referenceNumber": 33, + "referenceNumber": 66, "name": "stunnel Exception", "licenseExceptionId": "stunnel-exception", "seeAlso": [ @@ -622,7 +704,7 @@ "reference": "./SWI-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SWI-exception.html", - "referenceNumber": 34, + "referenceNumber": 36, "name": "SWI exception", "licenseExceptionId": "SWI-exception", "seeAlso": [ @@ -633,7 +715,7 @@ "reference": "./Swift-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Swift-exception.html", - "referenceNumber": 60, + "referenceNumber": 37, "name": "Swift Exception", "licenseExceptionId": "Swift-exception", "seeAlso": [ @@ -645,7 +727,7 @@ "reference": "./Texinfo-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Texinfo-exception.html", - "referenceNumber": 28, + "referenceNumber": 23, "name": "Texinfo exception", "licenseExceptionId": "Texinfo-exception", "seeAlso": [ @@ -656,7 +738,7 @@ "reference": "./u-boot-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./u-boot-exception-2.0.html", - "referenceNumber": 57, + "referenceNumber": 69, "name": "U-Boot exception 2.0", "licenseExceptionId": "u-boot-exception-2.0", "seeAlso": [ @@ -667,7 +749,7 @@ "reference": "./UBDL-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./UBDL-exception.html", - "referenceNumber": 41, + "referenceNumber": 53, "name": "Unmodified Binary Distribution exception", "licenseExceptionId": "UBDL-exception", "seeAlso": [ @@ -678,7 +760,7 @@ "reference": "./Universal-FOSS-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Universal-FOSS-exception-1.0.html", - "referenceNumber": 5, + "referenceNumber": 38, "name": "Universal FOSS Exception, Version 1.0", "licenseExceptionId": "Universal-FOSS-exception-1.0", "seeAlso": [ @@ -689,7 +771,7 @@ "reference": "./vsftpd-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./vsftpd-openssl-exception.html", - "referenceNumber": 21, + "referenceNumber": 33, "name": "vsftpd OpenSSL exception", "licenseExceptionId": "vsftpd-openssl-exception", "seeAlso": [ @@ -702,7 +784,7 @@ "reference": "./WxWindows-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./WxWindows-exception-3.1.html", - "referenceNumber": 38, + "referenceNumber": 28, "name": "WxWindows Library Exception 3.1", "licenseExceptionId": "WxWindows-exception-3.1", "seeAlso": [ @@ -713,7 +795,7 @@ "reference": "./x11vnc-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./x11vnc-openssl-exception.html", - "referenceNumber": 4, + "referenceNumber": 34, "name": "x11vnc OpenSSL Exception", "licenseExceptionId": "x11vnc-openssl-exception", "seeAlso": [ @@ -721,5 +803,5 @@ ] } ], - "releaseDate": "2023-10-05" + "releaseDate": "2024-05-22" } \ No newline at end of file diff --git a/src/reuse/resources/licenses.json b/src/reuse/resources/licenses.json index 6f1cc7d63..9596a3b09 100644 --- a/src/reuse/resources/licenses.json +++ b/src/reuse/resources/licenses.json @@ -1,11 +1,11 @@ { - "licenseListVersion": "3.22", + "licenseListVersion": "3.24.0", "licenses": [ { "reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", - "referenceNumber": 244, + "referenceNumber": 537, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": [ @@ -14,11 +14,24 @@ ], "isOsiApproved": true }, + { + "reference": "https://spdx.org/licenses/3D-Slicer-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/3D-Slicer-1.0.json", + "referenceNumber": 200, + "name": "3D Slicer License v1.0", + "licenseId": "3D-Slicer-1.0", + "seeAlso": [ + "https://slicer.org/LICENSE", + "https://github.com/Slicer/Slicer/blob/main/License.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", - "referenceNumber": 169, + "referenceNumber": 406, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": [ @@ -30,7 +43,7 @@ "reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", - "referenceNumber": 221, + "referenceNumber": 526, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": [ @@ -42,7 +55,7 @@ "reference": "https://spdx.org/licenses/AdaCore-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AdaCore-doc.json", - "referenceNumber": 249, + "referenceNumber": 382, "name": "AdaCore Doc License", "licenseId": "AdaCore-doc", "seeAlso": [ @@ -56,7 +69,7 @@ "reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", - "referenceNumber": 203, + "referenceNumber": 558, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": [ @@ -64,11 +77,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Adobe-Display-PostScript.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Adobe-Display-PostScript.json", + "referenceNumber": 431, + "name": "Adobe Display PostScript License", + "licenseId": "Adobe-Display-PostScript", + "seeAlso": [ + "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L752" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", - "referenceNumber": 546, + "referenceNumber": 297, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": [ @@ -80,7 +105,7 @@ "reference": "https://spdx.org/licenses/Adobe-Utopia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Utopia.json", - "referenceNumber": 309, + "referenceNumber": 532, "name": "Adobe Utopia Font License", "licenseId": "Adobe-Utopia", "seeAlso": [ @@ -92,7 +117,7 @@ "reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", - "referenceNumber": 591, + "referenceNumber": 463, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": [ @@ -104,7 +129,7 @@ "reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", - "referenceNumber": 345, + "referenceNumber": 601, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": [ @@ -118,7 +143,7 @@ "reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", - "referenceNumber": 123, + "referenceNumber": 72, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": [ @@ -132,7 +157,7 @@ "reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", - "referenceNumber": 167, + "referenceNumber": 187, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": [ @@ -145,7 +170,7 @@ "reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", - "referenceNumber": 122, + "referenceNumber": 383, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": [ @@ -158,7 +183,7 @@ "reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", - "referenceNumber": 27, + "referenceNumber": 369, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": [ @@ -172,7 +197,7 @@ "reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", - "referenceNumber": 66, + "referenceNumber": 345, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": [ @@ -184,7 +209,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", - "referenceNumber": 403, + "referenceNumber": 221, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": [ @@ -197,7 +222,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", - "referenceNumber": 275, + "referenceNumber": 334, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": [ @@ -209,7 +234,7 @@ "reference": "https://spdx.org/licenses/AGPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-or-later.json", - "referenceNumber": 163, + "referenceNumber": 527, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": [ @@ -221,7 +246,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", - "referenceNumber": 446, + "referenceNumber": 394, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": [ @@ -235,7 +260,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", - "referenceNumber": 76, + "referenceNumber": 123, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": [ @@ -249,7 +274,7 @@ "reference": "https://spdx.org/licenses/AGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-or-later.json", - "referenceNumber": 554, + "referenceNumber": 105, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": [ @@ -263,7 +288,7 @@ "reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", - "referenceNumber": 18, + "referenceNumber": 168, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": [ @@ -272,11 +297,23 @@ "isOsiApproved": false, "isFsfLibre": false }, + { + "reference": "https://spdx.org/licenses/AMD-newlib.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/AMD-newlib.json", + "referenceNumber": 222, + "name": "AMD newlib License", + "licenseId": "AMD-newlib", + "seeAlso": [ + "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/sys/a29khif/_close.S;h\u003d04f52ae00de1dafbd9055ad8d73c5c697a3aae7f;hb\u003dHEAD" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", - "referenceNumber": 396, + "referenceNumber": 149, "name": "AMD\u0027s plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": [ @@ -288,7 +325,7 @@ "reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", - "referenceNumber": 352, + "referenceNumber": 13, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": [ @@ -296,11 +333,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/AML-glslang.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/AML-glslang.json", + "referenceNumber": 1, + "name": "AML glslang variant License", + "licenseId": "AML-glslang", + "seeAlso": [ + "https://github.com/KhronosGroup/glslang/blob/main/LICENSE.txt#L949", + "https://docs.omniverse.nvidia.com/install-guide/latest/common/licenses.html" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", - "referenceNumber": 463, + "referenceNumber": 420, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": [ @@ -312,7 +362,7 @@ "reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", - "referenceNumber": 530, + "referenceNumber": 576, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": [ @@ -332,11 +382,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/any-OSI.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/any-OSI.json", + "referenceNumber": 121, + "name": "Any OSI License", + "licenseId": "any-OSI", + "seeAlso": [ + "https://metacpan.org/pod/Exporter::Tidy#LICENSE" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", - "referenceNumber": 528, + "referenceNumber": 616, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": [ @@ -349,7 +411,7 @@ "reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", - "referenceNumber": 287, + "referenceNumber": 313, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": [ @@ -363,7 +425,7 @@ "reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", - "referenceNumber": 138, + "referenceNumber": 564, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": [ @@ -377,7 +439,7 @@ "reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", - "referenceNumber": 386, + "referenceNumber": 136, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": [ @@ -389,7 +451,7 @@ "reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", - "referenceNumber": 131, + "referenceNumber": 515, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": [ @@ -401,7 +463,7 @@ "reference": "https://spdx.org/licenses/App-s2p.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/App-s2p.json", - "referenceNumber": 444, + "referenceNumber": 470, "name": "App::s2p License", "licenseId": "App-s2p", "seeAlso": [ @@ -413,7 +475,7 @@ "reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", - "referenceNumber": 268, + "referenceNumber": 39, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": [ @@ -426,7 +488,7 @@ "reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", - "referenceNumber": 518, + "referenceNumber": 582, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": [ @@ -438,7 +500,7 @@ "reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", - "referenceNumber": 365, + "referenceNumber": 628, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": [ @@ -450,7 +512,7 @@ "reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", - "referenceNumber": 526, + "referenceNumber": 144, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": [ @@ -463,7 +525,7 @@ "reference": "https://spdx.org/licenses/Arphic-1999.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", - "referenceNumber": 533, + "referenceNumber": 131, "name": "Arphic Public License", "licenseId": "Arphic-1999", "seeAlso": [ @@ -475,7 +537,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", - "referenceNumber": 404, + "referenceNumber": 388, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": [ @@ -488,7 +550,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", - "referenceNumber": 62, + "referenceNumber": 321, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": [ @@ -500,7 +562,7 @@ "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", - "referenceNumber": 595, + "referenceNumber": 652, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": [ @@ -512,7 +574,7 @@ "reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", - "referenceNumber": 237, + "referenceNumber": 355, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": [ @@ -527,7 +589,7 @@ "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.0.json", - "referenceNumber": 262, + "referenceNumber": 330, "name": "ASWF Digital Assets License version 1.0", "licenseId": "ASWF-Digital-Assets-1.0", "seeAlso": [ @@ -539,7 +601,7 @@ "reference": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ASWF-Digital-Assets-1.1.json", - "referenceNumber": 427, + "referenceNumber": 447, "name": "ASWF Digital Assets License 1.1", "licenseId": "ASWF-Digital-Assets-1.1", "seeAlso": [ @@ -551,7 +613,7 @@ "reference": "https://spdx.org/licenses/Baekmuk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", - "referenceNumber": 408, + "referenceNumber": 436, "name": "Baekmuk License", "licenseId": "Baekmuk", "seeAlso": [ @@ -563,7 +625,7 @@ "reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", - "referenceNumber": 559, + "referenceNumber": 494, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": [ @@ -575,7 +637,7 @@ "reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", - "referenceNumber": 555, + "referenceNumber": 48, "name": "Barr License", "licenseId": "Barr", "seeAlso": [ @@ -583,11 +645,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/bcrypt-Solar-Designer.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/bcrypt-Solar-Designer.json", + "referenceNumber": 27, + "name": "bcrypt Solar Designer License", + "licenseId": "bcrypt-Solar-Designer", + "seeAlso": [ + "https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/ext/mri/crypt_blowfish.c" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", - "referenceNumber": 137, + "referenceNumber": 143, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": [ @@ -600,7 +674,7 @@ "reference": "https://spdx.org/licenses/Bitstream-Charter.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Charter.json", - "referenceNumber": 47, + "referenceNumber": 560, "name": "Bitstream Charter Font License", "licenseId": "Bitstream-Charter", "seeAlso": [ @@ -613,7 +687,7 @@ "reference": "https://spdx.org/licenses/Bitstream-Vera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", - "referenceNumber": 224, + "referenceNumber": 581, "name": "Bitstream Vera Font License", "licenseId": "Bitstream-Vera", "seeAlso": [ @@ -626,7 +700,7 @@ "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", - "referenceNumber": 233, + "referenceNumber": 373, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": [ @@ -638,7 +712,7 @@ "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", - "referenceNumber": 174, + "referenceNumber": 288, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": [ @@ -651,7 +725,7 @@ "reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", - "referenceNumber": 153, + "referenceNumber": 469, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": [ @@ -664,19 +738,19 @@ "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", - "referenceNumber": 25, + "referenceNumber": 60, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": [ "https://blueoakcouncil.org/license/1.0.0" ], - "isOsiApproved": false + "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Boehm-GC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Boehm-GC.json", - "referenceNumber": 481, + "referenceNumber": 322, "name": "Boehm-Demers-Weiser GC License", "licenseId": "Boehm-GC", "seeAlso": [ @@ -690,7 +764,7 @@ "reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", - "referenceNumber": 443, + "referenceNumber": 552, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": [ @@ -698,11 +772,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Brian-Gladman-2-Clause.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-2-Clause.json", + "referenceNumber": 457, + "name": "Brian Gladman 2-Clause License", + "licenseId": "Brian-Gladman-2-Clause", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L140-L156", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Brian-Gladman-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Brian-Gladman-3-Clause.json", - "referenceNumber": 223, + "referenceNumber": 409, "name": "Brian Gladman 3-Clause License", "licenseId": "Brian-Gladman-3-Clause", "seeAlso": [ @@ -714,7 +801,7 @@ "reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", - "referenceNumber": 125, + "referenceNumber": 567, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": [ @@ -726,7 +813,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", - "referenceNumber": 217, + "referenceNumber": 264, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": [ @@ -735,11 +822,36 @@ "isOsiApproved": true, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/BSD-2-Clause-Darwin.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Darwin.json", + "referenceNumber": 231, + "name": "BSD 2-Clause - Ian Darwin variant", + "licenseId": "BSD-2-Clause-Darwin", + "seeAlso": [ + "https://github.com/file/file/blob/master/COPYING" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/BSD-2-Clause-first-lines.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-first-lines.json", + "referenceNumber": 245, + "name": "BSD 2-Clause - first lines requirement", + "licenseId": "BSD-2-Clause-first-lines", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L664-L690", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", - "referenceNumber": 570, + "referenceNumber": 192, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": [ @@ -752,7 +864,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", - "referenceNumber": 143, + "referenceNumber": 449, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": [ @@ -765,7 +877,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", - "referenceNumber": 99, + "referenceNumber": 612, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": [ @@ -777,7 +889,7 @@ "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", - "referenceNumber": 577, + "referenceNumber": 657, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": [ @@ -791,7 +903,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", - "referenceNumber": 179, + "referenceNumber": 216, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": [ @@ -801,11 +913,23 @@ "isOsiApproved": true, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/BSD-3-Clause-acpica.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-acpica.json", + "referenceNumber": 408, + "name": "BSD 3-Clause acpica variant", + "licenseId": "BSD-3-Clause-acpica", + "seeAlso": [ + "https://github.com/acpica/acpica/blob/master/source/common/acfileio.c#L119" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", - "referenceNumber": 213, + "referenceNumber": 14, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": [ @@ -817,7 +941,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", - "referenceNumber": 588, + "referenceNumber": 347, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": [ @@ -830,7 +954,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-flex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-flex.json", - "referenceNumber": 347, + "referenceNumber": 211, "name": "BSD 3-Clause Flex variant", "licenseId": "BSD-3-Clause-flex", "seeAlso": [ @@ -842,7 +966,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-HP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-HP.json", - "referenceNumber": 472, + "referenceNumber": 210, "name": "Hewlett-Packard BSD variant license", "licenseId": "BSD-3-Clause-HP", "seeAlso": [ @@ -854,7 +978,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", - "referenceNumber": 13, + "referenceNumber": 597, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": [ @@ -866,7 +990,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", - "referenceNumber": 108, + "referenceNumber": 364, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": [ @@ -878,7 +1002,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.json", - "referenceNumber": 272, + "referenceNumber": 30, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": [ @@ -891,11 +1015,11 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", - "referenceNumber": 110, + "referenceNumber": 21, "name": "BSD 3-Clause No Nuclear License", "licenseId": "BSD-3-Clause-No-Nuclear-License", "seeAlso": [ - "http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam\u003d1467140197_43d516ce1776bd08a58235a7785be1cc" + "http://download.oracle.com/otn-pub/java/licenses/bsd.txt" ], "isOsiApproved": false }, @@ -903,7 +1027,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", - "referenceNumber": 64, + "referenceNumber": 543, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": [ @@ -915,7 +1039,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", - "referenceNumber": 42, + "referenceNumber": 402, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": [ @@ -927,7 +1051,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", - "referenceNumber": 341, + "referenceNumber": 376, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": [ @@ -940,7 +1064,7 @@ "reference": "https://spdx.org/licenses/BSD-3-Clause-Sun.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Sun.json", - "referenceNumber": 141, + "referenceNumber": 554, "name": "BSD 3-Clause Sun Microsystems", "licenseId": "BSD-3-Clause-Sun", "seeAlso": [ @@ -952,7 +1076,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", - "referenceNumber": 575, + "referenceNumber": 650, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": [ @@ -965,7 +1089,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", - "referenceNumber": 180, + "referenceNumber": 252, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": [ @@ -977,7 +1101,7 @@ "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", - "referenceNumber": 306, + "referenceNumber": 117, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": [ @@ -989,7 +1113,7 @@ "reference": "https://spdx.org/licenses/BSD-4.3RENO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3RENO.json", - "referenceNumber": 539, + "referenceNumber": 298, "name": "BSD 4.3 RENO License", "licenseId": "BSD-4.3RENO", "seeAlso": [ @@ -1002,7 +1126,7 @@ "reference": "https://spdx.org/licenses/BSD-4.3TAHOE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3TAHOE.json", - "referenceNumber": 254, + "referenceNumber": 0, "name": "BSD 4.3 TAHOE License", "licenseId": "BSD-4.3TAHOE", "seeAlso": [ @@ -1015,7 +1139,7 @@ "reference": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.json", - "referenceNumber": 367, + "referenceNumber": 423, "name": "BSD Advertising Acknowledgement License", "licenseId": "BSD-Advertising-Acknowledgement", "seeAlso": [ @@ -1027,7 +1151,7 @@ "reference": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.json", - "referenceNumber": 358, + "referenceNumber": 171, "name": "BSD with Attribution and HPND disclaimer", "licenseId": "BSD-Attribution-HPND-disclaimer", "seeAlso": [ @@ -1039,7 +1163,7 @@ "reference": "https://spdx.org/licenses/BSD-Inferno-Nettverk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Inferno-Nettverk.json", - "referenceNumber": 336, + "referenceNumber": 401, "name": "BSD-Inferno-Nettverk", "licenseId": "BSD-Inferno-Nettverk", "seeAlso": [ @@ -1051,7 +1175,7 @@ "reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", - "referenceNumber": 449, + "referenceNumber": 403, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": [ @@ -1059,11 +1183,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/BSD-Source-beginning-file.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/BSD-Source-beginning-file.json", + "referenceNumber": 97, + "name": "BSD Source Code Attribution - beginning of file variant", + "licenseId": "BSD-Source-beginning-file", + "seeAlso": [ + "https://github.com/lattera/freebsd/blob/master/sys/cam/cam.c#L4" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", - "referenceNumber": 261, + "referenceNumber": 22, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": [ @@ -1075,7 +1211,7 @@ "reference": "https://spdx.org/licenses/BSD-Systemics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Systemics.json", - "referenceNumber": 451, + "referenceNumber": 178, "name": "Systemics BSD variant license", "licenseId": "BSD-Systemics", "seeAlso": [ @@ -1083,11 +1219,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/BSD-Systemics-W3Works.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/BSD-Systemics-W3Works.json", + "referenceNumber": 350, + "name": "Systemics W3Works BSD variant license", + "licenseId": "BSD-Systemics-W3Works", + "seeAlso": [ + "https://metacpan.org/release/DPARIS/Crypt-Blowfish-2.14/source/COPYRIGHT#L7" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", - "referenceNumber": 529, + "referenceNumber": 514, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": [ @@ -1101,7 +1249,7 @@ "reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", - "referenceNumber": 590, + "referenceNumber": 549, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": [ @@ -1113,7 +1261,7 @@ "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", - "referenceNumber": 371, + "referenceNumber": 419, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": [ @@ -1126,12 +1274,13 @@ "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", - "referenceNumber": 520, + "referenceNumber": 396, "name": "bzip2 and libbzip2 License v1.0.6", "licenseId": "bzip2-1.0.6", "seeAlso": [ "https://sourceware.org/git/?p\u003dbzip2.git;a\u003dblob;f\u003dLICENSE;hb\u003dbzip2-1.0.6", - "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" + "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html", + "https://sourceware.org/cgit/valgrind/tree/mpi/libmpiwrap.c" ], "isOsiApproved": false }, @@ -1139,7 +1288,7 @@ "reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", - "referenceNumber": 496, + "referenceNumber": 432, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": [ @@ -1152,7 +1301,7 @@ "reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", - "referenceNumber": 118, + "referenceNumber": 653, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": [ @@ -1165,7 +1314,7 @@ "reference": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", - "referenceNumber": 139, + "referenceNumber": 217, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": [ @@ -1178,7 +1327,7 @@ "reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", - "referenceNumber": 334, + "referenceNumber": 622, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": [ @@ -1186,11 +1335,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Caldera-no-preamble.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Caldera-no-preamble.json", + "referenceNumber": 585, + "name": "Caldera License (without preamble)", + "licenseId": "Caldera-no-preamble", + "seeAlso": [ + "https://github.com/apache/apr/blob/trunk/LICENSE#L298C6-L298C29" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/Catharon.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Catharon.json", + "referenceNumber": 45, + "name": "Catharon License", + "licenseId": "Catharon", + "seeAlso": [ + "https://github.com/scummvm/scummvm/blob/v2.8.0/LICENSES/CatharonLicense.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", - "referenceNumber": 38, + "referenceNumber": 193, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": [ @@ -1202,7 +1375,7 @@ "reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", - "referenceNumber": 342, + "referenceNumber": 37, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": [ @@ -1214,7 +1387,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", - "referenceNumber": 151, + "referenceNumber": 241, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": [ @@ -1226,7 +1399,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", - "referenceNumber": 562, + "referenceNumber": 129, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": [ @@ -1238,7 +1411,7 @@ "reference": "https://spdx.org/licenses/CC-BY-2.5-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5-AU.json", - "referenceNumber": 81, + "referenceNumber": 583, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": [ @@ -1250,7 +1423,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", - "referenceNumber": 381, + "referenceNumber": 302, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": [ @@ -1262,7 +1435,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AT.json", - "referenceNumber": 354, + "referenceNumber": 324, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": [ @@ -1270,11 +1443,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/CC-BY-3.0-AU.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AU.json", + "referenceNumber": 342, + "name": "Creative Commons Attribution 3.0 Australia", + "licenseId": "CC-BY-3.0-AU", + "seeAlso": [ + "https://creativecommons.org/licenses/by/3.0/au/legalcode" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/CC-BY-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-DE.json", - "referenceNumber": 329, + "referenceNumber": 239, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": [ @@ -1286,7 +1471,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-IGO.json", - "referenceNumber": 391, + "referenceNumber": 19, "name": "Creative Commons Attribution 3.0 IGO", "licenseId": "CC-BY-3.0-IGO", "seeAlso": [ @@ -1298,7 +1483,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-NL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-NL.json", - "referenceNumber": 35, + "referenceNumber": 501, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": [ @@ -1310,7 +1495,7 @@ "reference": "https://spdx.org/licenses/CC-BY-3.0-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-US.json", - "referenceNumber": 560, + "referenceNumber": 569, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": [ @@ -1322,7 +1507,7 @@ "reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", - "referenceNumber": 53, + "referenceNumber": 265, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": [ @@ -1335,7 +1520,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-1.0.json", - "referenceNumber": 500, + "referenceNumber": 167, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": [ @@ -1348,7 +1533,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.0.json", - "referenceNumber": 155, + "referenceNumber": 92, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": [ @@ -1361,7 +1546,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.5.json", - "referenceNumber": 440, + "referenceNumber": 253, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": [ @@ -1374,7 +1559,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0.json", - "referenceNumber": 250, + "referenceNumber": 199, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": [ @@ -1387,7 +1572,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.json", - "referenceNumber": 317, + "referenceNumber": 429, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": [ @@ -1399,7 +1584,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-4.0.json", - "referenceNumber": 349, + "referenceNumber": 188, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": [ @@ -1412,7 +1597,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.json", - "referenceNumber": 204, + "referenceNumber": 365, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": [ @@ -1424,7 +1609,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.json", - "referenceNumber": 130, + "referenceNumber": 416, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": [ @@ -1436,7 +1621,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.json", - "referenceNumber": 499, + "referenceNumber": 58, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": [ @@ -1448,7 +1633,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.json", - "referenceNumber": 72, + "referenceNumber": 213, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": [ @@ -1460,7 +1645,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.json", - "referenceNumber": 423, + "referenceNumber": 84, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": [ @@ -1472,7 +1657,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json", - "referenceNumber": 394, + "referenceNumber": 587, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": [ @@ -1484,7 +1669,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.json", - "referenceNumber": 445, + "referenceNumber": 296, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": [ @@ -1496,7 +1681,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.json", - "referenceNumber": 340, + "referenceNumber": 170, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": [ @@ -1508,7 +1693,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.json", - "referenceNumber": 376, + "referenceNumber": 484, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": [ @@ -1520,7 +1705,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-DE.json", - "referenceNumber": 40, + "referenceNumber": 184, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", "licenseId": "CC-BY-NC-SA-2.0-DE", "seeAlso": [ @@ -1532,7 +1717,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.json", - "referenceNumber": 28, + "referenceNumber": 116, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": [ @@ -1544,7 +1729,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.json", - "referenceNumber": 368, + "referenceNumber": 415, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": [ @@ -1556,7 +1741,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.json", - "referenceNumber": 429, + "referenceNumber": 106, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": [ @@ -1568,7 +1753,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.json", - "referenceNumber": 339, + "referenceNumber": 323, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": [ @@ -1580,7 +1765,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.json", - "referenceNumber": 462, + "referenceNumber": 150, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": [ @@ -1592,7 +1777,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.json", - "referenceNumber": 475, + "referenceNumber": 295, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": [ @@ -1604,7 +1789,7 @@ "reference": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.json", - "referenceNumber": 241, + "referenceNumber": 351, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": [ @@ -1616,7 +1801,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-1.0.json", - "referenceNumber": 550, + "referenceNumber": 56, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": [ @@ -1629,7 +1814,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.0.json", - "referenceNumber": 33, + "referenceNumber": 640, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": [ @@ -1642,7 +1827,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.5.json", - "referenceNumber": 2, + "referenceNumber": 276, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": [ @@ -1655,7 +1840,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0.json", - "referenceNumber": 80, + "referenceNumber": 173, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": [ @@ -1668,7 +1853,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.json", - "referenceNumber": 65, + "referenceNumber": 525, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": [ @@ -1680,7 +1865,7 @@ "reference": "https://spdx.org/licenses/CC-BY-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-4.0.json", - "referenceNumber": 228, + "referenceNumber": 328, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": [ @@ -1693,7 +1878,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-1.0.json", - "referenceNumber": 100, + "referenceNumber": 453, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": [ @@ -1705,7 +1890,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0.json", - "referenceNumber": 580, + "referenceNumber": 174, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": [ @@ -1717,7 +1902,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.json", - "referenceNumber": 212, + "referenceNumber": 387, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": [ @@ -1729,7 +1914,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.json", - "referenceNumber": 227, + "referenceNumber": 471, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": [ @@ -1741,7 +1926,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.5.json", - "referenceNumber": 55, + "referenceNumber": 461, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": [ @@ -1753,7 +1938,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0.json", - "referenceNumber": 315, + "referenceNumber": 621, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": [ @@ -1765,7 +1950,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.json", - "referenceNumber": 483, + "referenceNumber": 31, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": [ @@ -1777,7 +1962,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.json", - "referenceNumber": 54, + "referenceNumber": 325, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": [ @@ -1789,7 +1974,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-IGO.json", - "referenceNumber": 34, + "referenceNumber": 20, "name": "Creative Commons Attribution-ShareAlike 3.0 IGO", "licenseId": "CC-BY-SA-3.0-IGO", "seeAlso": [ @@ -1801,7 +1986,7 @@ "reference": "https://spdx.org/licenses/CC-BY-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-4.0.json", - "referenceNumber": 7, + "referenceNumber": 155, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": [ @@ -1814,7 +1999,7 @@ "reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", - "referenceNumber": 186, + "referenceNumber": 349, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": [ @@ -1826,7 +2011,7 @@ "reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", - "referenceNumber": 414, + "referenceNumber": 70, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": [ @@ -1839,7 +2024,7 @@ "reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", - "referenceNumber": 509, + "referenceNumber": 282, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": [ @@ -1852,7 +2037,7 @@ "reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", - "referenceNumber": 113, + "referenceNumber": 130, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": [ @@ -1865,7 +2050,7 @@ "reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", - "referenceNumber": 114, + "referenceNumber": 592, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": [ @@ -1879,7 +2064,7 @@ "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", - "referenceNumber": 474, + "referenceNumber": 551, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": [ @@ -1891,7 +2076,7 @@ "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", - "referenceNumber": 556, + "referenceNumber": 319, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": [ @@ -1903,7 +2088,7 @@ "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", - "referenceNumber": 380, + "referenceNumber": 445, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": [ @@ -1915,7 +2100,7 @@ "reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", - "referenceNumber": 128, + "referenceNumber": 219, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": [ @@ -1927,7 +2112,7 @@ "reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", - "referenceNumber": 405, + "referenceNumber": 38, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": [ @@ -1939,7 +2124,7 @@ "reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", - "referenceNumber": 77, + "referenceNumber": 73, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": [ @@ -1952,7 +2137,7 @@ "reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", - "referenceNumber": 447, + "referenceNumber": 393, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": [ @@ -1964,7 +2149,7 @@ "reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", - "referenceNumber": 450, + "referenceNumber": 354, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": [ @@ -1977,7 +2162,7 @@ "reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", - "referenceNumber": 415, + "referenceNumber": 271, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": [ @@ -1990,7 +2175,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", - "referenceNumber": 296, + "referenceNumber": 32, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": [ @@ -2002,7 +2187,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", - "referenceNumber": 61, + "referenceNumber": 95, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": [ @@ -2014,7 +2199,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-P-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-P-2.0.json", - "referenceNumber": 103, + "referenceNumber": 198, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": [ @@ -2026,7 +2211,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-S-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-S-2.0.json", - "referenceNumber": 67, + "referenceNumber": 370, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": [ @@ -2038,7 +2223,7 @@ "reference": "https://spdx.org/licenses/CERN-OHL-W-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-W-2.0.json", - "referenceNumber": 438, + "referenceNumber": 82, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": [ @@ -2050,7 +2235,7 @@ "reference": "https://spdx.org/licenses/CFITSIO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CFITSIO.json", - "referenceNumber": 30, + "referenceNumber": 96, "name": "CFITSIO License", "licenseId": "CFITSIO", "seeAlso": [ @@ -2063,7 +2248,7 @@ "reference": "https://spdx.org/licenses/check-cvs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/check-cvs.json", - "referenceNumber": 564, + "referenceNumber": 521, "name": "check-cvs License", "licenseId": "check-cvs", "seeAlso": [ @@ -2075,7 +2260,7 @@ "reference": "https://spdx.org/licenses/checkmk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/checkmk.json", - "referenceNumber": 240, + "referenceNumber": 272, "name": "Checkmk License", "licenseId": "checkmk", "seeAlso": [ @@ -2087,7 +2272,7 @@ "reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", - "referenceNumber": 49, + "referenceNumber": 66, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": [ @@ -2101,7 +2286,7 @@ "reference": "https://spdx.org/licenses/Clips.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Clips.json", - "referenceNumber": 92, + "referenceNumber": 450, "name": "Clips License", "licenseId": "Clips", "seeAlso": [ @@ -2113,7 +2298,7 @@ "reference": "https://spdx.org/licenses/CMU-Mach.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach.json", - "referenceNumber": 383, + "referenceNumber": 410, "name": "CMU Mach License", "licenseId": "CMU-Mach", "seeAlso": [ @@ -2121,11 +2306,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/CMU-Mach-nodoc.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/CMU-Mach-nodoc.json", + "referenceNumber": 111, + "name": "CMU Mach - no notices-in-documentation variant", + "licenseId": "CMU-Mach-nodoc", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L718-L728", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", - "referenceNumber": 541, + "referenceNumber": 509, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": [ @@ -2137,7 +2335,7 @@ "reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", - "referenceNumber": 388, + "referenceNumber": 611, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": [ @@ -2149,7 +2347,7 @@ "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", - "referenceNumber": 473, + "referenceNumber": 504, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": [ @@ -2161,7 +2359,7 @@ "reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", - "referenceNumber": 542, + "referenceNumber": 286, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": [ @@ -2173,7 +2371,7 @@ "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", - "referenceNumber": 218, + "referenceNumber": 631, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": [ @@ -2185,7 +2383,7 @@ "reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", - "referenceNumber": 563, + "referenceNumber": 251, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": [ @@ -2199,7 +2397,7 @@ "reference": "https://spdx.org/licenses/copyleft-next-0.3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.0.json", - "referenceNumber": 20, + "referenceNumber": 421, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": [ @@ -2211,7 +2409,7 @@ "reference": "https://spdx.org/licenses/copyleft-next-0.3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.1.json", - "referenceNumber": 284, + "referenceNumber": 119, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": [ @@ -2223,7 +2421,7 @@ "reference": "https://spdx.org/licenses/Cornell-Lossless-JPEG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cornell-Lossless-JPEG.json", - "referenceNumber": 277, + "referenceNumber": 632, "name": "Cornell Lossless JPEG License", "licenseId": "Cornell-Lossless-JPEG", "seeAlso": [ @@ -2237,7 +2435,7 @@ "reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", - "referenceNumber": 373, + "referenceNumber": 315, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": [ @@ -2250,7 +2448,7 @@ "reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", - "referenceNumber": 457, + "referenceNumber": 135, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": [ @@ -2263,7 +2461,7 @@ "reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", - "referenceNumber": 488, + "referenceNumber": 479, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": [ @@ -2276,7 +2474,7 @@ "reference": "https://spdx.org/licenses/Cronyx.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cronyx.json", - "referenceNumber": 120, + "referenceNumber": 377, "name": "Cronyx License", "licenseId": "Cronyx", "seeAlso": [ @@ -2291,7 +2489,7 @@ "reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", - "referenceNumber": 321, + "referenceNumber": 340, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": [ @@ -2303,7 +2501,7 @@ "reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", - "referenceNumber": 498, + "referenceNumber": 593, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": [ @@ -2315,7 +2513,7 @@ "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", - "referenceNumber": 216, + "referenceNumber": 553, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": [ @@ -2327,7 +2525,7 @@ "reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", - "referenceNumber": 460, + "referenceNumber": 404, "name": "Cube License", "licenseId": "Cube", "seeAlso": [ @@ -2339,7 +2537,7 @@ "reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", - "referenceNumber": 399, + "referenceNumber": 604, "name": "curl License", "licenseId": "curl", "seeAlso": [ @@ -2347,11 +2545,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/cve-tou.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/cve-tou.json", + "referenceNumber": 306, + "name": "Common Vulnerability Enumeration ToU License", + "licenseId": "cve-tou", + "seeAlso": [ + "https://www.cve.org/Legal/TermsOfUse" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/D-FSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", - "referenceNumber": 206, + "referenceNumber": 154, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": [ @@ -2366,11 +2576,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/DEC-3-Clause.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/DEC-3-Clause.json", + "referenceNumber": 15, + "name": "DEC 3-Clause License", + "licenseId": "DEC-3-Clause", + "seeAlso": [ + "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L239" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", - "referenceNumber": 220, + "referenceNumber": 292, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": [ @@ -2382,7 +2604,7 @@ "reference": "https://spdx.org/licenses/DL-DE-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-BY-2.0.json", - "referenceNumber": 516, + "referenceNumber": 225, "name": "Data licence Germany – attribution – version 2.0", "licenseId": "DL-DE-BY-2.0", "seeAlso": [ @@ -2394,7 +2616,7 @@ "reference": "https://spdx.org/licenses/DL-DE-ZERO-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-ZERO-2.0.json", - "referenceNumber": 178, + "referenceNumber": 341, "name": "Data licence Germany – zero – version 2.0", "licenseId": "DL-DE-ZERO-2.0", "seeAlso": [ @@ -2406,7 +2628,7 @@ "reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", - "referenceNumber": 68, + "referenceNumber": 397, "name": "DOC License", "licenseId": "DOC", "seeAlso": [ @@ -2419,7 +2641,7 @@ "reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", - "referenceNumber": 534, + "referenceNumber": 132, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": [ @@ -2431,7 +2653,7 @@ "reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", - "referenceNumber": 4, + "referenceNumber": 16, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": [ @@ -2439,11 +2661,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/DRL-1.1.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/DRL-1.1.json", + "referenceNumber": 278, + "name": "Detection Rule License 1.1", + "licenseId": "DRL-1.1", + "seeAlso": [ + "https://github.com/SigmaHQ/Detection-Rule-License/blob/6ec7fbde6101d101b5b5d1fcb8f9b69fbc76c04a/LICENSE.Detection.Rules.md" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", - "referenceNumber": 205, + "referenceNumber": 485, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": [ @@ -2455,11 +2689,12 @@ "reference": "https://spdx.org/licenses/dtoa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dtoa.json", - "referenceNumber": 561, + "referenceNumber": 358, "name": "David M. Gay dtoa License", "licenseId": "dtoa", "seeAlso": [ - "https://github.com/SWI-Prolog/swipl-devel/blob/master/src/os/dtoa.c" + "https://github.com/SWI-Prolog/swipl-devel/blob/master/src/os/dtoa.c", + "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/stdlib/mprec.h;hb\u003dHEAD" ], "isOsiApproved": false }, @@ -2467,7 +2702,7 @@ "reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", - "referenceNumber": 195, + "referenceNumber": 100, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": [ @@ -2479,7 +2714,7 @@ "reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", - "referenceNumber": 23, + "referenceNumber": 124, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": [ @@ -2491,7 +2726,7 @@ "reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", - "referenceNumber": 519, + "referenceNumber": 361, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": [ @@ -2504,7 +2739,7 @@ "reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", - "referenceNumber": 73, + "referenceNumber": 372, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": [ @@ -2517,7 +2752,7 @@ "reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", - "referenceNumber": 324, + "referenceNumber": 335, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": [ @@ -2530,7 +2765,7 @@ "reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", - "referenceNumber": 458, + "referenceNumber": 88, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": [ @@ -2544,7 +2779,7 @@ "reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", - "referenceNumber": 319, + "referenceNumber": 261, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": [ @@ -2557,7 +2792,7 @@ "reference": "https://spdx.org/licenses/Elastic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", - "referenceNumber": 551, + "referenceNumber": 147, "name": "Elastic License 2.0", "licenseId": "Elastic-2.0", "seeAlso": [ @@ -2570,7 +2805,7 @@ "reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", - "referenceNumber": 387, + "referenceNumber": 546, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": [ @@ -2582,7 +2817,7 @@ "reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", - "referenceNumber": 454, + "referenceNumber": 120, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": [ @@ -2594,7 +2829,7 @@ "reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", - "referenceNumber": 281, + "referenceNumber": 500, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": [ @@ -2608,7 +2843,7 @@ "reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", - "referenceNumber": 197, + "referenceNumber": 407, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": [ @@ -2622,7 +2857,7 @@ "reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", - "referenceNumber": 441, + "referenceNumber": 466, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": [ @@ -2634,7 +2869,7 @@ "reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", - "referenceNumber": 19, + "referenceNumber": 636, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": [ @@ -2647,7 +2882,7 @@ "reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", - "referenceNumber": 302, + "referenceNumber": 228, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": [ @@ -2661,7 +2896,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", - "referenceNumber": 168, + "referenceNumber": 227, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": [ @@ -2674,7 +2909,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", - "referenceNumber": 330, + "referenceNumber": 266, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": [ @@ -2689,7 +2924,7 @@ "reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", - "referenceNumber": 116, + "referenceNumber": 559, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": [ @@ -2707,7 +2942,7 @@ "reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", - "referenceNumber": 366, + "referenceNumber": 63, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": [ @@ -2719,11 +2954,11 @@ "reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", - "referenceNumber": 267, + "referenceNumber": 570, "name": "Fair License", "licenseId": "Fair", "seeAlso": [ - "http://fairlicense.org/", + "https://web.archive.org/web/20150926120323/http://fairlicense.org/", "https://opensource.org/licenses/Fair" ], "isOsiApproved": true @@ -2732,7 +2967,7 @@ "reference": "https://spdx.org/licenses/FBM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FBM.json", - "referenceNumber": 552, + "referenceNumber": 175, "name": "Fuzzy Bitmap License", "licenseId": "FBM", "seeAlso": [ @@ -2744,7 +2979,7 @@ "reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", - "referenceNumber": 124, + "referenceNumber": 49, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": [ @@ -2757,7 +2992,7 @@ "reference": "https://spdx.org/licenses/Ferguson-Twofish.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ferguson-Twofish.json", - "referenceNumber": 260, + "referenceNumber": 617, "name": "Ferguson Twofish License", "licenseId": "Ferguson-Twofish", "seeAlso": [ @@ -2769,7 +3004,7 @@ "reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", - "referenceNumber": 478, + "referenceNumber": 259, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": [ @@ -2781,7 +3016,7 @@ "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", - "referenceNumber": 422, + "referenceNumber": 333, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": [ @@ -2793,7 +3028,7 @@ "reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", - "referenceNumber": 60, + "referenceNumber": 181, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": [ @@ -2805,7 +3040,7 @@ "reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", - "referenceNumber": 543, + "referenceNumber": 36, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": [ @@ -2814,11 +3049,23 @@ "isOsiApproved": false, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/FSFAP-no-warranty-disclaimer.json", + "referenceNumber": 536, + "name": "FSF All Permissive License (without Warranty)", + "licenseId": "FSFAP-no-warranty-disclaimer", + "seeAlso": [ + "https://git.savannah.gnu.org/cgit/wget.git/tree/util/trunc.c?h\u003dv1.21.3\u0026id\u003d40747a11e44ced5a8ac628a41f879ced3e2ebce9#n6" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", - "referenceNumber": 36, + "referenceNumber": 454, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": [ @@ -2830,7 +3077,7 @@ "reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", - "referenceNumber": 52, + "referenceNumber": 422, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": [ @@ -2842,7 +3089,7 @@ "reference": "https://spdx.org/licenses/FSFULLRWD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", - "referenceNumber": 468, + "referenceNumber": 197, "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", "licenseId": "FSFULLRWD", "seeAlso": [ @@ -2854,7 +3101,7 @@ "reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", - "referenceNumber": 584, + "referenceNumber": 438, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": [ @@ -2869,7 +3116,7 @@ "reference": "https://spdx.org/licenses/Furuseth.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Furuseth.json", - "referenceNumber": 416, + "referenceNumber": 380, "name": "Furuseth License", "licenseId": "Furuseth", "seeAlso": [ @@ -2881,7 +3128,7 @@ "reference": "https://spdx.org/licenses/fwlw.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/fwlw.json", - "referenceNumber": 24, + "referenceNumber": 529, "name": "fwlw License", "licenseId": "fwlw", "seeAlso": [ @@ -2889,11 +3136,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/GCR-docs.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/GCR-docs.json", + "referenceNumber": 115, + "name": "Gnome GCR Documentation License", + "licenseId": "GCR-docs", + "seeAlso": [ + "https://github.com/GNOME/gcr/blob/master/docs/COPYING" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", - "referenceNumber": 243, + "referenceNumber": 291, "name": "GD License", "licenseId": "GD", "seeAlso": [ @@ -2905,7 +3164,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", - "referenceNumber": 337, + "referenceNumber": 589, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": [ @@ -2918,7 +3177,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-only.json", - "referenceNumber": 202, + "referenceNumber": 307, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": [ @@ -2930,7 +3189,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.json", - "referenceNumber": 356, + "referenceNumber": 98, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": [ @@ -2942,7 +3201,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.json", - "referenceNumber": 144, + "referenceNumber": 47, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": [ @@ -2954,7 +3213,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json", - "referenceNumber": 310, + "referenceNumber": 273, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": [ @@ -2966,7 +3225,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", - "referenceNumber": 291, + "referenceNumber": 626, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": [ @@ -2979,7 +3238,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-or-later.json", - "referenceNumber": 121, + "referenceNumber": 644, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": [ @@ -2992,7 +3251,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", - "referenceNumber": 431, + "referenceNumber": 520, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": [ @@ -3005,7 +3264,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-only.json", - "referenceNumber": 501, + "referenceNumber": 495, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": [ @@ -3017,7 +3276,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.json", - "referenceNumber": 238, + "referenceNumber": 6, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": [ @@ -3029,7 +3288,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.json", - "referenceNumber": 158, + "referenceNumber": 77, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": [ @@ -3041,7 +3300,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json", - "referenceNumber": 253, + "referenceNumber": 279, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": [ @@ -3053,7 +3312,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", - "referenceNumber": 71, + "referenceNumber": 648, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": [ @@ -3066,7 +3325,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.2-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-or-later.json", - "referenceNumber": 12, + "referenceNumber": 318, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": [ @@ -3079,7 +3338,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", - "referenceNumber": 574, + "referenceNumber": 287, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": [ @@ -3092,7 +3351,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-only.json", - "referenceNumber": 157, + "referenceNumber": 289, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": [ @@ -3104,7 +3363,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.json", - "referenceNumber": 29, + "referenceNumber": 497, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": [ @@ -3116,7 +3375,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.json", - "referenceNumber": 455, + "referenceNumber": 254, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": [ @@ -3128,7 +3387,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json", - "referenceNumber": 512, + "referenceNumber": 207, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": [ @@ -3140,7 +3399,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", - "referenceNumber": 439, + "referenceNumber": 635, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": [ @@ -3153,7 +3412,7 @@ "reference": "https://spdx.org/licenses/GFDL-1.3-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-or-later.json", - "referenceNumber": 295, + "referenceNumber": 448, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": [ @@ -3166,7 +3425,7 @@ "reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", - "referenceNumber": 255, + "referenceNumber": 172, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": [ @@ -3178,7 +3437,7 @@ "reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", - "referenceNumber": 69, + "referenceNumber": 434, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": [ @@ -3190,7 +3449,7 @@ "reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", - "referenceNumber": 578, + "referenceNumber": 189, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": [ @@ -3202,7 +3461,7 @@ "reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", - "referenceNumber": 265, + "referenceNumber": 85, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": [ @@ -3214,7 +3473,7 @@ "reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", - "referenceNumber": 107, + "referenceNumber": 190, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": [ @@ -3226,7 +3485,7 @@ "reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", - "referenceNumber": 230, + "referenceNumber": 110, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": [ @@ -3239,7 +3498,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", - "referenceNumber": 97, + "referenceNumber": 630, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": [ @@ -3251,7 +3510,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", - "referenceNumber": 175, + "referenceNumber": 26, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": [ @@ -3263,7 +3522,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", - "referenceNumber": 31, + "referenceNumber": 12, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": [ @@ -3275,7 +3534,7 @@ "reference": "https://spdx.org/licenses/GPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-or-later.json", - "referenceNumber": 269, + "referenceNumber": 642, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": [ @@ -3287,7 +3546,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", - "referenceNumber": 335, + "referenceNumber": 524, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": [ @@ -3301,7 +3560,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", - "referenceNumber": 44, + "referenceNumber": 25, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": [ @@ -3315,11 +3574,12 @@ "reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", - "referenceNumber": 87, + "referenceNumber": 618, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", + "https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, @@ -3329,7 +3589,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-or-later.json", - "referenceNumber": 538, + "referenceNumber": 164, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": [ @@ -3343,7 +3603,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", - "referenceNumber": 140, + "referenceNumber": 146, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": [ @@ -3355,7 +3615,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.json", - "referenceNumber": 280, + "referenceNumber": 374, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": [ @@ -3367,7 +3627,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", - "referenceNumber": 452, + "referenceNumber": 331, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": [ @@ -3379,7 +3639,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-font-exception.json", - "referenceNumber": 332, + "referenceNumber": 542, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": [ @@ -3391,7 +3651,7 @@ "reference": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", - "referenceNumber": 476, + "referenceNumber": 68, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": [ @@ -3403,7 +3663,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", - "referenceNumber": 15, + "referenceNumber": 442, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": [ @@ -3417,7 +3677,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", - "referenceNumber": 196, + "referenceNumber": 270, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": [ @@ -3431,7 +3691,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", - "referenceNumber": 314, + "referenceNumber": 133, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": [ @@ -3445,7 +3705,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-or-later.json", - "referenceNumber": 557, + "referenceNumber": 390, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": [ @@ -3459,7 +3719,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", - "referenceNumber": 184, + "referenceNumber": 458, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": [ @@ -3471,7 +3731,7 @@ "reference": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", - "referenceNumber": 491, + "referenceNumber": 356, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": [ @@ -3483,7 +3743,7 @@ "reference": "https://spdx.org/licenses/Graphics-Gems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Graphics-Gems.json", - "referenceNumber": 242, + "referenceNumber": 574, "name": "Graphics Gems License", "licenseId": "Graphics-Gems", "seeAlso": [ @@ -3495,7 +3755,7 @@ "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", - "referenceNumber": 596, + "referenceNumber": 655, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": [ @@ -3503,11 +3763,36 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/gtkbook.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/gtkbook.json", + "referenceNumber": 237, + "name": "gtkbook License", + "licenseId": "gtkbook", + "seeAlso": [ + "https://github.com/slogan621/gtkbook", + "https://github.com/oetiker/rrdtool-1.x/blob/master/src/plbasename.c#L8-L11" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/Gutmann.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Gutmann.json", + "referenceNumber": 441, + "name": "Gutmann License", + "licenseId": "Gutmann", + "seeAlso": [ + "https://www.cs.auckland.ac.nz/~pgut001/dumpasn1.c" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", - "referenceNumber": 581, + "referenceNumber": 625, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": [ @@ -3515,11 +3800,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/hdparm.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/hdparm.json", + "referenceNumber": 81, + "name": "hdparm License", + "licenseId": "hdparm", + "seeAlso": [ + "https://github.com/Distrotech/hdparm/blob/4517550db29a91420fb2b020349523b1b4512df2/LICENSE.TXT" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", - "referenceNumber": 586, + "referenceNumber": 299, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": [ @@ -3532,7 +3829,7 @@ "reference": "https://spdx.org/licenses/HP-1986.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1986.json", - "referenceNumber": 290, + "referenceNumber": 277, "name": "Hewlett-Packard 1986 License", "licenseId": "HP-1986", "seeAlso": [ @@ -3544,7 +3841,7 @@ "reference": "https://spdx.org/licenses/HP-1989.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1989.json", - "referenceNumber": 234, + "referenceNumber": 639, "name": "Hewlett-Packard 1989 License", "licenseId": "HP-1989", "seeAlso": [ @@ -3556,7 +3853,7 @@ "reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", - "referenceNumber": 323, + "referenceNumber": 281, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": [ @@ -3570,7 +3867,7 @@ "reference": "https://spdx.org/licenses/HPND-DEC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-DEC.json", - "referenceNumber": 289, + "referenceNumber": 577, "name": "Historical Permission Notice and Disclaimer - DEC variant", "licenseId": "HPND-DEC", "seeAlso": [ @@ -3582,7 +3879,7 @@ "reference": "https://spdx.org/licenses/HPND-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc.json", - "referenceNumber": 85, + "referenceNumber": 391, "name": "Historical Permission Notice and Disclaimer - documentation variant", "licenseId": "HPND-doc", "seeAlso": [ @@ -3595,7 +3892,7 @@ "reference": "https://spdx.org/licenses/HPND-doc-sell.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-doc-sell.json", - "referenceNumber": 232, + "referenceNumber": 163, "name": "Historical Permission Notice and Disclaimer - documentation sell variant", "licenseId": "HPND-doc-sell", "seeAlso": [ @@ -3608,7 +3905,7 @@ "reference": "https://spdx.org/licenses/HPND-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US.json", - "referenceNumber": 37, + "referenceNumber": 214, "name": "HPND with US Government export control warning", "licenseId": "HPND-export-US", "seeAlso": [ @@ -3616,11 +3913,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-export-US-acknowledgement.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-export-US-acknowledgement.json", + "referenceNumber": 610, + "name": "HPND with US Government export control warning and acknowledgment", + "licenseId": "HPND-export-US-acknowledgement", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L831-L852", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-export-US-modify.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US-modify.json", - "referenceNumber": 532, + "referenceNumber": 498, "name": "HPND with US Government export control warning and modification rqmt", "licenseId": "HPND-export-US-modify", "seeAlso": [ @@ -3629,11 +3939,73 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-export2-US.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-export2-US.json", + "referenceNumber": 33, + "name": "HPND with US Government export control and 2 disclaimers", + "licenseId": "HPND-export2-US", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L111-L133", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-Fenneberg-Livingston.json", + "referenceNumber": 145, + "name": "Historical Permission Notice and Disclaimer - Fenneberg-Livingston variant", + "licenseId": "HPND-Fenneberg-Livingston", + "seeAlso": [ + "https://github.com/FreeRADIUS/freeradius-client/blob/master/COPYRIGHT#L32", + "https://github.com/radcli/radcli/blob/master/COPYRIGHT#L34" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/HPND-INRIA-IMAG.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-INRIA-IMAG.json", + "referenceNumber": 614, + "name": "Historical Permission Notice and Disclaimer - INRIA-IMAG variant", + "licenseId": "HPND-INRIA-IMAG", + "seeAlso": [ + "https://github.com/ppp-project/ppp/blob/master/pppd/ipv6cp.c#L75-L83" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/HPND-Intel.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-Intel.json", + "referenceNumber": 195, + "name": "Historical Permission Notice and Disclaimer - Intel variant", + "licenseId": "HPND-Intel", + "seeAlso": [ + "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/machine/i960/memcpy.S;hb\u003dHEAD" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/HPND-Kevlin-Henney.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-Kevlin-Henney.json", + "referenceNumber": 428, + "name": "Historical Permission Notice and Disclaimer - Kevlin Henney variant", + "licenseId": "HPND-Kevlin-Henney", + "seeAlso": [ + "https://github.com/mruby/mruby/blob/83d12f8d52522cdb7c8cc46fad34821359f453e6/mrbgems/mruby-dir/src/Win/dirent.c#L127-L140" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-Markus-Kuhn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Markus-Kuhn.json", - "referenceNumber": 393, + "referenceNumber": 8, "name": "Historical Permission Notice and Disclaimer - Markus Kuhn variant", "licenseId": "HPND-Markus-Kuhn", "seeAlso": [ @@ -3642,11 +4014,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-merchantability-variant.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-merchantability-variant.json", + "referenceNumber": 540, + "name": "Historical Permission Notice and Disclaimer - merchantability variant", + "licenseId": "HPND-merchantability-variant", + "seeAlso": [ + "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/misc/fini.c;hb\u003dHEAD" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/HPND-MIT-disclaimer.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-MIT-disclaimer.json", + "referenceNumber": 185, + "name": "Historical Permission Notice and Disclaimer with MIT disclaimer", + "licenseId": "HPND-MIT-disclaimer", + "seeAlso": [ + "https://metacpan.org/release/NLNETLABS/Net-DNS-SEC-1.22/source/LICENSE" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-Pbmplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Pbmplus.json", - "referenceNumber": 504, + "referenceNumber": 603, "name": "Historical Permission Notice and Disclaimer - Pbmplus variant", "licenseId": "HPND-Pbmplus", "seeAlso": [ @@ -3654,11 +4050,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-sell-MIT-disclaimer-xserver.json", + "referenceNumber": 125, + "name": "Historical Permission Notice and Disclaimer - sell xserver variant with MIT disclaimer", + "licenseId": "HPND-sell-MIT-disclaimer-xserver", + "seeAlso": [ + "https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/COPYING?ref_type\u003dheads#L1781" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-sell-regexpr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-regexpr.json", - "referenceNumber": 461, + "referenceNumber": 633, "name": "Historical Permission Notice and Disclaimer - sell regexpr variant", "licenseId": "HPND-sell-regexpr", "seeAlso": [ @@ -3670,7 +4078,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", - "referenceNumber": 540, + "referenceNumber": 344, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": [ @@ -3682,7 +4090,7 @@ "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer.json", - "referenceNumber": 502, + "referenceNumber": 160, "name": "HPND sell variant with MIT disclaimer", "licenseId": "HPND-sell-variant-MIT-disclaimer", "seeAlso": [ @@ -3690,11 +4098,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant-MIT-disclaimer-rev.json", + "referenceNumber": 609, + "name": "HPND sell variant with MIT disclaimer - reverse", + "licenseId": "HPND-sell-variant-MIT-disclaimer-rev", + "seeAlso": [ + "https://github.com/sigmavirus24/x11-ssh-askpass/blob/master/dynlist.c" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HPND-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-UC.json", - "referenceNumber": 390, + "referenceNumber": 386, "name": "Historical Permission Notice and Disclaimer - University of California variant", "licenseId": "HPND-UC", "seeAlso": [ @@ -3702,11 +4122,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/HPND-UC-export-US.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/HPND-UC-export-US.json", + "referenceNumber": 118, + "name": "Historical Permission Notice and Disclaimer - University of California, US export warning", + "licenseId": "HPND-UC-export-US", + "seeAlso": [ + "https://github.com/RTimothyEdwards/magic/blob/master/LICENSE" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", - "referenceNumber": 252, + "referenceNumber": 134, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": [ @@ -3718,7 +4150,7 @@ "reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", - "referenceNumber": 583, + "referenceNumber": 102, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": [ @@ -3730,19 +4162,19 @@ "reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", - "referenceNumber": 192, + "referenceNumber": 67, "name": "ICU License", "licenseId": "ICU", "seeAlso": [ "http://source.icu-project.org/repos/icu/icu/trunk/license.html" ], - "isOsiApproved": false + "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/IEC-Code-Components-EULA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IEC-Code-Components-EULA.json", - "referenceNumber": 322, + "referenceNumber": 359, "name": "IEC Code Components End-user licence agreement", "licenseId": "IEC-Code-Components-EULA", "seeAlso": [ @@ -3756,7 +4188,7 @@ "reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", - "referenceNumber": 147, + "referenceNumber": 641, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": [ @@ -3769,7 +4201,7 @@ "reference": "https://spdx.org/licenses/IJG-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG-short.json", - "referenceNumber": 285, + "referenceNumber": 615, "name": "Independent JPEG Group License - short", "licenseId": "IJG-short", "seeAlso": [ @@ -3781,7 +4213,7 @@ "reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", - "referenceNumber": 5, + "referenceNumber": 478, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": [ @@ -3793,7 +4225,7 @@ "reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", - "referenceNumber": 493, + "referenceNumber": 327, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": [ @@ -3806,7 +4238,7 @@ "reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", - "referenceNumber": 166, + "referenceNumber": 169, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": [ @@ -3820,7 +4252,7 @@ "reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", - "referenceNumber": 535, + "referenceNumber": 269, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": [ @@ -3832,7 +4264,7 @@ "reference": "https://spdx.org/licenses/Inner-Net-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Inner-Net-2.0.json", - "referenceNumber": 401, + "referenceNumber": 572, "name": "Inner Net License v2.0", "licenseId": "Inner-Net-2.0", "seeAlso": [ @@ -3845,7 +4277,7 @@ "reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", - "referenceNumber": 432, + "referenceNumber": 623, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": [ @@ -3858,7 +4290,7 @@ "reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", - "referenceNumber": 102, + "referenceNumber": 571, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": [ @@ -3870,7 +4302,7 @@ "reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", - "referenceNumber": 593, + "referenceNumber": 654, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": [ @@ -3882,7 +4314,7 @@ "reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", - "referenceNumber": 351, + "referenceNumber": 94, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": [ @@ -3895,7 +4327,7 @@ "reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", - "referenceNumber": 406, + "referenceNumber": 332, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": [ @@ -3908,7 +4340,7 @@ "reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", - "referenceNumber": 201, + "referenceNumber": 488, "name": "ISC License", "licenseId": "ISC", "seeAlso": [ @@ -3919,11 +4351,25 @@ "isOsiApproved": true, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/ISC-Veillard.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/ISC-Veillard.json", + "referenceNumber": 513, + "name": "ISC Veillard variant", + "licenseId": "ISC-Veillard", + "seeAlso": [ + "https://raw.githubusercontent.com/GNOME/libxml2/4c2e7c651f6c2f0d1a74f350cbda95f7df3e7017/hash.c", + "https://github.com/GNOME/libxml2/blob/master/dict.c", + "https://sourceforge.net/p/ctrio/git/ci/master/tree/README" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Jam.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Jam.json", - "referenceNumber": 211, + "referenceNumber": 108, "name": "Jam License", "licenseId": "Jam", "seeAlso": [ @@ -3936,7 +4382,7 @@ "reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", - "referenceNumber": 417, + "referenceNumber": 487, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": [ @@ -3948,7 +4394,7 @@ "reference": "https://spdx.org/licenses/JPL-image.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPL-image.json", - "referenceNumber": 582, + "referenceNumber": 363, "name": "JPL Image Use Policy", "licenseId": "JPL-image", "seeAlso": [ @@ -3960,7 +4406,7 @@ "reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", - "referenceNumber": 26, + "referenceNumber": 83, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": [ @@ -3972,7 +4418,7 @@ "reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", - "referenceNumber": 239, + "referenceNumber": 65, "name": "JSON License", "licenseId": "JSON", "seeAlso": [ @@ -3985,7 +4431,7 @@ "reference": "https://spdx.org/licenses/Kastrup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kastrup.json", - "referenceNumber": 486, + "referenceNumber": 226, "name": "Kastrup License", "licenseId": "Kastrup", "seeAlso": [ @@ -3997,7 +4443,7 @@ "reference": "https://spdx.org/licenses/Kazlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kazlib.json", - "referenceNumber": 105, + "referenceNumber": 232, "name": "Kazlib License", "licenseId": "Kazlib", "seeAlso": [ @@ -4009,7 +4455,7 @@ "reference": "https://spdx.org/licenses/Knuth-CTAN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", - "referenceNumber": 132, + "referenceNumber": 290, "name": "Knuth CTAN License", "licenseId": "Knuth-CTAN", "seeAlso": [ @@ -4021,7 +4467,7 @@ "reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", - "referenceNumber": 397, + "referenceNumber": 165, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": [ @@ -4033,7 +4479,7 @@ "reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", - "referenceNumber": 531, + "referenceNumber": 600, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": [ @@ -4045,7 +4491,7 @@ "reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", - "referenceNumber": 511, + "referenceNumber": 439, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": [ @@ -4057,7 +4503,7 @@ "reference": "https://spdx.org/licenses/Latex2e-translated-notice.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e-translated-notice.json", - "referenceNumber": 567, + "referenceNumber": 620, "name": "Latex2e with translated notice permission", "licenseId": "Latex2e-translated-notice", "seeAlso": [ @@ -4069,7 +4515,7 @@ "reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", - "referenceNumber": 506, + "referenceNumber": 103, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": [ @@ -4081,7 +4527,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", - "referenceNumber": 59, + "referenceNumber": 353, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": [ @@ -4093,7 +4539,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", - "referenceNumber": 576, + "referenceNumber": 62, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": [ @@ -4105,7 +4551,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", - "referenceNumber": 385, + "referenceNumber": 519, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": [ @@ -4117,7 +4563,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-or-later.json", - "referenceNumber": 101, + "referenceNumber": 366, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": [ @@ -4129,7 +4575,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", - "referenceNumber": 363, + "referenceNumber": 656, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": [ @@ -4143,7 +4589,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", - "referenceNumber": 245, + "referenceNumber": 64, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": [ @@ -4157,7 +4603,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", - "referenceNumber": 182, + "referenceNumber": 177, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": [ @@ -4171,7 +4617,7 @@ "reference": "https://spdx.org/licenses/LGPL-2.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-or-later.json", - "referenceNumber": 484, + "referenceNumber": 24, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": [ @@ -4185,7 +4631,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", - "referenceNumber": 362, + "referenceNumber": 578, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": [ @@ -4200,7 +4646,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", - "referenceNumber": 573, + "referenceNumber": 233, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": [ @@ -4215,7 +4661,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", - "referenceNumber": 248, + "referenceNumber": 3, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": [ @@ -4230,7 +4676,7 @@ "reference": "https://spdx.org/licenses/LGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-or-later.json", - "referenceNumber": 418, + "referenceNumber": 262, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": [ @@ -4245,7 +4691,7 @@ "reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", - "referenceNumber": 549, + "referenceNumber": 477, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": [ @@ -4257,7 +4703,7 @@ "reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", - "referenceNumber": 419, + "referenceNumber": 186, "name": "libpng License", "licenseId": "Libpng", "seeAlso": [ @@ -4269,7 +4715,7 @@ "reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", - "referenceNumber": 293, + "referenceNumber": 257, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": [ @@ -4281,7 +4727,7 @@ "reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", - "referenceNumber": 353, + "referenceNumber": 556, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": [ @@ -4293,7 +4739,7 @@ "reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", - "referenceNumber": 313, + "referenceNumber": 392, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": [ @@ -4305,7 +4751,7 @@ "reference": "https://spdx.org/licenses/libutil-David-Nugent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", - "referenceNumber": 270, + "referenceNumber": 400, "name": "libutil David Nugent License", "licenseId": "libutil-David-Nugent", "seeAlso": [ @@ -4318,7 +4764,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", - "referenceNumber": 384, + "referenceNumber": 43, "name": "Licence Libre du Québec – Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": [ @@ -4331,7 +4777,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", - "referenceNumber": 375, + "referenceNumber": 74, "name": "Licence Libre du Québec – Réciprocité version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": [ @@ -4344,7 +4790,7 @@ "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", - "referenceNumber": 98, + "referenceNumber": 40, "name": "Licence Libre du Québec – Réciprocité forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": [ @@ -4357,7 +4803,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-1-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-1-para.json", - "referenceNumber": 189, + "referenceNumber": 339, "name": "Linux man-pages - 1 paragraph", "licenseId": "Linux-man-pages-1-para", "seeAlso": [ @@ -4369,7 +4815,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", - "referenceNumber": 199, + "referenceNumber": 590, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": [ @@ -4381,7 +4827,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-2-para.json", - "referenceNumber": 135, + "referenceNumber": 86, "name": "Linux man-pages Copyleft - 2 paragraphs", "licenseId": "Linux-man-pages-copyleft-2-para", "seeAlso": [ @@ -4394,7 +4840,7 @@ "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft-var.json", - "referenceNumber": 420, + "referenceNumber": 337, "name": "Linux man-pages Copyleft Variant", "licenseId": "Linux-man-pages-copyleft-var", "seeAlso": [ @@ -4406,7 +4852,7 @@ "reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", - "referenceNumber": 378, + "referenceNumber": 613, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": [ @@ -4418,7 +4864,7 @@ "reference": "https://spdx.org/licenses/LOOP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LOOP.json", - "referenceNumber": 379, + "referenceNumber": 607, "name": "Common Lisp LOOP License", "licenseId": "LOOP", "seeAlso": [ @@ -4431,11 +4877,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/LPD-document.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/LPD-document.json", + "referenceNumber": 522, + "name": "LPD Documentation License", + "licenseId": "LPD-document", + "seeAlso": [ + "https://github.com/Cyan4973/xxHash/blob/dev/doc/xxhash_spec.md", + "https://www.ietf.org/rfc/rfc1952.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", - "referenceNumber": 544, + "referenceNumber": 196, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": [ @@ -4447,7 +4906,7 @@ "reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", - "referenceNumber": 407, + "referenceNumber": 69, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": [ @@ -4461,7 +4920,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", - "referenceNumber": 58, + "referenceNumber": 215, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": [ @@ -4473,7 +4932,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", - "referenceNumber": 360, + "referenceNumber": 114, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": [ @@ -4485,7 +4944,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", - "referenceNumber": 156, + "referenceNumber": 435, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": [ @@ -4498,7 +4957,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", - "referenceNumber": 553, + "referenceNumber": 18, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": [ @@ -4511,7 +4970,7 @@ "reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", - "referenceNumber": 514, + "referenceNumber": 240, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": [ @@ -4524,7 +4983,7 @@ "reference": "https://spdx.org/licenses/lsof.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/lsof.json", - "referenceNumber": 162, + "referenceNumber": 605, "name": "lsof License", "licenseId": "lsof", "seeAlso": [ @@ -4536,7 +4995,7 @@ "reference": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Lucida-Bitmap-Fonts.json", - "referenceNumber": 214, + "referenceNumber": 399, "name": "Lucida Bitmap Fonts License", "licenseId": "Lucida-Bitmap-Fonts", "seeAlso": [ @@ -4548,7 +5007,7 @@ "reference": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.json", - "referenceNumber": 89, + "referenceNumber": 430, "name": "LZMA SDK License (versions 9.11 to 9.20)", "licenseId": "LZMA-SDK-9.11-to-9.20", "seeAlso": [ @@ -4561,7 +5020,7 @@ "reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", - "referenceNumber": 63, + "referenceNumber": 244, "name": "LZMA SDK License (versions 9.22 and beyond)", "licenseId": "LZMA-SDK-9.22", "seeAlso": [ @@ -4570,11 +5029,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Mackerras-3-Clause.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause.json", + "referenceNumber": 59, + "name": "Mackerras 3-Clause License", + "licenseId": "Mackerras-3-Clause", + "seeAlso": [ + "https://github.com/ppp-project/ppp/blob/master/pppd/chap_ms.c#L6-L28" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Mackerras-3-Clause-acknowledgment.json", + "referenceNumber": 598, + "name": "Mackerras 3-Clause - acknowledgment variant", + "licenseId": "Mackerras-3-Clause-acknowledgment", + "seeAlso": [ + "https://github.com/ppp-project/ppp/blob/master/pppd/auth.c#L6-L28" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/magaz.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/magaz.json", - "referenceNumber": 442, + "referenceNumber": 516, "name": "magaz License", "licenseId": "magaz", "seeAlso": [ @@ -4582,11 +5065,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/mailprio.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/mailprio.json", + "referenceNumber": 179, + "name": "mailprio License", + "licenseId": "mailprio", + "seeAlso": [ + "https://fossies.org/linux/sendmail/contrib/mailprio" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", - "referenceNumber": 142, + "referenceNumber": 206, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": [ @@ -4598,7 +5093,7 @@ "reference": "https://spdx.org/licenses/Martin-Birgmeier.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Martin-Birgmeier.json", - "referenceNumber": 482, + "referenceNumber": 535, "name": "Martin Birgmeier License", "licenseId": "Martin-Birgmeier", "seeAlso": [ @@ -4610,7 +5105,7 @@ "reference": "https://spdx.org/licenses/McPhee-slideshow.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/McPhee-slideshow.json", - "referenceNumber": 9, + "referenceNumber": 492, "name": "McPhee Slideshow License", "licenseId": "McPhee-slideshow", "seeAlso": [ @@ -4622,7 +5117,7 @@ "reference": "https://spdx.org/licenses/metamail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/metamail.json", - "referenceNumber": 165, + "referenceNumber": 437, "name": "metamail License", "licenseId": "metamail", "seeAlso": [ @@ -4634,7 +5129,7 @@ "reference": "https://spdx.org/licenses/Minpack.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Minpack.json", - "referenceNumber": 364, + "referenceNumber": 512, "name": "Minpack License", "licenseId": "Minpack", "seeAlso": [ @@ -4647,7 +5142,7 @@ "reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", - "referenceNumber": 308, + "referenceNumber": 183, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": [ @@ -4659,11 +5154,11 @@ "reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", - "referenceNumber": 246, + "referenceNumber": 608, "name": "MIT License", "licenseId": "MIT", "seeAlso": [ - "https://opensource.org/licenses/MIT" + "https://opensource.org/license/mit/" ], "isOsiApproved": true, "isFsfLibre": true @@ -4672,7 +5167,7 @@ "reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", - "referenceNumber": 185, + "referenceNumber": 395, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": [ @@ -4686,7 +5181,7 @@ "reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", - "referenceNumber": 78, + "referenceNumber": 293, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": [ @@ -4698,7 +5193,7 @@ "reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", - "referenceNumber": 346, + "referenceNumber": 575, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": [ @@ -4711,7 +5206,7 @@ "reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", - "referenceNumber": 10, + "referenceNumber": 638, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": [ @@ -4723,7 +5218,7 @@ "reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", - "referenceNumber": 274, + "referenceNumber": 53, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": [ @@ -4735,7 +5230,7 @@ "reference": "https://spdx.org/licenses/MIT-Festival.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Festival.json", - "referenceNumber": 494, + "referenceNumber": 317, "name": "MIT Festival Variant", "licenseId": "MIT-Festival", "seeAlso": [ @@ -4744,11 +5239,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/MIT-Khronos-old.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/MIT-Khronos-old.json", + "referenceNumber": 249, + "name": "MIT Khronos - old variant", + "licenseId": "MIT-Khronos-old", + "seeAlso": [ + "https://github.com/KhronosGroup/SPIRV-Cross/blob/main/LICENSES/LicenseRef-KhronosFreeUse.txt" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", - "referenceNumber": 467, + "referenceNumber": 424, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": [ @@ -4762,7 +5269,7 @@ "reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", - "referenceNumber": 492, + "referenceNumber": 283, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": [ @@ -4777,7 +5284,7 @@ "reference": "https://spdx.org/licenses/MIT-testregex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-testregex.json", - "referenceNumber": 133, + "referenceNumber": 427, "name": "MIT testregex Variant", "licenseId": "MIT-testregex", "seeAlso": [ @@ -4789,7 +5296,7 @@ "reference": "https://spdx.org/licenses/MIT-Wu.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Wu.json", - "referenceNumber": 229, + "referenceNumber": 459, "name": "MIT Tom Wu Variant", "licenseId": "MIT-Wu", "seeAlso": [ @@ -4801,7 +5308,7 @@ "reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", - "referenceNumber": 164, + "referenceNumber": 157, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": [ @@ -4813,7 +5320,7 @@ "reference": "https://spdx.org/licenses/MMIXware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MMIXware.json", - "referenceNumber": 326, + "referenceNumber": 474, "name": "MMIXware License", "licenseId": "MMIXware", "seeAlso": [ @@ -4825,7 +5332,7 @@ "reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", - "referenceNumber": 333, + "referenceNumber": 627, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": [ @@ -4837,7 +5344,7 @@ "reference": "https://spdx.org/licenses/MPEG-SSG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPEG-SSG.json", - "referenceNumber": 56, + "referenceNumber": 417, "name": "MPEG Software Simulation", "licenseId": "MPEG-SSG", "seeAlso": [ @@ -4849,7 +5356,7 @@ "reference": "https://spdx.org/licenses/mpi-permissive.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", - "referenceNumber": 565, + "referenceNumber": 80, "name": "mpi Permissive License", "licenseId": "mpi-permissive", "seeAlso": [ @@ -4861,7 +5368,7 @@ "reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", - "referenceNumber": 6, + "referenceNumber": 482, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": [ @@ -4873,7 +5380,7 @@ "reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", - "referenceNumber": 17, + "referenceNumber": 28, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": [ @@ -4886,7 +5393,7 @@ "reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", - "referenceNumber": 256, + "referenceNumber": 619, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": [ @@ -4900,7 +5407,7 @@ "reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", - "referenceNumber": 487, + "referenceNumber": 263, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": [ @@ -4914,7 +5421,7 @@ "reference": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", - "referenceNumber": 50, + "referenceNumber": 455, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": [ @@ -4927,7 +5434,7 @@ "reference": "https://spdx.org/licenses/mplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mplus.json", - "referenceNumber": 22, + "referenceNumber": 541, "name": "mplus Font License", "licenseId": "mplus", "seeAlso": [ @@ -4939,7 +5446,7 @@ "reference": "https://spdx.org/licenses/MS-LPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", - "referenceNumber": 236, + "referenceNumber": 528, "name": "Microsoft Limited Public License", "licenseId": "MS-LPL", "seeAlso": [ @@ -4953,7 +5460,7 @@ "reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", - "referenceNumber": 503, + "referenceNumber": 499, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": [ @@ -4967,7 +5474,7 @@ "reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", - "referenceNumber": 395, + "referenceNumber": 343, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": [ @@ -4981,7 +5488,7 @@ "reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", - "referenceNumber": 392, + "referenceNumber": 137, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": [ @@ -4993,7 +5500,7 @@ "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", - "referenceNumber": 209, + "referenceNumber": 107, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": [ @@ -5006,11 +5513,11 @@ "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", - "referenceNumber": 304, + "referenceNumber": 490, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": [ - "https://license.coscl.org.cn/MulanPSL2/" + "https://license.coscl.org.cn/MulanPSL2" ], "isOsiApproved": true }, @@ -5018,7 +5525,7 @@ "reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", - "referenceNumber": 572, + "referenceNumber": 573, "name": "Multics License", "licenseId": "Multics", "seeAlso": [ @@ -5030,7 +5537,7 @@ "reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", - "referenceNumber": 150, + "referenceNumber": 440, "name": "Mup License", "licenseId": "Mup", "seeAlso": [ @@ -5042,7 +5549,7 @@ "reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", - "referenceNumber": 82, + "referenceNumber": 104, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": [ @@ -5055,7 +5562,7 @@ "reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", - "referenceNumber": 146, + "referenceNumber": 127, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": [ @@ -5069,7 +5576,7 @@ "reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", - "referenceNumber": 225, + "referenceNumber": 128, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": [ @@ -5081,7 +5588,7 @@ "reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", - "referenceNumber": 83, + "referenceNumber": 41, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": [ @@ -5089,15 +5596,43 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/NCBI-PD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/NCBI-PD.json", + "referenceNumber": 362, + "name": "NCBI Public Domain Notice", + "licenseId": "NCBI-PD", + "seeAlso": [ + "https://github.com/ncbi/sra-tools/blob/e8e5b6af4edc460156ad9ce5902d0779cffbf685/LICENSE", + "https://github.com/ncbi/datasets/blob/0ea4cd16b61e5b799d9cc55aecfa016d6c9bd2bf/LICENSE.md", + "https://github.com/ncbi/gprobe/blob/de64d30fee8b4c4013094d7d3139ea89b5dd1ace/LICENSE", + "https://github.com/ncbi/egapx/blob/08930b9dec0c69b2d1a05e5153c7b95ef0a3eb0f/LICENSE", + "https://github.com/ncbi/datasets/blob/master/LICENSE.md" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", - "referenceNumber": 469, + "referenceNumber": 320, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": [ - "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" + "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/NCL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/NCL.json", + "referenceNumber": 153, + "name": "NCL Source Code License", + "licenseId": "NCL", + "seeAlso": [ + "https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/modules/module-filter-chain/pffft.c?ref_type\u003dheads#L1-52" ], "isOsiApproved": false }, @@ -5105,7 +5640,7 @@ "reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", - "referenceNumber": 413, + "referenceNumber": 557, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": [ @@ -5119,7 +5654,7 @@ "reference": "https://spdx.org/licenses/Net-SNMP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", - "referenceNumber": 428, + "referenceNumber": 234, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": [ @@ -5131,7 +5666,7 @@ "reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", - "referenceNumber": 558, + "referenceNumber": 503, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": [ @@ -5143,7 +5678,7 @@ "reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", - "referenceNumber": 305, + "referenceNumber": 412, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": [ @@ -5155,7 +5690,7 @@ "reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", - "referenceNumber": 411, + "referenceNumber": 275, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": [ @@ -5167,7 +5702,7 @@ "reference": "https://spdx.org/licenses/NICTA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", - "referenceNumber": 95, + "referenceNumber": 311, "name": "NICTA Public Software License, Version 1.0", "licenseId": "NICTA-1.0", "seeAlso": [ @@ -5179,7 +5714,7 @@ "reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", - "referenceNumber": 537, + "referenceNumber": 309, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": [ @@ -5192,7 +5727,7 @@ "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", - "referenceNumber": 424, + "referenceNumber": 34, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": [ @@ -5205,7 +5740,7 @@ "reference": "https://spdx.org/licenses/NIST-Software.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-Software.json", - "referenceNumber": 547, + "referenceNumber": 76, "name": "NIST Software License", "licenseId": "NIST-Software", "seeAlso": [ @@ -5217,7 +5752,7 @@ "reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", - "referenceNumber": 409, + "referenceNumber": 565, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": [ @@ -5229,7 +5764,7 @@ "reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", - "referenceNumber": 464, + "referenceNumber": 483, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": [ @@ -5241,7 +5776,7 @@ "reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", - "referenceNumber": 21, + "referenceNumber": 71, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": [ @@ -5253,7 +5788,7 @@ "reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", - "referenceNumber": 276, + "referenceNumber": 44, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": [ @@ -5266,7 +5801,7 @@ "reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", - "referenceNumber": 1, + "referenceNumber": 126, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": [ @@ -5279,7 +5814,7 @@ "reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", - "referenceNumber": 149, + "referenceNumber": 534, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": [ @@ -5291,7 +5826,7 @@ "reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", - "referenceNumber": 318, + "referenceNumber": 346, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": [ @@ -5304,7 +5839,7 @@ "reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", - "referenceNumber": 459, + "referenceNumber": 418, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": [ @@ -5317,7 +5852,7 @@ "reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", - "referenceNumber": 597, + "referenceNumber": 579, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": [ @@ -5329,7 +5864,7 @@ "reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", - "referenceNumber": 299, + "referenceNumber": 230, "name": "NRL License", "licenseId": "NRL", "seeAlso": [ @@ -5341,7 +5876,7 @@ "reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", - "referenceNumber": 210, + "referenceNumber": 547, "name": "NTP License", "licenseId": "NTP", "seeAlso": [ @@ -5353,7 +5888,7 @@ "reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", - "referenceNumber": 470, + "referenceNumber": 460, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": [ @@ -5365,7 +5900,7 @@ "reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", - "referenceNumber": 303, + "referenceNumber": 634, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": [ @@ -5378,7 +5913,7 @@ "reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", - "referenceNumber": 3, + "referenceNumber": 191, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": [ @@ -5387,11 +5922,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/OAR.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/OAR.json", + "referenceNumber": 4, + "name": "OAR License", + "licenseId": "OAR", + "seeAlso": [ + "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/string/strsignal.c;hb\u003dHEAD#l35" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", - "referenceNumber": 247, + "referenceNumber": 596, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": [ @@ -5403,7 +5950,7 @@ "reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", - "referenceNumber": 235, + "referenceNumber": 308, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": [ @@ -5416,7 +5963,7 @@ "reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", - "referenceNumber": 348, + "referenceNumber": 243, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": [ @@ -5430,7 +5977,7 @@ "reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", - "referenceNumber": 152, + "referenceNumber": 7, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": [ @@ -5442,7 +5989,7 @@ "reference": "https://spdx.org/licenses/OFFIS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFFIS.json", - "referenceNumber": 510, + "referenceNumber": 238, "name": "OFFIS License", "licenseId": "OFFIS", "seeAlso": [ @@ -5454,7 +6001,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", - "referenceNumber": 159, + "referenceNumber": 475, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": [ @@ -5467,7 +6014,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-no-RFN.json", - "referenceNumber": 74, + "referenceNumber": 23, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": [ @@ -5479,7 +6026,7 @@ "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", - "referenceNumber": 14, + "referenceNumber": 11, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": [ @@ -5491,7 +6038,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", - "referenceNumber": 505, + "referenceNumber": 248, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": [ @@ -5505,7 +6052,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-no-RFN.json", - "referenceNumber": 200, + "referenceNumber": 550, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": [ @@ -5518,7 +6065,7 @@ "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", - "referenceNumber": 127, + "referenceNumber": 507, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": [ @@ -5531,7 +6078,7 @@ "reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", - "referenceNumber": 389, + "referenceNumber": 166, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": [ @@ -5543,7 +6090,7 @@ "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", - "referenceNumber": 257, + "referenceNumber": 468, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": [ @@ -5555,7 +6102,7 @@ "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", - "referenceNumber": 301, + "referenceNumber": 464, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": [ @@ -5567,7 +6114,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", - "referenceNumber": 41, + "referenceNumber": 489, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": [ @@ -5579,7 +6126,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", - "referenceNumber": 448, + "referenceNumber": 467, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": [ @@ -5591,7 +6138,7 @@ "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", - "referenceNumber": 361, + "referenceNumber": 151, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": [ @@ -5603,7 +6150,7 @@ "reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", - "referenceNumber": 435, + "referenceNumber": 367, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": [ @@ -5616,7 +6163,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", - "referenceNumber": 94, + "referenceNumber": 180, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": [ @@ -5628,7 +6175,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", - "referenceNumber": 400, + "referenceNumber": 229, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": [ @@ -5640,7 +6187,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", - "referenceNumber": 198, + "referenceNumber": 224, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": [ @@ -5652,7 +6199,7 @@ "reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", - "referenceNumber": 325, + "referenceNumber": 255, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": [ @@ -5664,7 +6211,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", - "referenceNumber": 219, + "referenceNumber": 208, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": [ @@ -5676,7 +6223,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", - "referenceNumber": 136, + "referenceNumber": 79, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": [ @@ -5688,7 +6235,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", - "referenceNumber": 264, + "referenceNumber": 360, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": [ @@ -5700,7 +6247,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", - "referenceNumber": 109, + "referenceNumber": 316, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": [ @@ -5712,7 +6259,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", - "referenceNumber": 398, + "referenceNumber": 426, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": [ @@ -5724,7 +6271,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", - "referenceNumber": 421, + "referenceNumber": 384, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": [ @@ -5736,7 +6283,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", - "referenceNumber": 592, + "referenceNumber": 381, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": [ @@ -5749,7 +6296,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", - "referenceNumber": 382, + "referenceNumber": 93, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": [ @@ -5761,7 +6308,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", - "referenceNumber": 594, + "referenceNumber": 651, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": [ @@ -5773,7 +6320,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", - "referenceNumber": 90, + "referenceNumber": 568, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": [ @@ -5785,7 +6332,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", - "referenceNumber": 258, + "referenceNumber": 220, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": [ @@ -5798,7 +6345,7 @@ "reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", - "referenceNumber": 190, + "referenceNumber": 5, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": [ @@ -5810,7 +6357,7 @@ "reference": "https://spdx.org/licenses/OLFL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLFL-1.3.json", - "referenceNumber": 545, + "referenceNumber": 142, "name": "Open Logistics Foundation License Version 1.3", "licenseId": "OLFL-1.3", "seeAlso": [ @@ -5823,7 +6370,7 @@ "reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", - "referenceNumber": 191, + "referenceNumber": 375, "name": "Open Market License", "licenseId": "OML", "seeAlso": [ @@ -5835,7 +6382,7 @@ "reference": "https://spdx.org/licenses/OpenPBS-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenPBS-2.3.json", - "referenceNumber": 327, + "referenceNumber": 314, "name": "OpenPBS v2.3 Software License", "licenseId": "OpenPBS-2.3", "seeAlso": [ @@ -5848,7 +6395,7 @@ "reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", - "referenceNumber": 48, + "referenceNumber": 303, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": [ @@ -5857,11 +6404,38 @@ "isOsiApproved": false, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/OpenSSL-standalone.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/OpenSSL-standalone.json", + "referenceNumber": 602, + "name": "OpenSSL License - standalone", + "licenseId": "OpenSSL-standalone", + "seeAlso": [ + "https://library.netapp.com/ecm/ecm_download_file/ECMP1196395", + "https://hstechdocs.helpsystems.com/manuals/globalscape/archive/cuteftp6/open_ssl_license_agreement.htm" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/OpenVision.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/OpenVision.json", + "referenceNumber": 588, + "name": "OpenVision License", + "licenseId": "OpenVision", + "seeAlso": [ + "https://github.com/krb5/krb5/blob/krb5-1.21.2-final/NOTICE#L66-L98", + "https://web.mit.edu/kerberos/krb5-1.21/doc/mitK5license.html", + "https://fedoraproject.org/wiki/Licensing:MIT#OpenVision_Variant" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", - "referenceNumber": 477, + "referenceNumber": 91, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": [ @@ -5875,7 +6449,7 @@ "reference": "https://spdx.org/licenses/OPL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-UK-3.0.json", - "referenceNumber": 119, + "referenceNumber": 480, "name": "United Kingdom Open Parliament Licence v3.0", "licenseId": "OPL-UK-3.0", "seeAlso": [ @@ -5887,7 +6461,7 @@ "reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", - "referenceNumber": 579, + "referenceNumber": 329, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": [ @@ -5901,7 +6475,7 @@ "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", - "referenceNumber": 115, + "referenceNumber": 517, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": [ @@ -5914,7 +6488,7 @@ "reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", - "referenceNumber": 453, + "referenceNumber": 162, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": [ @@ -5927,7 +6501,7 @@ "reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", - "referenceNumber": 279, + "referenceNumber": 586, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": [ @@ -5940,7 +6514,7 @@ "reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", - "referenceNumber": 86, + "referenceNumber": 531, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": [ @@ -5953,7 +6527,7 @@ "reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", - "referenceNumber": 11, + "referenceNumber": 138, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": [ @@ -5967,7 +6541,7 @@ "reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", - "referenceNumber": 134, + "referenceNumber": 300, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": [ @@ -5981,7 +6555,7 @@ "reference": "https://spdx.org/licenses/PADL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PADL.json", - "referenceNumber": 344, + "referenceNumber": 113, "name": "PADL License", "licenseId": "PADL", "seeAlso": [ @@ -5993,7 +6567,7 @@ "reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", - "referenceNumber": 183, + "referenceNumber": 246, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": [ @@ -6005,7 +6579,7 @@ "reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", - "referenceNumber": 91, + "referenceNumber": 212, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": [ @@ -6017,7 +6591,7 @@ "reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", - "referenceNumber": 436, + "referenceNumber": 493, "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", "licenseId": "PDDL-1.0", "seeAlso": [ @@ -6030,7 +6604,7 @@ "reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", - "referenceNumber": 522, + "referenceNumber": 584, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": [ @@ -6043,7 +6617,7 @@ "reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", - "referenceNumber": 343, + "referenceNumber": 538, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": [ @@ -6052,11 +6626,37 @@ "isOsiApproved": true, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/Pixar.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Pixar.json", + "referenceNumber": 204, + "name": "Pixar License", + "licenseId": "Pixar", + "seeAlso": [ + "https://github.com/PixarAnimationStudios/OpenSubdiv/raw/v3_5_0/LICENSE.txt", + "https://graphics.pixar.com/opensubdiv/docs/license.html", + "https://github.com/PixarAnimationStudios/OpenSubdiv/blob/v3_5_0/opensubdiv/version.cpp#L2-L22" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/pkgconf.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/pkgconf.json", + "referenceNumber": 389, + "name": "pkgconf License", + "licenseId": "pkgconf", + "seeAlso": [ + "https://github.com/pkgconf/pkgconf/blob/master/cli/main.c#L8" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", - "referenceNumber": 286, + "referenceNumber": 141, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": [ @@ -6068,7 +6668,7 @@ "reference": "https://spdx.org/licenses/pnmstitch.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/pnmstitch.json", - "referenceNumber": 372, + "referenceNumber": 158, "name": "pnmstitch License", "licenseId": "pnmstitch", "seeAlso": [ @@ -6080,7 +6680,7 @@ "reference": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", - "referenceNumber": 320, + "referenceNumber": 54, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": [ @@ -6092,7 +6692,7 @@ "reference": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", - "referenceNumber": 307, + "referenceNumber": 594, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": [ @@ -6104,7 +6704,7 @@ "reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", - "referenceNumber": 266, + "referenceNumber": 643, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": [ @@ -6113,11 +6713,25 @@ ], "isOsiApproved": true }, + { + "reference": "https://spdx.org/licenses/PPL.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/PPL.json", + "referenceNumber": 580, + "name": "Peer Production License", + "licenseId": "PPL", + "seeAlso": [ + "https://wiki.p2pfoundation.net/Peer_Production_License", + "http://www.networkcultures.org/_uploads/%233notebook_telekommunist.pdf" + ], + "isOsiApproved": false, + "isFsfLibre": false + }, { "reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", - "referenceNumber": 112, + "referenceNumber": 55, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": [ @@ -6129,7 +6743,7 @@ "reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", - "referenceNumber": 126, + "referenceNumber": 555, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": [ @@ -6141,7 +6755,7 @@ "reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", - "referenceNumber": 536, + "referenceNumber": 260, "name": "psutils License", "licenseId": "psutils", "seeAlso": [ @@ -6153,7 +6767,7 @@ "reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", - "referenceNumber": 525, + "referenceNumber": 285, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": [ @@ -6166,7 +6780,7 @@ "reference": "https://spdx.org/licenses/Python-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", - "referenceNumber": 350, + "referenceNumber": 201, "name": "Python License 2.0.1", "licenseId": "Python-2.0.1", "seeAlso": [ @@ -6180,12 +6794,11 @@ "reference": "https://spdx.org/licenses/python-ldap.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/python-ldap.json", - "referenceNumber": 96, + "referenceNumber": 446, "name": "Python ldap License", "licenseId": "python-ldap", "seeAlso": [ - "https://github.com/zdohnal/hplip/blob/master/base/ldif.py", - "https://sourceforge.net/projects/hplip/files/hplip/3.23.5/hplip-3.23.5.tar.gz/download" + "https://github.com/python-ldap/python-ldap/blob/main/LICENCE" ], "isOsiApproved": false }, @@ -6193,7 +6806,7 @@ "reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", - "referenceNumber": 0, + "referenceNumber": 326, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": [ @@ -6205,7 +6818,7 @@ "reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", - "referenceNumber": 292, + "referenceNumber": 413, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": [ @@ -6220,7 +6833,7 @@ "reference": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0-INRIA-2004.json", - "referenceNumber": 355, + "referenceNumber": 486, "name": "Q Public License 1.0 - INRIA 2004 variant", "licenseId": "QPL-1.0-INRIA-2004", "seeAlso": [ @@ -6228,11 +6841,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/radvd.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/radvd.json", + "referenceNumber": 433, + "name": "radvd License", + "licenseId": "radvd", + "seeAlso": [ + "https://github.com/radvd-project/radvd/blob/master/COPYRIGHT" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", - "referenceNumber": 357, + "referenceNumber": 50, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": [ @@ -6244,7 +6869,7 @@ "reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", - "referenceNumber": 480, + "referenceNumber": 99, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": [ @@ -6257,7 +6882,7 @@ "reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", - "referenceNumber": 426, + "referenceNumber": 205, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": [ @@ -6269,7 +6894,7 @@ "reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", - "referenceNumber": 311, + "referenceNumber": 52, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": [ @@ -6281,7 +6906,7 @@ "reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", - "referenceNumber": 456, + "referenceNumber": 637, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": [ @@ -6295,7 +6920,7 @@ "reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", - "referenceNumber": 259, + "referenceNumber": 496, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": [ @@ -6307,7 +6932,7 @@ "reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", - "referenceNumber": 566, + "referenceNumber": 235, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": [ @@ -6320,7 +6945,7 @@ "reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", - "referenceNumber": 84, + "referenceNumber": 223, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": [ @@ -6330,12 +6955,24 @@ "isFsfLibre": true }, { - "reference": "https://spdx.org/licenses/SAX-PD.html", + "reference": "https://spdx.org/licenses/SAX-PD.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", + "referenceNumber": 301, + "name": "Sax Public Domain Notice", + "licenseId": "SAX-PD", + "seeAlso": [ + "http://www.saxproject.org/copying.html" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/SAX-PD-2.0.html", "isDeprecatedLicenseId": false, - "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", - "referenceNumber": 231, - "name": "Sax Public Domain Notice", - "licenseId": "SAX-PD", + "detailsUrl": "https://spdx.org/licenses/SAX-PD-2.0.json", + "referenceNumber": 561, + "name": "Sax Public Domain Notice 2.0", + "licenseId": "SAX-PD-2.0", "seeAlso": [ "http://www.saxproject.org/copying.html" ], @@ -6345,7 +6982,7 @@ "reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", - "referenceNumber": 45, + "referenceNumber": 109, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": [ @@ -6357,7 +6994,7 @@ "reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", - "referenceNumber": 271, + "referenceNumber": 35, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": [ @@ -6369,7 +7006,7 @@ "reference": "https://spdx.org/licenses/SchemeReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", - "referenceNumber": 208, + "referenceNumber": 425, "name": "Scheme Language Report License", "licenseId": "SchemeReport", "seeAlso": [], @@ -6379,7 +7016,7 @@ "reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", - "referenceNumber": 75, + "referenceNumber": 274, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": [ @@ -6392,7 +7029,7 @@ "reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", - "referenceNumber": 410, + "referenceNumber": 247, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": [ @@ -6405,7 +7042,7 @@ "reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", - "referenceNumber": 471, + "referenceNumber": 476, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": [ @@ -6417,7 +7054,7 @@ "reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", - "referenceNumber": 524, + "referenceNumber": 456, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": [ @@ -6429,7 +7066,7 @@ "reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", - "referenceNumber": 193, + "referenceNumber": 405, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": [ @@ -6442,7 +7079,7 @@ "reference": "https://spdx.org/licenses/SGI-OpenGL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-OpenGL.json", - "referenceNumber": 226, + "referenceNumber": 629, "name": "SGI OpenGL License", "licenseId": "SGI-OpenGL", "seeAlso": [ @@ -6454,7 +7091,7 @@ "reference": "https://spdx.org/licenses/SGP4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGP4.json", - "referenceNumber": 433, + "referenceNumber": 336, "name": "SGP4 Permission Notice", "licenseId": "SGP4", "seeAlso": [ @@ -6466,7 +7103,7 @@ "reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", - "referenceNumber": 207, + "referenceNumber": 338, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": [ @@ -6478,7 +7115,7 @@ "reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", - "referenceNumber": 181, + "referenceNumber": 29, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": [ @@ -6490,7 +7127,7 @@ "reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", - "referenceNumber": 587, + "referenceNumber": 444, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": [ @@ -6502,7 +7139,7 @@ "reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", - "referenceNumber": 374, + "referenceNumber": 268, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": [ @@ -6516,7 +7153,7 @@ "reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", - "referenceNumber": 160, + "referenceNumber": 502, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": [ @@ -6528,7 +7165,7 @@ "reference": "https://spdx.org/licenses/SL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SL.json", - "referenceNumber": 331, + "referenceNumber": 645, "name": "SL License", "licenseId": "SL", "seeAlso": [ @@ -6540,7 +7177,7 @@ "reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", - "referenceNumber": 177, + "referenceNumber": 182, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": [ @@ -6553,7 +7190,7 @@ "reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", - "referenceNumber": 569, + "referenceNumber": 148, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": [ @@ -6566,7 +7203,7 @@ "reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", - "referenceNumber": 88, + "referenceNumber": 250, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": [ @@ -6578,7 +7215,7 @@ "reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", - "referenceNumber": 585, + "referenceNumber": 518, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": [ @@ -6590,7 +7227,7 @@ "reference": "https://spdx.org/licenses/snprintf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/snprintf.json", - "referenceNumber": 79, + "referenceNumber": 161, "name": "snprintf License", "licenseId": "snprintf", "seeAlso": [ @@ -6598,11 +7235,24 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/softSurfer.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/softSurfer.json", + "referenceNumber": 523, + "name": "softSurfer License", + "licenseId": "softSurfer", + "seeAlso": [ + "https://github.com/mm2/Little-CMS/blob/master/src/cmssm.c#L207", + "https://fedoraproject.org/wiki/Licensing/softSurfer" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/Soundex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Soundex.json", - "referenceNumber": 171, + "referenceNumber": 368, "name": "Soundex License", "licenseId": "Soundex", "seeAlso": [ @@ -6614,7 +7264,7 @@ "reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", - "referenceNumber": 589, + "referenceNumber": 472, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": [ @@ -6626,7 +7276,7 @@ "reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", - "referenceNumber": 251, + "referenceNumber": 378, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": [ @@ -6639,7 +7289,7 @@ "reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", - "referenceNumber": 176, + "referenceNumber": 139, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": [ @@ -6651,7 +7301,7 @@ "reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", - "referenceNumber": 8, + "referenceNumber": 280, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": [ @@ -6664,7 +7314,7 @@ "reference": "https://spdx.org/licenses/ssh-keyscan.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ssh-keyscan.json", - "referenceNumber": 170, + "referenceNumber": 294, "name": "ssh-keyscan License", "licenseId": "ssh-keyscan", "seeAlso": [ @@ -6676,7 +7326,7 @@ "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", - "referenceNumber": 154, + "referenceNumber": 506, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": [ @@ -6688,7 +7338,7 @@ "reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", - "referenceNumber": 104, + "referenceNumber": 563, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": [ @@ -6698,11 +7348,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/SSLeay-standalone.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/SSLeay-standalone.json", + "referenceNumber": 591, + "name": "SSLeay License - standalone", + "licenseId": "SSLeay-standalone", + "seeAlso": [ + "https://www.tq-group.com/filedownloads/files/software-license-conditions/OriginalSSLeay/OriginalSSLeay.pdf" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", - "referenceNumber": 412, + "referenceNumber": 17, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": [ @@ -6714,7 +7376,7 @@ "reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", - "referenceNumber": 117, + "referenceNumber": 658, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": [ @@ -6727,7 +7389,7 @@ "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", - "referenceNumber": 297, + "referenceNumber": 42, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": [ @@ -6735,11 +7397,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/Sun-PPP.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Sun-PPP.json", + "referenceNumber": 385, + "name": "Sun PPP License", + "licenseId": "Sun-PPP", + "seeAlso": [ + "https://github.com/ppp-project/ppp/blob/master/pppd/eap.c#L7-L16" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/Sun-PPP-2000.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Sun-PPP-2000.json", + "referenceNumber": 310, + "name": "Sun PPP License (2000)", + "licenseId": "Sun-PPP-2000", + "seeAlso": [ + "https://github.com/ppp-project/ppp/blob/master/modules/ppp_ahdlc.c#L7-L19" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/SunPro.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SunPro.json", - "referenceNumber": 507, + "referenceNumber": 57, "name": "SunPro License", "licenseId": "SunPro", "seeAlso": [ @@ -6752,7 +7438,7 @@ "reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", - "referenceNumber": 466, + "referenceNumber": 649, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": [ @@ -6764,7 +7450,7 @@ "reference": "https://spdx.org/licenses/swrule.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/swrule.json", - "referenceNumber": 278, + "referenceNumber": 90, "name": "swrule License", "licenseId": "swrule", "seeAlso": [ @@ -6776,7 +7462,7 @@ "reference": "https://spdx.org/licenses/Symlinks.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Symlinks.json", - "referenceNumber": 93, + "referenceNumber": 414, "name": "Symlinks License", "licenseId": "Symlinks", "seeAlso": [ @@ -6788,7 +7474,7 @@ "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", - "referenceNumber": 338, + "referenceNumber": 242, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": [ @@ -6800,7 +7486,7 @@ "reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", - "referenceNumber": 523, + "referenceNumber": 2, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": [ @@ -6813,7 +7499,7 @@ "reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", - "referenceNumber": 129, + "referenceNumber": 9, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": [ @@ -6825,7 +7511,7 @@ "reference": "https://spdx.org/licenses/TermReadKey.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TermReadKey.json", - "referenceNumber": 402, + "referenceNumber": 256, "name": "TermReadKey License", "licenseId": "TermReadKey", "seeAlso": [ @@ -6833,11 +7519,36 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/TGPPL-1.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/TGPPL-1.0.json", + "referenceNumber": 101, + "name": "Transitive Grace Period Public Licence 1.0", + "licenseId": "TGPPL-1.0", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/TGPPL", + "https://tahoe-lafs.org/trac/tahoe-lafs/browser/trunk/COPYING.TGPPL.rst" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/threeparttable.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/threeparttable.json", + "referenceNumber": 398, + "name": "threeparttable License", + "licenseId": "threeparttable", + "seeAlso": [ + "https://fedoraproject.org/wiki/Licensing/Threeparttable" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", - "referenceNumber": 312, + "referenceNumber": 539, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": [ @@ -6849,7 +7560,7 @@ "reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", - "referenceNumber": 111, + "referenceNumber": 61, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": [ @@ -6861,7 +7572,7 @@ "reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", - "referenceNumber": 106, + "referenceNumber": 267, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": [ @@ -6873,7 +7584,7 @@ "reference": "https://spdx.org/licenses/TPDL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPDL.json", - "referenceNumber": 571, + "referenceNumber": 75, "name": "Time::ParseDate License", "licenseId": "TPDL", "seeAlso": [ @@ -6885,7 +7596,7 @@ "reference": "https://spdx.org/licenses/TPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPL-1.0.json", - "referenceNumber": 161, + "referenceNumber": 508, "name": "THOR Public License 1.0", "licenseId": "TPL-1.0", "seeAlso": [ @@ -6897,7 +7608,7 @@ "reference": "https://spdx.org/licenses/TTWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTWL.json", - "referenceNumber": 465, + "referenceNumber": 87, "name": "Text-Tabs+Wrap License", "licenseId": "TTWL", "seeAlso": [ @@ -6910,7 +7621,7 @@ "reference": "https://spdx.org/licenses/TTYP0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTYP0.json", - "referenceNumber": 548, + "referenceNumber": 451, "name": "TTYP0 License", "licenseId": "TTYP0", "seeAlso": [ @@ -6922,7 +7633,7 @@ "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", - "referenceNumber": 568, + "referenceNumber": 159, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": [ @@ -6934,7 +7645,7 @@ "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", - "referenceNumber": 43, + "referenceNumber": 624, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": [ @@ -6946,7 +7657,7 @@ "reference": "https://spdx.org/licenses/UCAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCAR.json", - "referenceNumber": 283, + "referenceNumber": 78, "name": "UCAR License", "licenseId": "UCAR", "seeAlso": [ @@ -6958,7 +7669,7 @@ "reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", - "referenceNumber": 145, + "referenceNumber": 646, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": [ @@ -6970,7 +7681,7 @@ "reference": "https://spdx.org/licenses/ulem.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ulem.json", - "referenceNumber": 187, + "referenceNumber": 566, "name": "ulem License", "licenseId": "ulem", "seeAlso": [ @@ -6978,11 +7689,35 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/UMich-Merit.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/UMich-Merit.json", + "referenceNumber": 505, + "name": "Michigan/Merit Networks License", + "licenseId": "UMich-Merit", + "seeAlso": [ + "https://github.com/radcli/radcli/blob/master/COPYRIGHT#L64" + ], + "isOsiApproved": false + }, + { + "reference": "https://spdx.org/licenses/Unicode-3.0.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/Unicode-3.0.json", + "referenceNumber": 46, + "name": "Unicode License v3", + "licenseId": "Unicode-3.0", + "seeAlso": [ + "https://www.unicode.org/license.txt" + ], + "isOsiApproved": true + }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", - "referenceNumber": 430, + "referenceNumber": 647, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": [ @@ -6994,7 +7729,7 @@ "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", - "referenceNumber": 316, + "referenceNumber": 152, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": [ @@ -7008,7 +7743,7 @@ "reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", - "referenceNumber": 328, + "referenceNumber": 606, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": [ @@ -7021,7 +7756,7 @@ "reference": "https://spdx.org/licenses/UnixCrypt.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UnixCrypt.json", - "referenceNumber": 437, + "referenceNumber": 462, "name": "UnixCrypt License", "licenseId": "UnixCrypt", "seeAlso": [ @@ -7035,7 +7770,7 @@ "reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", - "referenceNumber": 377, + "referenceNumber": 411, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": [ @@ -7048,7 +7783,7 @@ "reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", - "referenceNumber": 288, + "referenceNumber": 511, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": [ @@ -7061,7 +7796,7 @@ "reference": "https://spdx.org/licenses/URT-RLE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/URT-RLE.json", - "referenceNumber": 495, + "referenceNumber": 443, "name": "Utah Raster Toolkit Run Length Encoded License", "licenseId": "URT-RLE", "seeAlso": [ @@ -7074,7 +7809,7 @@ "reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", - "referenceNumber": 489, + "referenceNumber": 371, "name": "Vim License", "licenseId": "Vim", "seeAlso": [ @@ -7087,7 +7822,7 @@ "reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", - "referenceNumber": 517, + "referenceNumber": 122, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": [ @@ -7099,7 +7834,7 @@ "reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", - "referenceNumber": 298, + "referenceNumber": 510, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": [ @@ -7111,7 +7846,7 @@ "reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", - "referenceNumber": 173, + "referenceNumber": 284, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": [ @@ -7125,7 +7860,7 @@ "reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", - "referenceNumber": 172, + "referenceNumber": 156, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": [ @@ -7137,11 +7872,13 @@ "reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", - "referenceNumber": 485, + "referenceNumber": 452, "name": "W3C Software Notice and Document License (2015-05-13)", "licenseId": "W3C-20150513", "seeAlso": [ - "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" + "https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document", + "https://www.w3.org/copyright/software-license-2015/", + "https://www.w3.org/copyright/software-license-2023/" ], "isOsiApproved": false }, @@ -7149,7 +7886,7 @@ "reference": "https://spdx.org/licenses/w3m.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/w3m.json", - "referenceNumber": 370, + "referenceNumber": 202, "name": "w3m License", "licenseId": "w3m", "seeAlso": [ @@ -7161,7 +7898,7 @@ "reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", - "referenceNumber": 16, + "referenceNumber": 533, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": [ @@ -7174,7 +7911,7 @@ "reference": "https://spdx.org/licenses/Widget-Workshop.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Widget-Workshop.json", - "referenceNumber": 425, + "referenceNumber": 548, "name": "Widget Workshop License", "licenseId": "Widget-Workshop", "seeAlso": [ @@ -7186,7 +7923,7 @@ "reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", - "referenceNumber": 527, + "referenceNumber": 305, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": [ @@ -7198,7 +7935,7 @@ "reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", - "referenceNumber": 508, + "referenceNumber": 176, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": [ @@ -7212,7 +7949,7 @@ "reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", - "referenceNumber": 57, + "referenceNumber": 258, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": [ @@ -7224,7 +7961,7 @@ "reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", - "referenceNumber": 51, + "referenceNumber": 203, "name": "X11 License", "licenseId": "X11", "seeAlso": [ @@ -7237,7 +7974,7 @@ "reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", - "referenceNumber": 369, + "referenceNumber": 112, "name": "X11 License Distribution Modification Variant", "licenseId": "X11-distribute-modifications-variant", "seeAlso": [ @@ -7249,7 +7986,7 @@ "reference": "https://spdx.org/licenses/Xdebug-1.03.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xdebug-1.03.json", - "referenceNumber": 521, + "referenceNumber": 10, "name": "Xdebug License v 1.03", "licenseId": "Xdebug-1.03", "seeAlso": [ @@ -7261,7 +7998,7 @@ "reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", - "referenceNumber": 359, + "referenceNumber": 595, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": [ @@ -7273,7 +8010,7 @@ "reference": "https://spdx.org/licenses/Xfig.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xfig.json", - "referenceNumber": 148, + "referenceNumber": 89, "name": "Xfig License", "licenseId": "Xfig", "seeAlso": [ @@ -7287,7 +8024,7 @@ "reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", - "referenceNumber": 282, + "referenceNumber": 562, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": [ @@ -7300,7 +8037,7 @@ "reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", - "referenceNumber": 188, + "referenceNumber": 465, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": [ @@ -7309,11 +8046,23 @@ "isOsiApproved": false, "isFsfLibre": true }, + { + "reference": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/xkeyboard-config-Zinoviev.json", + "referenceNumber": 140, + "name": "xkeyboard-config Zinoviev License", + "licenseId": "xkeyboard-config-Zinoviev", + "seeAlso": [ + "https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/blob/master/COPYING?ref_type\u003dheads#L178" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/xlock.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xlock.json", - "referenceNumber": 515, + "referenceNumber": 357, "name": "xlock License", "licenseId": "xlock", "seeAlso": [ @@ -7325,7 +8074,7 @@ "reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", - "referenceNumber": 273, + "referenceNumber": 236, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": [ @@ -7337,7 +8086,7 @@ "reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", - "referenceNumber": 513, + "referenceNumber": 312, "name": "XPP License", "licenseId": "xpp", "seeAlso": [ @@ -7349,7 +8098,7 @@ "reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", - "referenceNumber": 32, + "referenceNumber": 544, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": [ @@ -7357,11 +8106,23 @@ ], "isOsiApproved": false }, + { + "reference": "https://spdx.org/licenses/xzoom.html", + "isDeprecatedLicenseId": false, + "detailsUrl": "https://spdx.org/licenses/xzoom.json", + "referenceNumber": 530, + "name": "xzoom License", + "licenseId": "xzoom", + "seeAlso": [ + "https://metadata.ftp-master.debian.org/changelogs//main/x/xzoom/xzoom_0.3-27_copyright" + ], + "isOsiApproved": false + }, { "reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", - "referenceNumber": 263, + "referenceNumber": 491, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": [ @@ -7373,7 +8134,7 @@ "reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", - "referenceNumber": 70, + "referenceNumber": 473, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": [ @@ -7386,7 +8147,7 @@ "reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", - "referenceNumber": 479, + "referenceNumber": 599, "name": "Zed License", "licenseId": "Zed", "seeAlso": [ @@ -7398,7 +8159,7 @@ "reference": "https://spdx.org/licenses/Zeeff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zeeff.json", - "referenceNumber": 222, + "referenceNumber": 218, "name": "Zeeff License", "licenseId": "Zeeff", "seeAlso": [ @@ -7410,7 +8171,7 @@ "reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", - "referenceNumber": 300, + "referenceNumber": 481, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": [ @@ -7423,7 +8184,7 @@ "reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", - "referenceNumber": 434, + "referenceNumber": 379, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": [ @@ -7436,7 +8197,7 @@ "reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", - "referenceNumber": 215, + "referenceNumber": 304, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": [ @@ -7448,7 +8209,7 @@ "reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", - "referenceNumber": 294, + "referenceNumber": 209, "name": "zlib License", "licenseId": "Zlib", "seeAlso": [ @@ -7462,7 +8223,7 @@ "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", - "referenceNumber": 490, + "referenceNumber": 348, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": [ @@ -7474,7 +8235,7 @@ "reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", - "referenceNumber": 497, + "referenceNumber": 545, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": [ @@ -7486,7 +8247,7 @@ "reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", - "referenceNumber": 46, + "referenceNumber": 51, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": [ @@ -7500,7 +8261,7 @@ "reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", - "referenceNumber": 39, + "referenceNumber": 352, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": [ @@ -7510,5 +8271,5 @@ "isFsfLibre": true } ], - "releaseDate": "2023-10-05" + "releaseDate": "2024-05-22" } \ No newline at end of file diff --git a/src/reuse/vcs.py b/src/reuse/vcs.py index 73c40c7ea..b5bb7326d 100644 --- a/src/reuse/vcs.py +++ b/src/reuse/vcs.py @@ -150,9 +150,6 @@ def is_submodule(self, path: StrPath) -> bool: @classmethod def in_repo(cls, directory: StrPath) -> bool: - if directory is None: - directory = Path.cwd() - if not Path(directory).is_dir(): raise NotADirectoryError() @@ -220,9 +217,6 @@ def is_submodule(self, path: StrPath) -> bool: @classmethod def in_repo(cls, directory: StrPath) -> bool: - if directory is None: - directory = Path.cwd() - if not Path(directory).is_dir(): raise NotADirectoryError() @@ -277,9 +271,6 @@ def is_submodule(self, path: StrPath) -> bool: @classmethod def in_repo(cls, directory: StrPath) -> bool: - if directory is None: - directory = Path.cwd() - if not Path(directory).is_dir(): raise NotADirectoryError() diff --git a/tests/conftest.py b/tests/conftest.py index e77ea6180..94b3b0952 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,8 +7,9 @@ """Global fixtures and configuration.""" -# pylint: disable=redefined-outer-name +# pylint: disable=redefined-outer-name,invalid-name +import contextlib import datetime import logging import multiprocessing as mp @@ -23,7 +24,6 @@ from unittest.mock import create_autospec import pytest -from debian.copyright import Copyright from jinja2 import Environment os.environ["LC_ALL"] = "C" @@ -38,12 +38,29 @@ sys.path.append(os.path.join(Path(__file__).parent.parent, "src")) finally: from reuse._util import GIT_EXE, HG_EXE, PIJUL_EXE, setup_logging + from reuse.global_licensing import ReuseDep5 CWD = Path.cwd() TESTS_DIRECTORY = Path(__file__).parent.resolve() RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" +try: + import pwd + + is_root = pwd.getpwuid(os.getuid()).pw_name == "root" + is_posix = True +except ImportError: + is_root = False + is_posix = False + +cpython = pytest.mark.skipif( + sys.implementation.name != "cpython", reason="only CPython supported" +) +git = pytest.mark.skipif(not GIT_EXE, reason="requires git") +no_root = pytest.mark.xfail(is_root, reason="fails when user is root") +posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") + # REUSE-IgnoreStart @@ -67,6 +84,13 @@ def pytest_runtest_setup(item): # Make sure to restore CWD os.chdir(CWD) + # TODO: Awful workaround. In `main`, this environment variable is set under + # certain conditions. This means that all tests that run _after_ that + # condition is met also have the environment variable set, because the + # environment had been changed. There should be a better way to scope this. + with contextlib.suppress(KeyError): + del os.environ["_SUPPRESS_DEP5_WARNING"] + @pytest.fixture() def git_exe() -> str: @@ -150,6 +174,25 @@ def fake_repository(tmpdir_factory) -> Path: return directory +@pytest.fixture() +def fake_repository_reuse_toml(fake_repository) -> Path: + """Add REUSE.toml to the fake repo.""" + shutil.copy( + RESOURCES_DIRECTORY / "REUSE.toml", fake_repository / "REUSE.toml" + ) + (fake_repository / "doc/index.rst").touch() + return fake_repository + + +@pytest.fixture() +def fake_repository_dep5(fake_repository) -> Path: + """Add .reuse/dep5 to the fake repo.""" + (fake_repository / ".reuse").mkdir(exist_ok=True) + shutil.copy(RESOURCES_DIRECTORY / "dep5", fake_repository / ".reuse/dep5") + (fake_repository / "doc/index.rst").touch() + return fake_repository + + def _repo_contents( fake_repository, ignore_filename=".gitignore", ignore_prefix="" ): @@ -347,12 +390,9 @@ def submodule_repository( @pytest.fixture(scope="session") -def dep5_copyright(): - """Create a dep5 Copyright object.""" - with (RESOURCES_DIRECTORY / "fake_repository/.reuse/dep5").open( - encoding="utf-8" - ) as fp: - return Copyright(fp) +def reuse_dep5(): + """Create a ReuseDep5 object.""" + return ReuseDep5.from_file(RESOURCES_DIRECTORY / "dep5") @pytest.fixture() diff --git a/tests/resources/REUSE.toml b/tests/resources/REUSE.toml new file mode 100644 index 000000000..6c2f15e5b --- /dev/null +++ b/tests/resources/REUSE.toml @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2017 Jane Doe +# +# SPDX-License-Identifier: CC0-1.0 + +version = 1 + +[[annotations]] +path = "doc/*" +precedence = "override" +SPDX-FileCopyrightText = "2017 Jane Doe" +SPDX-License-Identifier = "CC0-1.0" diff --git a/tests/resources/fake_repository/.reuse/dep5 b/tests/resources/dep5 similarity index 60% rename from tests/resources/fake_repository/.reuse/dep5 rename to tests/resources/dep5 index e4ffd822e..d463e3d64 100644 --- a/tests/resources/fake_repository/.reuse/dep5 +++ b/tests/resources/dep5 @@ -1,7 +1,4 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: Some project -Upstream-Contact: Jane Doe -Source: https://example.com/ Files: doc/* Copyright: 2017 Jane Doe diff --git a/tests/resources/fake_repository/doc/index.rst b/tests/resources/fake_repository/doc/index.rst deleted file mode 100644 index af5626b4a..000000000 --- a/tests/resources/fake_repository/doc/index.rst +++ /dev/null @@ -1 +0,0 @@ -Hello, world! diff --git a/tests/resources/fake_repository/doc/usage.md b/tests/resources/fake_repository/doc/usage.md new file mode 100644 index 000000000..af725d59c --- /dev/null +++ b/tests/resources/fake_repository/doc/usage.md @@ -0,0 +1,4 @@ + diff --git a/tests/test_comment.py b/tests/test_comment.py index 72ea2d622..b0766cdfc 100644 --- a/tests/test_comment.py +++ b/tests/test_comment.py @@ -13,10 +13,10 @@ import pytest from reuse.comment import ( - CCommentStyle, CommentCreateError, CommentParseError, CommentStyle, + CppCommentStyle, HtmlCommentStyle, LispCommentStyle, PythonCommentStyle, @@ -236,8 +236,8 @@ def test_parse_comment_python_multi_error(): PythonCommentStyle._parse_comment_multi("Hello world") -def test_create_comment_c_single(): - """Create a C comment with single-line comments.""" +def test_create_comment_cpp_single(): + """Create a C++ comment with single-line comments.""" text = cleandoc( """ Hello @@ -251,11 +251,11 @@ def test_create_comment_c_single(): """ ) - assert CCommentStyle.create_comment(text) == expected + assert CppCommentStyle.create_comment(text) == expected -def test_parse_comment_c_single(): - """Parse a C comment with single-line comments.""" +def test_parse_comment_cpp_single(): + """Parse a C++ comment with single-line comments.""" text = cleandoc( """ // Hello @@ -269,11 +269,11 @@ def test_parse_comment_c_single(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_create_comment_c_multi(): - """Create a C comment with multi-line comments.""" +def test_create_comment_cpp_multi(): + """Create a C++ comment with multi-line comments.""" text = cleandoc( """ Hello @@ -289,11 +289,11 @@ def test_create_comment_c_multi(): """ ) - assert CCommentStyle.create_comment(text, force_multi=True) == expected + assert CppCommentStyle.create_comment(text, force_multi=True) == expected -def test_create_comment_c_multi_empty_newlines(): - """Create a C comment that contains empty lines.""" +def test_create_comment_cpp_multi_empty_newlines(): + """Create a C++ comment that contains empty lines.""" text = cleandoc( """ Hello @@ -311,11 +311,11 @@ def test_create_comment_c_multi_empty_newlines(): """ ) - assert CCommentStyle.create_comment(text, force_multi=True) == expected + assert CppCommentStyle.create_comment(text, force_multi=True) == expected -def test_create_comment_c_multi_surrounded_by_newlines(): - """Create a C comment that is surrounded by empty lines.""" +def test_create_comment_cpp_multi_surrounded_by_newlines(): + """Create a C++ comment that is surrounded by empty lines.""" text = "\nHello\nworld\n" expected = cleandoc( """ @@ -328,10 +328,10 @@ def test_create_comment_c_multi_surrounded_by_newlines(): """ ) - assert CCommentStyle.create_comment(text, force_multi=True) == expected + assert CppCommentStyle.create_comment(text, force_multi=True) == expected -def test_create_comment_c_multi_contains_ending(): +def test_create_comment_cpp_multi_contains_ending(): """Raise CommentCreateError when the text contains a comment ending.""" text = cleandoc( """ @@ -342,11 +342,11 @@ def test_create_comment_c_multi_contains_ending(): ) with pytest.raises(CommentCreateError): - CCommentStyle.create_comment(text, force_multi=True) + CppCommentStyle.create_comment(text, force_multi=True) -def test_parse_comment_c_multi(): - """Parse a C comment with multi-line comments.""" +def test_parse_comment_cpp_multi(): + """Parse a C++ comment with multi-line comments.""" text = cleandoc( """ /* @@ -361,11 +361,11 @@ def test_parse_comment_c_multi(): world """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_missing_middle(): - """Parse a C comment even though the middle markers are missing.""" +def test_parse_comment_cpp_multi_missing_middle(): + """Parse a C++ comment even though the middle markers are missing.""" text = cleandoc( """ /* @@ -381,11 +381,11 @@ def test_parse_comment_c_multi_missing_middle(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_misaligned_end(): - """Parse a C comment even though the end is misaligned.""" +def test_parse_comment_cpp_multi_misaligned_end(): + """Parse a C++ comment even though the end is misaligned.""" text = cleandoc( """ /* @@ -401,7 +401,7 @@ def test_parse_comment_c_multi_misaligned_end(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected text = cleandoc( """ @@ -418,11 +418,11 @@ def test_parse_comment_c_multi_misaligned_end(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_no_middle(): - """Parse a C comment that has no middle whatsoever.""" +def test_parse_comment_cpp_multi_no_middle(): + """Parse a C++ comment that has no middle whatsoever.""" text = cleandoc( """ /* Hello @@ -436,11 +436,11 @@ def test_parse_comment_c_multi_no_middle(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_ends_at_last(): - """Parse a C comment that treats the last line like a regular line.""" +def test_parse_comment_cpp_multi_ends_at_last(): + """Parse a C++ comment that treats the last line like a regular line.""" text = cleandoc( """ /* @@ -455,11 +455,11 @@ def test_parse_comment_c_multi_ends_at_last(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_starts_at_first(): - """Parse a C comment that treats the first line like a regular line.""" +def test_parse_comment_cpp_multi_starts_at_first(): + """Parse a C++ comment that treats the first line like a regular line.""" text = cleandoc( """ /* Hello @@ -474,11 +474,11 @@ def test_parse_comment_c_multi_starts_at_first(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_indented(): - """Preserve indentations in C comments.""" +def test_parse_comment_cpp_multi_indented(): + """Preserve indentations in C++ comments.""" text = cleandoc( """ /* @@ -494,37 +494,37 @@ def test_parse_comment_c_multi_indented(): """ ) - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_single_line(): +def test_parse_comment_cpp_multi_single_line(): """Parse a single-line multi-line comment.""" text = "/* Hello world */" expected = "Hello world" - assert CCommentStyle.parse_comment(text) == expected + assert CppCommentStyle.parse_comment(text) == expected -def test_parse_comment_c_multi_no_start(): +def test_parse_comment_cpp_multi_no_start(): """Raise CommentParseError when there is no comment starter.""" text = "Hello world */" with pytest.raises(CommentParseError): - CCommentStyle.parse_comment(text) + CppCommentStyle.parse_comment(text) with pytest.raises(CommentParseError): - CCommentStyle._parse_comment_multi(text) + CppCommentStyle._parse_comment_multi(text) -def test_parse_comment_c_multi_no_end(): +def test_parse_comment_cpp_multi_no_end(): """Raise CommentParseError when there is no comment end.""" text = "/* Hello world" with pytest.raises(CommentParseError): - CCommentStyle.parse_comment(text) + CppCommentStyle.parse_comment(text) -def test_parse_comment_c_multi_text_after_end(): +def test_parse_comment_cpp_multi_text_after_end(): """Raise CommentParseError when there is stuff after the comment delimiter. """ @@ -538,7 +538,7 @@ def test_parse_comment_c_multi_text_after_end(): ) with pytest.raises(CommentParseError): - CCommentStyle.parse_comment(text) + CppCommentStyle.parse_comment(text) def test_create_comment_html(): @@ -633,8 +633,8 @@ def test_comment_at_first_character_python_indented_comments(): assert PythonCommentStyle.comment_at_first_character(text) == expected -def test_comment_at_first_character_c_multi(): - """Simple test for a multi-line C comment.""" +def test_comment_at_first_character_cpp_multi(): + """Simple test for a multi-line C++ comment.""" text = cleandoc( """ /* @@ -653,10 +653,10 @@ def test_comment_at_first_character_c_multi(): """ ) - assert CCommentStyle.comment_at_first_character(text) == expected + assert CppCommentStyle.comment_at_first_character(text) == expected -def test_comment_at_first_character_c_multi_never_ends(): +def test_comment_at_first_character_cpp_multi_never_ends(): """Expect CommentParseError if the comment never ends.""" text = cleandoc( """ @@ -668,7 +668,7 @@ def test_comment_at_first_character_c_multi_never_ends(): ) with pytest.raises(CommentParseError): - CCommentStyle.comment_at_first_character(text) + CppCommentStyle.comment_at_first_character(text) def test_parse_comment_lisp(): diff --git a/tests/test_convert_dep5.py b/tests/test_convert_dep5.py new file mode 100644 index 000000000..108b82ef5 --- /dev/null +++ b/tests/test_convert_dep5.py @@ -0,0 +1,314 @@ +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for convert_dep5.""" + +# pylint: disable=line-too-long + +from io import StringIO + +from debian.copyright import Copyright + +from reuse._util import cleandoc_nl +from reuse.convert_dep5 import toml_from_dep5 + + +def test_toml_from_dep5_single_file(): + """Correctly convert a DEP5 file with a single file.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: hello.txt + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_asterisks(): + """Single asterisks get converted to double asterisks. Double asterisks get + left alone. + """ + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: */**/*** + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "**/**/***" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_multiple_files_in_paragraph(): + """Correctly convert a DEP5 file with a more files in a paragraph.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: hello.txt foo*.txt + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = ["hello.txt", "foo**.txt"] + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_multiple_paragraphs(): + """Correctly convert a DEP5 file with multiple paragraphs.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: hello.txt + Copyright: 2018 Jane Doe + License: MIT + + Files: world.txt + Copyright: 2018 John Doe + License: 0BSD + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + + [[annotations]] + path = "world.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 John Doe" + SPDX-License-Identifier = "0BSD" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_multiple_copyright(): + """Correctly convert a DEP5 file with multiple copyright holders.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: hello.txt + Copyright: 2018 Jane Doe + 2018 John Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = ["2018 Jane Doe", "2018 John Doe"] + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_comments(): + """Optionally include comments.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + + Files: hello.txt + Copyright: 2018 Jane Doe + License: MIT + Comment: hello + + Files: world.txt + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + SPDX-FileComment = "hello" + + [[annotations]] + path = "world.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_header(): + """Optionally include header fields.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + Upstream-Name: Some project + Upstream-Contact: Jane Doe + Source: https://example.com/ + Disclaimer: Some rights reserved + + Files: hello.txt + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + SPDX-PackageName = "Some project" + SPDX-PackageSupplier = "Jane Doe" + SPDX-PackageDownloadLocation = "https://example.com/" + SPDX-PackageComment = "Some rights reserved" + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_header_multiple_contacts(): + """Return a list of contacts.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + Upstream-Contact: Jane Doe + John Doe + + Files: hello.txt + Copyright: 2018 Jane Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + SPDX-PackageSupplier = ["Jane Doe", "John Doe"] + + [[annotations]] + path = "hello.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected + + +def test_toml_from_dep5_man_example(): + """Test the example from the man page.""" + text = StringIO( + cleandoc_nl( + """ + Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + Upstream-Name: Some project + Upstream-Contact: Jane Doe + Source: https://example.com/ + Disclaimer: Some rights reserved + + Files: hello*.txt + Copyright: 2018 Jane Doe + License: MIT + Comment: hello world + + Files: foo bar + Copyright: 2018 Jane Doe + 2019 John Doe + License: MIT + """ + ) + ) + expected = cleandoc_nl( + """ + version = 1 + SPDX-PackageName = "Some project" + SPDX-PackageSupplier = "Jane Doe" + SPDX-PackageDownloadLocation = "https://example.com/" + SPDX-PackageComment = "Some rights reserved" + + [[annotations]] + path = "hello**.txt" + precedence = "aggregate" + SPDX-FileCopyrightText = "2018 Jane Doe" + SPDX-License-Identifier = "MIT" + SPDX-FileComment = "hello world" + + [[annotations]] + path = ["foo", "bar"] + precedence = "aggregate" + SPDX-FileCopyrightText = ["2018 Jane Doe", "2019 John Doe"] + SPDX-License-Identifier = "MIT" + """ + ) + assert toml_from_dep5(Copyright(text)) == expected diff --git a/tests/test_core.py b/tests/test_core.py index 054073ecd..eefaa0f62 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -35,6 +35,20 @@ def test_reuse_info_contains_copyright_or_licensing_other_truthy(): assert not info.contains_copyright_or_licensing() +def test_reuse_info_contains_copyright_xor_licensing(): + """A simple xor version of the previous function.""" + assert not ReuseInfo().contains_copyright_xor_licensing() + assert not ReuseInfo( + spdx_expressions={"MIT"}, copyright_lines={"Copyright Jane Doe"} + ).contains_copyright_xor_licensing() + assert ReuseInfo( + spdx_expressions={"MIT"} + ).contains_copyright_xor_licensing() + assert ReuseInfo( + copyright_lines={"Copyright Jane Doe"} + ).contains_copyright_xor_licensing() + + def test_reuse_info_contains_info_simple(): """If any of the non-source files are truthy, expect True.""" assert ReuseInfo(spdx_expressions={"MIT"}).contains_info() diff --git a/tests/test_global_licensing.py b/tests/test_global_licensing.py new file mode 100644 index 000000000..bd2b289d8 --- /dev/null +++ b/tests/test_global_licensing.py @@ -0,0 +1,1075 @@ +# SPDX-FileCopyrightText: 2023 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +"""Tests for REUSE.toml and .reuse/dep5.""" + +import shutil +from inspect import cleandoc +from pathlib import Path + +import pytest +from conftest import RESOURCES_DIRECTORY, posix +from debian.copyright import Copyright +from license_expression import LicenseSymbol + +from reuse import ReuseInfo, SourceType +from reuse._util import _LICENSING +from reuse.global_licensing import ( + AnnotationsItem, + GlobalLicensingParseError, + GlobalLicensingParseTypeError, + GlobalLicensingParseValueError, + NestedReuseTOML, + PrecedenceType, + ReuseDep5, + ReuseTOML, +) + +# REUSE-IgnoreStart + +# pylint: disable=redefined-outer-name,too-many-lines + + +@pytest.fixture() +def annotations_item(): + return AnnotationsItem({"foo.py"}, "override", {"2023 Jane Doe"}, {"MIT"}) + + +class TestAnnotationsItemValidators: + """Test the validators of AnnotationsItem.""" + + def test_simple(self): + """Create an AnnotationsItem, passing all validators.""" + item = AnnotationsItem( + {"foo.py"}, + "override", + {"2023 Jane Doe"}, + {"MIT"}, + ) + assert item.paths == {"foo.py"} + assert item.precedence == PrecedenceType.OVERRIDE + assert item.copyright_lines == {"2023 Jane Doe"} + assert item.spdx_expressions == {_LICENSING.parse("MIT")} + + def test_precedence_defaults_to_closest(self): + """If precedence is NOTHING, default to closest.""" + item = AnnotationsItem( + {"foo.py"}, + copyright_lines={"2023 Jane Doe"}, + spdx_expressions={"MIT"}, + ) + assert item.precedence == PrecedenceType.CLOSEST + + def test_from_list(self): + """Convert lists to sets.""" + item = AnnotationsItem( + ["foo.py"], + "override", + ["2023 Jane Doe"], + ["MIT"], + ) + assert item.paths == {"foo.py"} + assert item.precedence == PrecedenceType.OVERRIDE + assert item.copyright_lines == {"2023 Jane Doe"} + assert item.spdx_expressions == {_LICENSING.parse("MIT")} + + def test_str_to_set(self): + """Convert strings to sets.""" + item = AnnotationsItem( + "foo.py", + "override", + "2023 Jane Doe", + "MIT", + ) + assert item.paths == {"foo.py"} + assert item.precedence == PrecedenceType.OVERRIDE + assert item.copyright_lines == {"2023 Jane Doe"} + assert item.spdx_expressions == {_LICENSING.parse("MIT")} + + def test_bad_expr(self): + """Raise an error on malformed SPDX expressions.""" + with pytest.raises(GlobalLicensingParseError): + AnnotationsItem( + {"foo.py"}, + {"MIT OR"}, + ) + + def test_bad_literal(self): + """Only a limited set of literal are accepted for precedence.""" + with pytest.raises(GlobalLicensingParseValueError): + AnnotationsItem( + {"foo.py"}, + "foobar", + ) + + def test_not_str(self): + """Copyright must be a string.""" + with pytest.raises(GlobalLicensingParseTypeError): + AnnotationsItem( + {"foo.py"}, + copyright_lines=123, + ) + + def test_not_set_of_str(self): + """Copyright must be a set of strings.""" + with pytest.raises(GlobalLicensingParseTypeError): + AnnotationsItem( + {"foo.py"}, + copyright_lines={"2023 Jane Doe", 2024}, + ) + + def test_paths_must_not_be_empty(self): + """'paths' may not be an empty list.""" + with pytest.raises(GlobalLicensingParseValueError): + AnnotationsItem( + set(), + ) + + def test_everything_except_path_optional(self): + """All fields except path are optional.""" + AnnotationsItem({"foo.py"}) + + +class TestAnnotationsItemFromDict: + """Test AnnotationsItem's from_dict method.""" + + def test_simple(self): + """A simple case.""" + item = AnnotationsItem.from_dict( + { + "path": {"foo.py"}, + "precedence": "override", + "SPDX-FileCopyrightText": {"2023 Jane Doe"}, + "SPDX-License-Identifier": {"MIT"}, + } + ) + assert item.paths == {"foo.py"} + assert item.precedence == PrecedenceType.OVERRIDE + assert item.copyright_lines == {"2023 Jane Doe"} + assert item.spdx_expressions == {_LICENSING.parse("MIT")} + + def test_implicit_precedence(self): + """When precedence is not defined, default to closest.""" + item = AnnotationsItem.from_dict( + { + "path": {"foo.py"}, + } + ) + assert item.precedence == PrecedenceType.CLOSEST + + def test_trigger_validators(self): + """It's possible to trigger the validators by providing a bad value.""" + with pytest.raises(GlobalLicensingParseTypeError): + AnnotationsItem.from_dict( + { + "path": {123}, + } + ) + + def test_path_missing(self): + """If the path key is missing, raise an error.""" + with pytest.raises(GlobalLicensingParseValueError): + AnnotationsItem.from_dict( + { + "precedence": "override", + "SPDX-FileCopyrightText": {"2023 Jane Doe"}, + "SPDX-License-Identifier": {"MIT"}, + } + ) + + def test_path_none(self): + """If the path key is None, raise an error.""" + with pytest.raises(GlobalLicensingParseValueError): + AnnotationsItem.from_dict( + { + "path": None, + } + ) + + def test_one_key_missing(self): + """If one REUSE info key is missing, raise no error.""" + item = AnnotationsItem.from_dict( + { + "path": {"foo.py"}, + "SPDX-License-Identifier": {"MIT"}, + } + ) + assert not item.copyright_lines + assert isinstance(item.copyright_lines, set) + + def test_both_keys_missing(self): + """If both REUSE info keys are missing, raise no error.""" + item = AnnotationsItem.from_dict( + { + "path": {"foo.py"}, + } + ) + assert not item.copyright_lines + assert not item.spdx_expressions + + +class TestAnnotationsItemMatches: + """Test AnnotationsItem's matches method.""" + + def test_simple(self): + """Simple case.""" + item = AnnotationsItem(paths=["foo.py"]) + assert item.matches("foo.py") + assert not item.matches("src/foo.py") + assert not item.matches("bar.py") + + def test_in_directory(self): + """Correctly handle pathname separators. Looking at you, Windows.""" + item = AnnotationsItem(paths=["src/foo.py"]) + assert item.matches("src/foo.py") + assert not item.matches("foo.py") + + def test_all_py(self): + """Correctly find all Python files.""" + item = AnnotationsItem(paths=["**/*.py"]) + assert item.matches("foo.py") + assert item.matches(".foo.py") + assert item.matches("src/foo.py") + assert not item.matches("src/foo.js") + + def test_only_in_dir(self): + """Only find files in a certain directory.""" + item = AnnotationsItem(paths=["src/*.py"]) + assert not item.matches("foo.py") + assert item.matches("src/foo.py") + assert not item.matches("src/other/foo.py") + + def test_asterisk(self): + """Match everything in local directory.""" + item = AnnotationsItem(paths=["*"]) + assert item.matches("foo.py") + assert item.matches(".gitignore") + assert not item.matches("src/foo.py") + assert not item.matches(".foo/bar") + + def test_asterisk_asterisk(self): + """Match everything.""" + item = AnnotationsItem(paths=["**"]) + assert item.matches("foo.py") + assert item.matches(".gitignore") + assert item.matches("src/foo.py") + assert item.matches(".foo/bar") + + def test_escape_asterisk(self): + """Handle escape asterisk.""" + item = AnnotationsItem(paths=[r"\*.py"]) + assert item.matches("*.py") + assert not item.matches("foo.py") + + def test_escape_asterisk_asterisk(self): + """Handle escape asterisk asterisk.""" + item = AnnotationsItem(paths=[r"\**.py"]) + assert item.matches("*foo.py") + assert not item.matches("foo.py") + + def test_escape_asterisk_escape_asterisk(self): + """Handle escape asterisk escape asterisk.""" + item = AnnotationsItem(paths=[r"\*\*.py"]) + assert item.matches("**.py") + assert not item.matches("foo.py") + assert not item.matches("*foo.py") + + def test_escape_asterisk_asterisk_slash_asterisk(self): + """Handle escape asterisk asterisk slash asterisk.""" + item = AnnotationsItem(paths=[r"\**/*.py"]) + assert item.matches("*foo/foo.py") + assert not item.matches("bar/foo.py") + + def test_escape_asterisk_escape_asterisk_slash_asterisk(self): + """Handle escape asterisk escape asterisk slash asterisk.""" + item = AnnotationsItem(paths=[r"\*\*/*.py"]) + assert item.matches("**/foo.py") + assert not item.matches("bar/foo.py") + assert not item.matches("*foo/foo.py") + + def test_escape_escape_asterisk(self): + """Handle escape escape asterisk.""" + item = AnnotationsItem(paths=[r"\\*.py"]) + assert item.matches(r"\foo.py") + + def test_asterisk_asterisk_asterisk(self): + """Handle asterisk asterisk asterisk.""" + item = AnnotationsItem(paths=[r"***.py"]) + assert item.matches("foo/bar/quz.py") + + def test_escape_a(self): + """Handle escape a.""" + item = AnnotationsItem(paths=[r"\a"]) + assert item.matches(r"a") + assert not item.matches(r"\a") + + def test_middle_asterisk(self): + """See what happens if the asterisk is in the middle of the path.""" + item = AnnotationsItem(paths=["foo*bar"]) + assert item.matches("foobar") + assert item.matches("foo2bar") + assert not item.matches("foo") + assert not item.matches("bar") + assert not item.matches("foo/bar") + + def test_multiple_paths(self): + """Match one of multiple files.""" + item = AnnotationsItem(paths=["*.py", "*.js", "README"]) + assert item.matches("foo.py") + assert item.matches(".foo.py") + assert item.matches("foo.js") + assert item.matches("README") + assert item.matches("README.py") + assert not item.matches("README.md") + + def test_match_all(self): + """Match everything.""" + item = AnnotationsItem(paths=["**"]) + assert item.matches("foo.py") + assert item.matches("src/foo.py") + assert item.matches(".gitignore") + assert item.matches(".foo/bar") + + +class TestReuseTOMLValidators: + """Test the validators of ReuseTOML.""" + + def test_simple(self, annotations_item): + """Pass the validators""" + result = ReuseTOML( + version=1, source="REUSE.toml", annotations=[annotations_item] + ) + assert result.version == 1 + assert result.source == "REUSE.toml" + assert result.annotations[0] == annotations_item + + def test_version_not_int(self, annotations_item): + """Version must be an int""" + with pytest.raises(GlobalLicensingParseTypeError): + ReuseTOML( + version=1.2, source="REUSE.toml", annotations=[annotations_item] + ) + + def test_source_not_str(self, annotations_item): + """Source must be a str.""" + with pytest.raises(GlobalLicensingParseTypeError): + ReuseTOML(version=1, source=123, annotations=[annotations_item]) + + def test_annotations_must_be_list(self, annotations_item): + """Annotations must be in a list, not any other collection.""" + # TODO: Technically we could change this to 'any collection that is + # ordered', but let's not split hairs. + with pytest.raises(GlobalLicensingParseTypeError): + ReuseTOML( + version=1, + source="REUSE.toml", + annotations=iter([annotations_item]), + ) + + def test_annotations_must_be_object(self): + """Annotations must be AnnotationsItem objects.""" + with pytest.raises(GlobalLicensingParseTypeError): + ReuseTOML( + version=1, source="REUSE.toml", annotations=[{"foo": "bar"}] + ) + + +class TestReuseTOMLFromDict: + """Test the from_dict method of ReuseTOML.""" + + def test_simple(self, annotations_item): + """Simple case.""" + result = ReuseTOML.from_dict( + { + "version": 1, + "annotations": [ + { + "path": {"foo.py"}, + "precedence": "override", + "SPDX-FileCopyrightText": {"2023 Jane Doe"}, + "SPDX-License-Identifier": {"MIT"}, + } + ], + }, + "REUSE.toml", + ) + assert result.version == 1 + assert result.source == "REUSE.toml" + assert result.annotations[0] == annotations_item + + def test_no_annotations(self): + """It's OK to not provide annotations.""" + result = ReuseTOML.from_dict({"version": 1}, source="REUSE.toml") + assert result.annotations == [] + + def test_annotations_empty_list(self): + """It's OK if annotations is an empty list.""" + result = ReuseTOML.from_dict( + {"version": 1, "annotations": []}, source="REUSE.toml" + ) + assert result.annotations == [] + + def test_no_version(self): + """If the version is missing, raise an error.""" + with pytest.raises(GlobalLicensingParseTypeError): + ReuseTOML.from_dict( + { + "annotations": [ + { + "path": {"foo.py"}, + "precedence": "override", + "SPDX-FileCopyrightText": {"2023 Jane Doe"}, + "SPDX-License-Identifier": {"MIT"}, + } + ], + }, + "REUSE.toml", + ) + + +class TestReuseTOMLFromToml: + """Test the from_toml method of ReuseTOML.""" + + def test_simple(self, annotations_item): + """Simple case""" + text = cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "override" + SPDX-FileCopyrightText = "2023 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + result = ReuseTOML.from_toml(text, "REUSE.toml") + assert result.version == 1 + assert result.source == "REUSE.toml" + assert result.annotations[0] == annotations_item + + def test_syntax_error(self): + """If there is a TOML syntax error, raise a GlobalLicensingParseError""" + with pytest.raises(GlobalLicensingParseError): + ReuseTOML.from_toml("version = 1,", "REUSE.toml") + + +class TestReuseTOMLEscaping: + """Test the escaping functionality in paths in conjunction with reading from + TOML. + """ + + def test_escape_asterisk(self): + """Handle escape asterisk.""" + text = cleandoc( + r""" + version = 1 + + [[annotations]] + path = "\\*.py" + SPDX-FileCopyrightText = "2023 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + toml = ReuseTOML.from_toml(text, "REUSE.toml") + assert toml.reuse_info_of(r"*.py") + assert not toml.reuse_info_of(r"\*.py") + assert not toml.reuse_info_of(r"foo.py") + assert not toml.reuse_info_of(r"\foo.py") + + @posix + def test_escape_escape(self): + """Handle escape escape.""" + text = cleandoc( + r""" + version = 1 + + [[annotations]] + path = "\\\\.py" + SPDX-FileCopyrightText = "2023 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + toml = ReuseTOML.from_toml(text, "REUSE.toml") + assert toml.reuse_info_of(r"\.py") + + +class TestReuseTOMLReuseInfoOf: + """Test the reuse_info_of method of ReuseTOML.""" + + def test_simple(self, annotations_item): + """Simple test.""" + reuse_toml = ReuseTOML("REUSE.toml", 1, [annotations_item]) + assert reuse_toml.reuse_info_of("foo.py") == { + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"2023 Jane Doe"}, + path="foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + + def test_latest_annotations_item(self, annotations_item): + """If two items match, use exclusively the latest.""" + reuse_toml = ReuseTOML( + "REUSE.toml", + 1, + [ + annotations_item, + AnnotationsItem( + paths={"foo.py"}, + precedence="override", + copyright_lines={"2023 John Doe"}, + spdx_expressions={"0BSD"}, + ), + ], + ) + assert reuse_toml.reuse_info_of("foo.py") == { + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("0BSD")}, + copyright_lines={"2023 John Doe"}, + path="foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + + def test_glob_all(self): + """When globbing all, match everything.""" + reuse_toml = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + paths={"**"}, + precedence="override", + copyright_lines={"2023 Jane Doe"}, + spdx_expressions={"MIT"}, + ), + ], + ) + # Expected sans path + expected = ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"2023 Jane Doe"}, + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + assert reuse_toml.reuse_info_of("foo.py") == { + PrecedenceType.OVERRIDE: [expected.copy(path="foo.py")] + } + assert reuse_toml.reuse_info_of("bar.py") == { + PrecedenceType.OVERRIDE: [expected.copy(path="bar.py")] + } + assert reuse_toml.reuse_info_of("dir/subdir/foo.py") == { + PrecedenceType.OVERRIDE: [expected.copy(path="dir/subdir/foo.py")] + } + + def test_glob_py(self): + """When globbing Python paths, match only .py files.""" + reuse_toml = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + paths={"**/*.py"}, + precedence="override", + copyright_lines={"2023 Jane Doe"}, + spdx_expressions={"MIT"}, + ), + ], + ) + assert reuse_toml.reuse_info_of("dir/foo.py") == { + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"2023 Jane Doe"}, + path="dir/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + assert not reuse_toml.reuse_info_of("foo.c") + + +class TestReuseTOMLFromFile: + """Test the from-file method of ReuseTOML.""" + + def test_simple(self, annotations_item, empty_directory): + """Simple case.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "override" + SPDX-FileCopyrightText = "2023 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + ) + result = ReuseTOML.from_file("REUSE.toml") + assert result.version == 1 + assert result.source == "REUSE.toml" + assert result.annotations[0] == annotations_item + + def test_precedence_implicit(self, empty_directory): + """When precedence is not set, default to closest.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + SPDX-FileCopyrightText = "2023 Jane Doe" + SPDX-License-Identifier = "MIT" + """ + ) + ) + result = ReuseTOML.from_file("REUSE.toml") + assert result.annotations[0].precedence == PrecedenceType.CLOSEST + + +class TestReuseTOMLDirectory: + """Test the directory property of ReuseTOML.""" + + def test_no_parent(self): + """Test what happens if the source has no obvious parent.""" + toml = ReuseTOML(source="REUSE.toml", version=1, annotations=[]) + assert toml.directory == Path(".") + + def test_nested(self): + """Correctly identify the directory of a nested file.""" + toml = ReuseTOML(source="src/REUSE.toml", version=1, annotations=[]) + assert toml.directory == Path("src") + + +class TestNestedReuseTOMLFromFile: + """Tests for NestedReuseTOML.from_file.""" + + def test_simple(self, fake_repository_reuse_toml): + """Find a single REUSE.toml.""" + result = NestedReuseTOML.from_file(fake_repository_reuse_toml) + path = fake_repository_reuse_toml / "REUSE.toml" + assert result.reuse_tomls == [ReuseTOML.from_file(path)] + + def test_one_deep(self, empty_directory): + """Find a single REUSE.toml deeper in the directory tree.""" + (empty_directory / "src").mkdir() + path = empty_directory / "src/REUSE.toml" + path.write_text("version = 1") + result = NestedReuseTOML.from_file(empty_directory) + assert result.reuse_tomls == [ReuseTOML.from_file(path)] + + def test_multiple(self, fake_repository_reuse_toml): + """Find multiple REUSE.tomls.""" + (fake_repository_reuse_toml / "src/REUSE.toml").write_text( + "version = 1" + ) + result = NestedReuseTOML.from_file(fake_repository_reuse_toml) + assert len(result.reuse_tomls) == 2 + assert ( + ReuseTOML.from_file(fake_repository_reuse_toml / "src/REUSE.toml") + ) in result.reuse_tomls + assert ( + ReuseTOML.from_file(fake_repository_reuse_toml / "REUSE.toml") + in result.reuse_tomls + ) + + +class TestNestedReuseTOMLFindReuseTomls: + """Tests for NestedReuseTOML.find_reuse_tomls.""" + + def test_simple(self, fake_repository_reuse_toml): + """Find a single REUSE.toml.""" + result = NestedReuseTOML.find_reuse_tomls(fake_repository_reuse_toml) + assert list(result) == [fake_repository_reuse_toml / "REUSE.toml"] + + def test_one_deep(self, empty_directory): + """Find a single REUSE.toml deeper in the directory tree.""" + (empty_directory / "src").mkdir() + path = empty_directory / "src/REUSE.toml" + path.touch() + result = NestedReuseTOML.find_reuse_tomls(empty_directory) + assert list(result) == [path] + + def test_multiple(self, fake_repository_reuse_toml): + """Find multiple REUSE.tomls.""" + (fake_repository_reuse_toml / "src/REUSE.toml").touch() + result = NestedReuseTOML.find_reuse_tomls(fake_repository_reuse_toml) + assert set(result) == { + fake_repository_reuse_toml / "REUSE.toml", + fake_repository_reuse_toml / "src/REUSE.toml", + } + + +class TestNestedReuseTOMLReuseInfoOf: + """Tests for NestedReuseTOML.reuse_info_of.""" + + def test_simple(self, annotations_item): + """Simple case.""" + reuse_toml = ReuseTOML("REUSE.toml", 1, [annotations_item]) + nested_reuse_toml = NestedReuseTOML(".", [reuse_toml]) + assert nested_reuse_toml.reuse_info_of("foo.py") == { + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"2023 Jane Doe"}, + path="foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + assert not nested_reuse_toml.reuse_info_of("bar.py") + + def test_no_tomls(self): + """Don't break when there are no nested ReuseTOMLs.""" + nested_reuse_toml = NestedReuseTOML(".", []) + assert not nested_reuse_toml.reuse_info_of("foo.py") + + def test_skip_outer_closest(self): + """If a precedence is set to 'closest', it is ignored unless it is the + deepest element. + """ + outer = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + "src/**", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Jane Doe"}, + spdx_expressions={"MIT"}, + ) + ], + ) + inner = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "foo.py", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + toml = NestedReuseTOML(".", [outer, inner]) + assert toml.reuse_info_of("src/foo.py") == { + PrecedenceType.CLOSEST: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("0BSD")}, + copyright_lines={"Copyright Alice"}, + path="src/foo.py", + source_path="src/REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + assert toml.reuse_info_of("src/bar.py") == { + PrecedenceType.CLOSEST: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"Copyright Jane Doe"}, + path="src/bar.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ] + } + + def test_aggregate(self): + """If a precedence is set to aggregate, aggregate.""" + outer = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + "src/**", + precedence=PrecedenceType.AGGREGATE, + copyright_lines={"Copyright Jane Doe"}, + spdx_expressions={"MIT"}, + ) + ], + ) + inner = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "foo.py", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + toml = NestedReuseTOML(".", [outer, inner]) + assert toml.reuse_info_of("src/foo.py") == { + PrecedenceType.AGGREGATE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"Copyright Jane Doe"}, + path="src/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ) + ], + PrecedenceType.CLOSEST: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("0BSD")}, + copyright_lines={"Copyright Alice"}, + path="src/foo.py", + source_path="src/REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ], + } + + def test_toml_precedence(self): + """If a precedence is set to toml, ignore deeper TOMLs.""" + outer = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + "src/**", + precedence=PrecedenceType.OVERRIDE, + copyright_lines={"Copyright Jane Doe"}, + spdx_expressions={"MIT"}, + ) + ], + ) + inner = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "foo.py", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + toml = NestedReuseTOML(".", [outer, inner]) + assert toml.reuse_info_of("src/foo.py") == { + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"Copyright Jane Doe"}, + path="src/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ] + } + + def test_toml_and_aggregate(self): + """If the top TOML says aggregate and a deeper TOML has precedence toml, + aggregate accordingly. + """ + outer = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + "foo/bar/**", + precedence=PrecedenceType.AGGREGATE, + copyright_lines={"Copyright Jane Doe"}, + spdx_expressions={"MIT"}, + ) + ], + ) + mid = ReuseTOML( + "foo/REUSE.toml", + 1, + [ + AnnotationsItem( + "bar/**", + precedence=PrecedenceType.OVERRIDE, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + inner = ReuseTOML( + "foo/bar/REUSE.toml", + 1, + [ + AnnotationsItem( + "foo.py", + precedence=PrecedenceType.OVERRIDE, + copyright_lines={"Copyright Bob"}, + spdx_expressions={"CC0-1.0"}, + ) + ], + ) + toml = NestedReuseTOML(".", [outer, mid, inner]) + assert toml.reuse_info_of("foo/bar/foo.py") == { + PrecedenceType.AGGREGATE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"Copyright Jane Doe"}, + path="foo/bar/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ], + PrecedenceType.OVERRIDE: [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("0BSD")}, + copyright_lines={"Copyright Alice"}, + path="foo/bar/foo.py", + source_path="foo/REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ], + } + + def test_dont_go_up_hierarchy(self): + """If a deep REUSE.toml contains instructions for a dir-globbed file, + don't match against files named as such in parent directories. + """ + deep = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "**/foo.py", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + toml = NestedReuseTOML(".", [deep]) + assert toml.reuse_info_of("src/foo.py") + assert toml.reuse_info_of("src/bar/foo.py") + assert not toml.reuse_info_of("foo.py") + assert not toml.reuse_info_of("doc/foo.py") + + def test_dont_go_up_directory(self): + """If a deep REUSE.toml contains an instruction for '../foo.py', don't + match it against anything. + """ + deep = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "../foo.py", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Alice"}, + spdx_expressions={"0BSD"}, + ) + ], + ) + toml = NestedReuseTOML(".", [deep]) + assert not toml.reuse_info_of("src/foo.py") + assert not toml.reuse_info_of("foo.py") + + def test_aggregate_incomplete_info(self): + """If one REUSE.toml defines the copyright, and a different one contains + the licence, then both bits of information should be used. + """ + outer = ReuseTOML( + "REUSE.toml", + 1, + [ + AnnotationsItem( + "src/foo.txt", + precedence=PrecedenceType.CLOSEST, + spdx_expressions={"MIT"}, + ) + ], + ) + inner = ReuseTOML( + "src/REUSE.toml", + 1, + [ + AnnotationsItem( + "foo.txt", + precedence=PrecedenceType.CLOSEST, + copyright_lines={"Copyright Jane Doe"}, + ) + ], + ) + toml = NestedReuseTOML(".", [outer, inner]) + infos = toml.reuse_info_of("src/foo.txt")[PrecedenceType.CLOSEST] + assert len(infos) == 2 + + +class TestReuseDep5FromFile: + """Tests for ReuseDep5.from_file.""" + + def test_simple(self, fake_repository_dep5): + """No error if everything is good.""" + result = ReuseDep5.from_file(fake_repository_dep5 / ".reuse/dep5") + assert result.__class__ == ReuseDep5 + assert result.dep5_copyright.__class__ == Copyright + assert result.source == str(fake_repository_dep5 / ".reuse/dep5") + + def test_not_exists(self, empty_directory): + """Raise FileNotFoundError if .reuse/dep5 doesn't exist.""" + with pytest.raises(FileNotFoundError): + ReuseDep5.from_file(empty_directory / "foo") + + def test_unicode_decode_error(self, fake_repository_dep5): + """Raise UnicodeDecodeError if file can't be decoded as utf-8.""" + shutil.copy( + RESOURCES_DIRECTORY / "fsfe.png", fake_repository_dep5 / "fsfe.png" + ) + with pytest.raises(UnicodeDecodeError): + ReuseDep5.from_file(fake_repository_dep5 / "fsfe.png") + + def test_parse_error(self, empty_directory): + """Raise GlobalLicensingParseError on parse error.""" + (empty_directory / "foo").write_text("foo") + with pytest.raises(GlobalLicensingParseError): + ReuseDep5.from_file(empty_directory / "foo") + + def test_double_copyright_parse_error(self, empty_directory): + """Raise GlobalLicensingParseError on double Copyright lines.""" + (empty_directory / "foo").write_text( + cleandoc( + """ + Format: something + Upstream-Name: example + Upstream-Contact: Jane Doe + Source: https://example.com + + Files: * + Copyright: Jane Doe + Copyright: John Doe + License: MIT + """ + ) + ) + with pytest.raises(GlobalLicensingParseError): + ReuseDep5.from_file(empty_directory / "foo") + + +def test_reuse_dep5_reuse_info_of(reuse_dep5): + """Verify that the glob in the dep5 file is matched.""" + infos = reuse_dep5.reuse_info_of("doc/foo.rst") + assert len(infos) == 1 + assert len(infos[PrecedenceType.AGGREGATE]) == 1 + result = infos[PrecedenceType.AGGREGATE][0] + assert LicenseSymbol("CC0-1.0") in result.spdx_expressions + assert "2017 Jane Doe" in result.copyright_lines + + +# REUSE-IgnoreEnd diff --git a/tests/test_header.py b/tests/test_header.py index 14c4b8e94..3ef286c20 100644 --- a/tests/test_header.py +++ b/tests/test_header.py @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later @@ -10,7 +11,7 @@ import pytest from reuse import ReuseInfo -from reuse.comment import CCommentStyle, CommentCreateError +from reuse.comment import CommentCreateError, CppCommentStyle from reuse.header import ( MissingReuseInfo, add_new_header, @@ -94,7 +95,7 @@ def test_create_header_template_commented(template_commented): info, template=template_commented, template_is_commented=True, - style=CCommentStyle, + style=CppCommentStyle, ).strip() == expected ) @@ -368,8 +369,10 @@ def test_find_and_replace_separate_shebang(): assert find_and_replace_header(text, info) == expected -def test_find_and_replace_only_shebang(): - """When the file only contains a shebang, keep it at the top of the file.""" +def test_find_and_replace_shebang_but_no_copyright(): + """When the file contains a shebang but no copyright information, keep it at + the top of the file. + """ info = ReuseInfo({"GPL-3.0-or-later"}) text = cleandoc( """ @@ -395,6 +398,24 @@ def test_find_and_replace_only_shebang(): assert find_and_replace_header(text, info) == expected +def test_find_and_replace_only_shebang(): + """When the file only contains a shebang, add copyright info below it.""" + info = ReuseInfo({"GPL-3.0-or-later"}) + text = "#!/usr/bin/env python3" + expected = ( + cleandoc( + """ + #!/usr/bin/env python3 + + # SPDX-License-Identifier: GPL-3.0-or-later + """ + ) + + "\n" + ) + + assert find_and_replace_header(text, info) == expected + + def test_find_and_replace_keep_old_comment(): """When encountering a comment that does not contain copyright and licensing information, preserve it below the REUSE header. diff --git a/tests/test_lint.py b/tests/test_lint.py index 4f29387d9..6ca93f9fd 100644 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -1,31 +1,20 @@ # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2024 Nico Rikken # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.lint""" +import re import shutil -import sys -from importlib import import_module -import pytest +from conftest import cpython, posix -from reuse.lint import format_plain +from reuse.lint import format_lines, format_plain from reuse.project import Project from reuse.report import ProjectReport -try: - IS_POSIX = bool(import_module("posix")) -except ImportError: - IS_POSIX = False - -cpython = pytest.mark.skipif( - sys.implementation.name != "cpython", reason="only CPython supported" -) -posix = pytest.mark.skipif(not IS_POSIX, reason="Windows not supported") - - # REUSE-IgnoreStart @@ -225,4 +214,61 @@ def test_lint_json_output(fake_repository): ) +def test_lint_lines_output(fake_repository): + """Complete test for lint with lines output.""" + # Prepare a repository that includes all types of situations: + # missing_licenses, unused_licenses, bad_licenses, deprecated_licenses, + # licenses_without_extension, files_without_copyright, + # files_without_licenses, read_errors + (fake_repository / "invalid-license.py").write_text( + "SPDX-License-Identifier: invalid" + ) + (fake_repository / "no-license.py").write_text( + "SPDX-FileCopyrightText: Jane Doe" + ) + (fake_repository / "LICENSES" / "invalid-license-text").write_text( + "An invalid license text" + ) + (fake_repository / "LICENSES" / "Nokia-Qt-exception-1.1.txt").write_text( + "Deprecated" + ) + (fake_repository / "LICENSES" / "MIT").write_text("foo") + (fake_repository / "file with spaces.py").write_text("foo") + + project = Project.from_directory(fake_repository) + report = ProjectReport.generate(project) + + lines_result = format_lines(report) + lines_result_lines = lines_result.splitlines() + + assert len(lines_result_lines) == 12 + + for line in lines_result_lines: + assert re.match(".+: [^:]+", line) + + assert lines_result.count("invalid-license.py") == 3 + assert lines_result.count("no-license.py") == 1 + assert lines_result.count("LICENSES") == 6 + assert lines_result.count("invalid-license-text") == 3 + assert lines_result.count("Nokia-Qt-exception-1.1.txt") == 2 + assert lines_result.count("MIT") == 2 + assert lines_result.count("file with spaces.py") == 2 + + +@cpython +@posix +def test_lint_lines_read_errors(fake_repository): + """Check read error output""" + (fake_repository / "restricted.py").write_text("foo") + (fake_repository / "restricted.py").chmod(0o000) + project = Project.from_directory(fake_repository) + report = ProjectReport.generate(project) + result = format_lines(report) + print(result) + + assert len(result.splitlines()) == 1 + assert "restricted.py" in result + assert "read error" in result + + # REUSE-IgnoreEnd diff --git a/tests/test_main.py b/tests/test_main.py index 0ee42dd15..3068b330f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -3,6 +3,7 @@ # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2024 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later @@ -15,6 +16,7 @@ import os import re import shutil +import warnings from inspect import cleandoc from pathlib import Path from typing import Generator, Optional @@ -22,15 +24,14 @@ from urllib.error import URLError import pytest +from conftest import RESOURCES_DIRECTORY +from freezegun import freeze_time from reuse import download from reuse._main import main -from reuse._util import GIT_EXE, HG_EXE, PIJUL_EXE +from reuse._util import GIT_EXE, HG_EXE, PIJUL_EXE, cleandoc_nl from reuse.report import LINT_VERSION -TESTS_DIRECTORY = Path(__file__).parent.resolve() -RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" - # REUSE-IgnoreStart @@ -85,6 +86,22 @@ def test_lint(fake_repository, stringio, optional_git_exe, optional_hg_exe): assert ":-)" in stringio.getvalue() +def test_lint_reuse_toml(fake_repository_reuse_toml, stringio): + """Run a simple lint with REUSE.toml.""" + result = main(["lint"], out=stringio) + + assert result == 0 + assert ":-)" in stringio.getvalue() + + +def test_lint_dep5(fake_repository_dep5, stringio): + """Run a simple lint with .reuse/dep5.""" + result = main(["lint"], out=stringio) + + assert result == 0 + assert ":-)" in stringio.getvalue() + + def test_lint_git(git_repository, stringio): """Run a successful lint.""" result = main(["lint"], out=stringio) @@ -236,19 +253,19 @@ def test_lint_fail_quiet(fake_repository, stringio): assert stringio.getvalue() == "" -def test_lint_dep5_decode_error(fake_repository, capsys): +def test_lint_dep5_decode_error(fake_repository_dep5, capsys): """Display an error if dep5 cannot be decoded.""" shutil.copy( - RESOURCES_DIRECTORY / "fsfe.png", fake_repository / ".reuse/dep5" + RESOURCES_DIRECTORY / "fsfe.png", fake_repository_dep5 / ".reuse/dep5" ) with pytest.raises(SystemExit): main(["lint"]) assert "could not be decoded" in capsys.readouterr().err -def test_lint_dep5_parse_error(fake_repository, capsys): +def test_lint_dep5_parse_error(fake_repository_dep5, capsys): """Display an error if there's a dep5 parse error.""" - (fake_repository / ".reuse/dep5").write_text("foo") + (fake_repository_dep5 / ".reuse/dep5").write_text("foo") with pytest.raises(SystemExit): main(["lint"]) assert "could not be parsed" in capsys.readouterr().err @@ -294,7 +311,7 @@ def test_lint_custom_root(fake_repository, stringio): result = main(["--root", "doc", "lint"], out=stringio) assert result > 0 - assert "index.rst" in stringio.getvalue() + assert "usage.md" in stringio.getvalue() assert ":-(" in stringio.getvalue() @@ -303,14 +320,16 @@ def test_lint_custom_root_git(git_repository, stringio): result = main(["--root", "doc", "lint"], out=stringio) assert result > 0 - assert "index.rst" in stringio.getvalue() + assert "usage.md" in stringio.getvalue() assert ":-(" in stringio.getvalue() -def test_lint_custom_root_different_cwd(fake_repository, stringio): +def test_lint_custom_root_different_cwd(fake_repository_reuse_toml, stringio): """Use a custom root while CWD is different.""" os.chdir("/") - result = main(["--root", str(fake_repository), "lint"], out=stringio) + result = main( + ["--root", str(fake_repository_reuse_toml), "lint"], out=stringio + ) assert result == 0 assert ":-)" in stringio.getvalue() @@ -336,6 +355,7 @@ def test_lint_no_multiprocessing(fake_repository, stringio, multiprocessing): assert ":-)" in stringio.getvalue() +@freeze_time("2024-04-08T17:34:00Z") def test_spdx(fake_repository, stringio): """Compile to an SPDX document.""" os.chdir(str(fake_repository)) @@ -347,6 +367,7 @@ def test_spdx(fake_repository, stringio): assert "\nLicenseConcluded: GPL-3.0-or-later\n" not in output assert "\nCreator: Person: Anonymous ()\n" in output assert "\nCreator: Organization: Anonymous ()\n" in output + assert "\nCreated: 2024-04-08T17:34:00Z\n" in output # TODO: This test is rubbish. assert result == 0 @@ -484,6 +505,56 @@ def test_download_custom_output_too_many( ) +def test_download_inside_licenses_dir( + fake_repository, stringio, mock_put_license_in_file +): + """While inside the LICENSES/ directory, don't create another LICENSES/ + directory. + """ + os.chdir(fake_repository / "LICENSES") + result = main(["download", "0BSD"], out=stringio) + assert result == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", destination=Path("0BSD.txt").absolute(), source=None + ) + + +def test_download_inside_licenses_dir_in_git( + git_repository, stringio, mock_put_license_in_file +): + """While inside a random LICENSES/ directory in a Git repository,.use the + root LICENSES/ directory. + """ + (git_repository / "doc/LICENSES").mkdir() + os.chdir(git_repository / "doc/LICENSES") + result = main(["download", "0BSD"], out=stringio) + assert result == 0 + mock_put_license_in_file.assert_called_with( + "0BSD", destination=Path("../../LICENSES/0BSD.txt"), source=None + ) + + +def test_download_different_root( + fake_repository, stringio, mock_put_license_in_file +): + """Download using a different root.""" + (fake_repository / "new_root").mkdir() + + result = main( + [ + "--root", + str((fake_repository / "new_root").resolve()), + "download", + "MIT", + ], + out=stringio, + ) + assert result == 0 + mock_put_license_in_file.assert_called_with( + "MIT", Path("new_root/LICENSES/MIT.txt").resolve(), source=None + ) + + def test_download_licenseref_no_source(empty_directory, stringio): """Downloading a LicenseRef license creates an empty file.""" main(["download", "LicenseRef-hello"], out=stringio) @@ -543,4 +614,38 @@ def test_supported_licenses(stringio): ) +def test_convert_dep5(fake_repository_dep5, stringio): + """Convert a DEP5 repository to a REUSE.toml repository.""" + result = main(["convert-dep5"], out=stringio) + + assert result == 0 + assert not (fake_repository_dep5 / ".reuse/dep5").exists() + assert (fake_repository_dep5 / "REUSE.toml").exists() + assert (fake_repository_dep5 / "REUSE.toml").read_text() == cleandoc_nl( + """ + version = 1 + + [[annotations]] + path = "doc/**" + precedence = "aggregate" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + + +def test_convert_dep5_no_dep5_file(fake_repository, stringio): + """Cannot convert when there is no .reuse/dep5 file.""" + with pytest.raises(SystemExit): + main(["convert-dep5"], out=stringio) + + +def test_convert_dep5_no_warning(fake_repository_dep5, stringio): + """No PendingDeprecationWarning when running convert-dep5.""" + with warnings.catch_warnings(record=True) as caught_warnings: + result = main(["convert-dep5"], out=stringio) + assert result == 0 + assert not caught_warnings + + # REUSE-IgnoreEnd diff --git a/tests/test_main_annotate.py b/tests/test_main_annotate.py index 367c18ba6..db184cf83 100644 --- a/tests/test_main_annotate.py +++ b/tests/test_main_annotate.py @@ -1,9 +1,10 @@ # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Stefan Bakker -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2023 Maxim Cournoyer +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -275,6 +276,45 @@ def test_annotate_no_year(fake_repository, stringio): assert simple_file.read_text() == expected +@pytest.mark.parametrize( + "copyright_prefix", ["--copyright-prefix", "--copyright-style"] +) +def test_annotate_copyright_prefix( + fake_repository, copyright_prefix, stringio, mock_date_today +): + """Add a header with a specific copyright prefix. Also test the old name of + the parameter. + """ + simple_file = fake_repository / "foo.py" + simple_file.write_text("pass") + expected = cleandoc( + """ + # Copyright 2018 Jane Doe + # + # SPDX-License-Identifier: GPL-3.0-or-later + + pass + """ + ) + + result = main( + [ + "annotate", + "--license", + "GPL-3.0-or-later", + "--copyright", + "Jane Doe", + copyright_prefix, + "string", + "foo.py", + ], + out=stringio, + ) + + assert result == 0 + assert simple_file.read_text() == expected + + def test_annotate_shebang(fake_repository, stringio): """Keep the shebang when annotating.""" simple_file = fake_repository / "foo.py" @@ -442,7 +482,7 @@ def test_annotate_specify_style(fake_repository, stringio, mock_date_today): "--copyright", "Jane Doe", "--style", - "c", + "cpp", "foo.py", ], out=stringio, @@ -563,7 +603,12 @@ def test_annotate_unrecognised_style(fake_repository, capsys): assert "foo.foo" in stdout -def test_annotate_skip_unrecognised(fake_repository, stringio): +@pytest.mark.parametrize( + "skip_unrecognised", ["--skip-unrecognised", "--skip-unrecognized"] +) +def test_annotate_skip_unrecognised( + fake_repository, skip_unrecognised, stringio +): """Skip file that has an unrecognised extension.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") @@ -575,7 +620,7 @@ def test_annotate_skip_unrecognised(fake_repository, stringio): "GPL-3.0-or-later", "--copyright", "Jane Doe", - "--skip-unrecognised", + skip_unrecognised, "foo.foo", ], out=stringio, @@ -1475,7 +1520,7 @@ def test_annotate_recursive(fake_repository, stringio, mock_date_today): out=stringio, ) - for path in (fake_repository / "src").glob("src/**"): + for path in (fake_repository / "src").rglob("src/**"): content = path.read_text() assert "SPDX-FileCopyrightText: 2018 Joe Somebody" in content diff --git a/tests/test_main_annotate_merge.py b/tests/test_main_annotate_merge.py index c842e7ce2..7889bfcd7 100644 --- a/tests/test_main_annotate_merge.py +++ b/tests/test_main_annotate_merge.py @@ -1,10 +1,10 @@ # SPDX-FileCopyrightText: 2021 Liam Beguin +# SPDX-FileCopyrightText: 2024 Rivos Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._main: annotate merge-copyrights option""" - from inspect import cleandoc from reuse._main import main @@ -102,7 +102,7 @@ def test_annotate_merge_copyrights_multi_prefix(fake_repository, stringio): str(2015 + i), "--license", "GPL-3.0-or-later", - "--copyright-style", + "--copyright-prefix", "string-c", "--copyright", "Mary Sue", diff --git a/tests/test_project.py b/tests/test_project.py index 4e5363bee..0041466ea 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -10,28 +10,21 @@ import os import shutil import warnings -from importlib import import_module from inspect import cleandoc from pathlib import Path -from textwrap import dedent import pytest -from debian.copyright import Error as DebianError +from conftest import RESOURCES_DIRECTORY, posix from license_expression import LicenseSymbol -from reuse import SourceType -from reuse.project import Project - -try: - IS_POSIX = bool(import_module("posix")) -except ImportError: - IS_POSIX = False - -posix = pytest.mark.skipif(not IS_POSIX, reason="Windows not supported") - -TESTS_DIRECTORY = Path(__file__).parent.resolve() -RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" - +from reuse import ReuseInfo, SourceType +from reuse._util import _LICENSING +from reuse.global_licensing import ( + GlobalLicensingParseError, + NestedReuseTOML, + ReuseDep5, +) +from reuse.project import GlobalLicensingConflict, Project # REUSE-IgnoreStart @@ -49,6 +42,17 @@ def test_project_not_exists(empty_directory): Project.from_directory(empty_directory / "foo") +def test_project_conflicting_global_licensing(empty_directory): + """If both REUSE.toml and .reuse/dep5 exist, expect a + GlobalLicensingConflict. + """ + (empty_directory / "REUSE.toml").write_text("version = 1") + (empty_directory / ".reuse").mkdir() + (empty_directory / ".reuse/dep5").touch() + with pytest.raises(GlobalLicensingConflict): + Project.from_directory(empty_directory) + + def test_all_files(empty_directory): """Given a directory with some files, yield all files.""" (empty_directory / "foo").write_text("foo") @@ -101,12 +105,36 @@ def test_all_files_ignore_git(empty_directory): def test_all_files_ignore_hg(empty_directory): """When the hg directory is present, ignore it.""" (empty_directory / ".hg").mkdir() - (empty_directory / ".hg/config").touch() + (empty_directory / ".hg/config").write_text("foo") project = Project.from_directory(empty_directory) assert not list(project.all_files()) +def test_all_files_ignore_license_copying(empty_directory): + """When there are files names LICENSE, LICENSE.ext, COPYING, or COPYING.ext, + ignore them. + """ + (empty_directory / "LICENSE").write_text("foo") + (empty_directory / "LICENSE.txt").write_text("foo") + (empty_directory / "COPYING").write_text("foo") + (empty_directory / "COPYING.txt").write_text("foo") + + project = Project.from_directory(empty_directory) + assert not list(project.all_files()) + + +def test_all_files_not_ignore_license_copying_no_ext(empty_directory): + """Do not ignore files that start with LICENSE or COPYING and are followed + by some non-extension text. + """ + (empty_directory / "LICENSE_README.md").write_text("foo") + (empty_directory / "COPYING2").write_text("foo") + + project = Project.from_directory(empty_directory) + assert len(list(project.all_files())) == 2 + + @posix def test_all_files_symlinks(empty_directory): """All symlinks must be ignored.""" @@ -305,42 +333,283 @@ def test_reuse_info_of_only_copyright(fake_repository): assert reuse_info.path == "foo.py" -def test_reuse_info_of_also_covered_by_dep5(fake_repository): - """A file contains all REUSE information, but .reuse/dep5 also - provides information on this file. Aggregate the information (for now), and - expect a PendingDeprecationWarning. +def test_reuse_info_of_toml_precedence(empty_directory): + """When the precedence is set to toml, ignore file contents.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "override" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").write_text( + cleandoc( + """ + # The below should give a parser error. Not going to happen because + # the file is never parsed. + SPDX-License-Identifier: ignored AND + SPDX-FileCopyrightText: ignored + """ + ) + ) + project = Project.from_directory(empty_directory) + reuse_infos = project.reuse_info_of("foo.py") + assert len(reuse_infos) == 1 + reuse_info = reuse_infos[0] + assert reuse_info.source_type == SourceType.REUSE_TOML + assert reuse_info.source_path == "REUSE.toml" + assert reuse_info.path == "foo.py" + assert LicenseSymbol("CC0-1.0") in reuse_info.spdx_expressions + assert "2017 Jane Doe" in reuse_info.copyright_lines + + +def test_reuse_info_of_closest_precedence(empty_directory): + """When the precedence is set to closest, ignore REUSE.toml contents.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "closest" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").write_text( + cleandoc( + """ + SPDX-License-Identifier: MIT + SPDX-FileCopyrightText: In File + """ + ) + ) + project = Project.from_directory(empty_directory) + reuse_infos = project.reuse_info_of("foo.py") + assert len(reuse_infos) == 1 + reuse_info = reuse_infos[0] + assert reuse_info.source_type == SourceType.FILE_HEADER + assert reuse_info.source_path == "foo.py" + assert reuse_info.path == "foo.py" + assert LicenseSymbol("MIT") in reuse_info.spdx_expressions + assert "SPDX-FileCopyrightText: In File" in reuse_info.copyright_lines + + +def test_reuse_info_of_closest_precedence_empty(empty_directory): + """When the precedence is set to closest, but the file is empty, use + REUSE.toml contents. """ - (fake_repository / "doc/foo.py").write_text( - dedent( + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "closest" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").touch() + project = Project.from_directory(empty_directory) + reuse_infos = project.reuse_info_of("foo.py") + assert len(reuse_infos) == 1 + reuse_info = reuse_infos[0] + assert reuse_info.source_type == SourceType.REUSE_TOML + assert reuse_info.source_path == "REUSE.toml" + assert reuse_info.path == "foo.py" + assert LicenseSymbol("CC0-1.0") in reuse_info.spdx_expressions + assert "2017 Jane Doe" in reuse_info.copyright_lines + + +def test_reuse_info_of_aggregate_precedence(empty_directory): + """When the precedence is set to aggregate, aggregate sources.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "aggregate" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").write_text( + cleandoc( """ SPDX-License-Identifier: MIT - SPDX-FileCopyrightText: in file""" + SPDX-FileCopyrightText: In File + """ ) ) - project = Project.from_directory(fake_repository) - with warnings.catch_warnings(record=True) as caught_warnings: - reuse_infos = project.reuse_info_of("doc/foo.py") - assert len(reuse_infos) == 2 - assert reuse_infos[0].source_type != reuse_infos[1].source_type - for reuse_info in reuse_infos: - if reuse_info.source_type == SourceType.DEP5: - assert LicenseSymbol("CC0-1.0") in reuse_info.spdx_expressions - assert "2017 Jane Doe" in reuse_info.copyright_lines - assert reuse_info.path == "doc/foo.py" - assert reuse_info.source_path == ".reuse/dep5" - elif reuse_info.source_type == SourceType.FILE_HEADER: - assert LicenseSymbol("MIT") in reuse_info.spdx_expressions - assert ( - "SPDX-FileCopyrightText: in file" - in reuse_info.copyright_lines - ) - assert reuse_info.path == "doc/foo.py" - assert reuse_info.source_path == "doc/foo.py" + project = Project.from_directory(empty_directory) + reuse_infos = project.reuse_info_of("foo.py") + assert len(reuse_infos) == 2 + assert reuse_infos[0].source_type != reuse_infos[1].source_type + for reuse_info in reuse_infos: + if reuse_info.source_type == SourceType.FILE_HEADER: + assert reuse_info.source_type + assert reuse_info.source_path == "foo.py" + assert reuse_info.path == "foo.py" + assert LicenseSymbol("MIT") in reuse_info.spdx_expressions + assert ( + "SPDX-FileCopyrightText: In File" in reuse_info.copyright_lines + ) + elif reuse_info.source_type == SourceType.REUSE_TOML: + assert reuse_info.source_path == "REUSE.toml" + assert reuse_info.path == "foo.py" + assert LicenseSymbol("CC0-1.0") in reuse_info.spdx_expressions + assert "2017 Jane Doe" in reuse_info.copyright_lines + else: + assert False + + +def test_reuse_info_of_aggregate_and_closest(empty_directory): + """A rather tricky case. Top-level REUSE.toml says aggregate. Nearest + REUSE.toml says closest. The top-level REUSE.toml info should now be + aggregated with the file contents IF they exist. Else, aggregate with the + nearest REUSE.toml info. + """ + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 - assert len(caught_warnings) == 1 - assert issubclass( - caught_warnings[0].category, PendingDeprecationWarning + [[annotations]] + path = "src/foo.py" + precedence = "aggregate" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + """ ) + ) + (empty_directory / "src").mkdir() + (empty_directory / "src/REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "closest" + SPDX-FileCopyrightText = "2017 John Doe" + SPDX-License-Identifier = "MIT" + """ + ) + ) + (empty_directory / "src/foo.py").touch() + project = Project.from_directory(empty_directory) + assert project.reuse_info_of("src/foo.py") == [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("CC0-1.0")}, + copyright_lines={"2017 Jane Doe"}, + path="src/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ReuseInfo( + spdx_expressions={_LICENSING.parse("MIT")}, + copyright_lines={"2017 John Doe"}, + path="src/foo.py", + source_path="src/REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ] + + # Populate the file. + (empty_directory / "src/foo.py").write_text( + cleandoc( + """ + # Copyright Example + # SPDX-License-Identifier: 0BSD + """ + ) + ) + assert project.reuse_info_of("src/foo.py") == [ + ReuseInfo( + spdx_expressions={_LICENSING.parse("CC0-1.0")}, + copyright_lines={"2017 Jane Doe"}, + path="src/foo.py", + source_path="REUSE.toml", + source_type=SourceType.REUSE_TOML, + ), + ReuseInfo( + spdx_expressions={_LICENSING.parse("0BSD")}, + copyright_lines={"Copyright Example"}, + path="src/foo.py", + source_path="src/foo.py", + source_type=SourceType.FILE_HEADER, + ), + ] + + +def test_reuse_info_of_copyright_xor_licensing(empty_directory): + """Test a corner case where partial REUSE information is defined inside of a + file (copyright xor licensing). Get the missing information from the + REUSE.toml. + """ + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + SPDX-FileCopyrightText = "2017 Jane Doe" + SPDX-License-Identifier = "CC0-1.0" + + [[annotations]] + path = "bar.py" + SPDX-License-Identifier = "CC0-1.0" + """ + ) + ) + (empty_directory / "foo.py").write_text( + cleandoc( + """ + SPDX-License-Identifier: MIT + """ + ) + ) + (empty_directory / "bar.py").write_text( + cleandoc( + """ + SPDX-FileCopyrightText: 2017 John Doe + """ + ) + ) + project = Project.from_directory(empty_directory) + + foo_infos = project.reuse_info_of("foo.py") + assert len(foo_infos) == 2 + foo_toml_info = [info for info in foo_infos if info.copyright_lines][0] + assert foo_toml_info.source_type == SourceType.REUSE_TOML + assert not foo_toml_info.spdx_expressions + foo_file_info = [info for info in foo_infos if info.spdx_expressions][0] + assert foo_file_info.source_type == SourceType.FILE_HEADER + assert not foo_file_info.copyright_lines + + bar_infos = project.reuse_info_of("bar.py") + assert len(bar_infos) == 2 + bar_toml_info = [info for info in bar_infos if info.spdx_expressions][0] + assert bar_toml_info.source_type == SourceType.REUSE_TOML + assert not bar_toml_info.copyright_lines + bar_file_info = [info for info in bar_infos if info.copyright_lines][0] + assert bar_file_info.source_type == SourceType.FILE_HEADER + assert not bar_file_info.spdx_expressions def test_reuse_info_of_no_duplicates(empty_directory): @@ -365,13 +634,13 @@ def test_reuse_info_of_no_duplicates(empty_directory): ) -def test_reuse_info_of_binary_succeeds(fake_repository): +def test_reuse_info_of_binary_succeeds(fake_repository_dep5): """reuse_info_of succeeds when the target is covered by dep5.""" shutil.copy( - RESOURCES_DIRECTORY / "fsfe.png", fake_repository / "doc/fsfe.png" + RESOURCES_DIRECTORY / "fsfe.png", fake_repository_dep5 / "doc/fsfe.png" ) - project = Project.from_directory(fake_repository) + project = Project.from_directory(fake_repository_dep5) reuse_info = project.reuse_info_of("doc/fsfe.png")[0] assert LicenseSymbol("CC0-1.0") in reuse_info.spdx_expressions assert reuse_info.source_type == SourceType.DEP5 @@ -449,6 +718,39 @@ def test_relative_from_root_no_shared_base_path(empty_directory): ) == Path("src/hello.py") +def test_find_global_licensing_dep5(fake_repository_dep5): + """Find the dep5 file. Also output a PendingDeprecationWarning.""" + with warnings.catch_warnings(record=True) as caught_warnings: + result = Project.find_global_licensing(fake_repository_dep5) + assert result.path == fake_repository_dep5 / ".reuse/dep5" + assert result.cls == ReuseDep5 + + assert len(caught_warnings) == 1 + assert issubclass( + caught_warnings[0].category, PendingDeprecationWarning + ) + + +def test_find_global_licensing_reuse_toml(fake_repository_reuse_toml): + """Find the REUSE.toml file.""" + result = Project.find_global_licensing(fake_repository_reuse_toml) + assert result.path == fake_repository_reuse_toml / "." + assert result.cls == NestedReuseTOML + + +def test_find_global_licensing_none(empty_directory): + """Find no file.""" + result = Project.find_global_licensing(empty_directory) + assert result is None + + +def test_find_global_licensing_conflict(fake_repository_dep5): + """Expect an error on a conflict""" + (fake_repository_dep5 / "REUSE.toml").touch() + with pytest.raises(GlobalLicensingConflict): + Project.find_global_licensing(fake_repository_dep5) + + def test_duplicate_field_dep5(empty_directory): """When a duplicate field is in a dep5 file, correctly handle errors.""" dep5_text = cleandoc( @@ -467,7 +769,7 @@ def test_duplicate_field_dep5(empty_directory): (empty_directory / ".reuse").mkdir() (empty_directory / ".reuse/dep5").write_text(dep5_text) - with pytest.raises(DebianError): + with pytest.raises(GlobalLicensingParseError): Project.from_directory(empty_directory) diff --git a/tests/test_report.py b/tests/test_report.py index 7fa0f6952..084d591e0 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -8,27 +8,17 @@ import os -import sys -from importlib import import_module +import re +import warnings +from inspect import cleandoc from textwrap import dedent -import pytest +from conftest import cpython, posix from reuse import SourceType from reuse.project import Project from reuse.report import FileReport, ProjectReport -try: - IS_POSIX = bool(import_module("posix")) -except ImportError: - IS_POSIX = False - -cpython = pytest.mark.skipif( - sys.implementation.name != "cpython", reason="only CPython supported" -) -posix = pytest.mark.skipif(not IS_POSIX, reason="Windows not supported") - - # REUSE-IgnoreStart @@ -222,22 +212,25 @@ def test_generate_file_report_multiple_licenses( assert not result.missing_licenses -def test_generate_file_report_to_dict_lint_source_information(fake_repository): +def test_generate_file_report_to_dict_lint_source_information( + fake_repository_dep5, +): """When a file is covered both by DEP5 and its file header, the lint dict should correctly convey the source information. """ - (fake_repository / "doc/foo.py").write_text( + (fake_repository_dep5 / "doc/foo.py").write_text( dedent( """ SPDX-License-Identifier: MIT OR 0BSD SPDX-FileCopyrightText: in file""" ) ) - project = Project.from_directory(fake_repository) - report = FileReport.generate( - project, - "doc/foo.py", - ) + project = Project.from_directory(fake_repository_dep5) + with warnings.catch_warnings(record=True): + report = FileReport.generate( + project, + "doc/foo.py", + ) result = report.to_dict_lint() assert result["path"] == "doc/foo.py" assert len(result["copyrights"]) == 2 @@ -446,12 +439,46 @@ def test_generate_project_report_to_dict_lint(fake_repository, multiprocessing): assert list(result.keys())[3:-1] == sorted(list(result.keys())[3:-1]) +def test_generate_project_partial_info_in_toml( + empty_directory, multiprocessing +): + """Some information is in REUSE.toml, and some is inside of the file.""" + (empty_directory / "REUSE.toml").write_text( + cleandoc( + """ + version = 1 + + [[annotations]] + path = "foo.py" + precedence = "closest" + SPDX-FileCopyrightText = "Jane Doe" + # This is ignored because it's in the file! + SPDX-License-Identifier = "MIT" + """ + ) + ) + (empty_directory / "foo.py").write_text("# SPDX-License-Identifier: 0BSD") + project = Project.from_directory(empty_directory) + report = ProjectReport.generate(project, multiprocessing=multiprocessing) + file_report = next( + report for report in report.file_reports if report.path.name == "foo.py" + ) + infos = file_report.reuse_infos + assert len(infos) == 2 + assert file_report.copyright == "Jane Doe" + assert file_report.licenses_in_file == ["0BSD"] + + def test_bill_of_materials(fake_repository, multiprocessing): """Generate a bill of materials.""" project = Project.from_directory(fake_repository) report = ProjectReport.generate(project, multiprocessing=multiprocessing) # TODO: Actually do something - report.bill_of_materials() + bom = report.bill_of_materials() + created_re = re.compile( + r"^Created: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$", re.MULTILINE + ) + assert created_re.search(bom) is not None # REUSE-IgnoreEnd diff --git a/tests/test_util.py b/tests/test_util.py index 7790cace1..ab00bd213 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,18 +1,16 @@ # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. -# SPDX-FileCopyrightText: © 2020 Liferay, Inc. -# SPDX-FileCopyrightText: 2022 Nico Rikken -# SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker +# SPDX-FileCopyrightText: 2022 Florian Snow +# SPDX-FileCopyrightText: 2022 Nico Rikken # SPDX-FileCopyrightText: 2022 Pietro Albini +# SPDX-FileCopyrightText: 2024 Rivos Inc. +# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._util""" -# pylint: disable=protected-access,invalid-name - import os -import shutil from argparse import ArgumentTypeError from inspect import cleandoc from io import BytesIO @@ -20,32 +18,11 @@ import pytest from boolean.boolean import ParseError -from debian.copyright import Copyright -from debian.copyright import Error as DebianError -from license_expression import LicenseSymbol +from conftest import no_root, posix from reuse import _util from reuse._util import _LICENSING -try: - import pwd - - is_root = pwd.getpwuid(os.getuid()).pw_name == "root" - is_posix = True -except ImportError: - is_root = False - is_posix = False - - -git = pytest.mark.skipif(not _util.GIT_EXE, reason="requires git") -no_root = pytest.mark.xfail(is_root, reason="fails when user is root") -posix = pytest.mark.skipif(not is_posix, reason="Windows not supported") - - -TESTS_DIRECTORY = Path(__file__).parent.resolve() -RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" - - # REUSE-IgnoreStart @@ -392,60 +369,6 @@ def test_filter_ignore_block_with_multiple_ignore_blocks(): assert result == expected -def test_parse_dep5_simple(fake_repository): - """No error if everything is good.""" - result = _util._parse_dep5(fake_repository / ".reuse/dep5") - assert result.__class__ == Copyright - - -def test_parse_dep5_not_exists(empty_directory): - """Raise FileNotFoundError if .reuse/dep5 doesn't exist.""" - with pytest.raises(FileNotFoundError): - _util._parse_dep5(empty_directory / "foo") - - -def test_parse_dep5_unicode_decode_error(fake_repository): - """Raise UnicodeDecodeError if file can't be decoded as utf-8.""" - shutil.copy(RESOURCES_DIRECTORY / "fsfe.png", fake_repository / "fsfe.png") - with pytest.raises(UnicodeDecodeError): - _util._parse_dep5(fake_repository / "fsfe.png") - - -def test_parse_dep5_parse_error(empty_directory): - """Raise DebianError on parse error.""" - (empty_directory / "foo").write_text("foo") - with pytest.raises(DebianError): - _util._parse_dep5(empty_directory / "foo") - - -def test_parse_dep5_double_copyright_parse_error(empty_directory): - """Raise DebianError on double Copyright lines.""" - (empty_directory / "foo").write_text( - cleandoc( - """ - Format: something - Upstream-Name: example - Upstream-Contact: Jane Doe - Source: https://example.com - - Files: * - Copyright: Jane Doe - Copyright: John Doe - License: MIT - """ - ) - ) - with pytest.raises(DebianError): - _util._parse_dep5(empty_directory / "foo") - - -def test_copyright_from_dep5(dep5_copyright): - """Verify that the glob in the dep5 file is matched.""" - result = _util._copyright_from_dep5("doc/foo.rst", dep5_copyright) - assert LicenseSymbol("CC0-1.0") in result.spdx_expressions - assert "2017 Jane Doe" in result.copyright_lines - - def test_make_copyright_line_simple(): """Given a simple statement, make it a copyright line.""" assert _util.make_copyright_line("hello") == "SPDX-FileCopyrightText: hello" @@ -459,64 +382,64 @@ def test_make_copyright_line_year(): ) -def test_make_copyright_line_style_spdx(): - """Given a simple statement and style, make it a copyright line.""" - statement = _util.make_copyright_line("hello", copyright_style="spdx") +def test_make_copyright_line_prefix_spdx(): + """Given a simple statement and prefix, make it a copyright line.""" + statement = _util.make_copyright_line("hello", copyright_prefix="spdx") assert statement == "SPDX-FileCopyrightText: hello" -def test_make_copyright_line_style_spdx_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_spdx_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="spdx" + "hello", year=2019, copyright_prefix="spdx" ) assert statement == "SPDX-FileCopyrightText: 2019 hello" -def test_make_copyright_line_style_spdx_c_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_spdx_c_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="spdx-c" + "hello", year=2019, copyright_prefix="spdx-c" ) assert statement == "SPDX-FileCopyrightText: (C) 2019 hello" -def test_make_copyright_line_style_spdx_symbol_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_spdx_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="spdx-symbol" + "hello", year=2019, copyright_prefix="spdx-symbol" ) assert statement == "SPDX-FileCopyrightText: © 2019 hello" -def test_make_copyright_line_style_string_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_string_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="string" + "hello", year=2019, copyright_prefix="string" ) assert statement == "Copyright 2019 hello" -def test_make_copyright_line_style_string_c_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_string_c_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="string-c" + "hello", year=2019, copyright_prefix="string-c" ) assert statement == "Copyright (C) 2019 hello" -def test_make_copyright_line_style_string_symbol_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_string_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="string-symbol" + "hello", year=2019, copyright_prefix="string-symbol" ) assert statement == "Copyright © 2019 hello" -def test_make_copyright_line_style_symbol_year(): - """Given a simple statement, style and a year, make it a copyright line.""" +def test_make_copyright_line_prefix_symbol_year(): + """Given a simple statement, prefix and a year, make it a copyright line.""" statement = _util.make_copyright_line( - "hello", year=2019, copyright_style="symbol" + "hello", year=2019, copyright_prefix="symbol" ) assert statement == "© 2019 hello"