pax_global_header00006660000000000000000000000064144554512130014516gustar00rootroot0000000000000052 comment=a86a96a68daeb2c5c240e70758e76251505f86dc reuse-tool-2.1.0/000077500000000000000000000000001445545121300136145ustar00rootroot00000000000000reuse-tool-2.1.0/.bumpversion.cfg000066400000000000000000000011421445545121300167220ustar00rootroot00000000000000[bumpversion] current_version = 2.1.0 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} reuse-tool-2.1.0/.editorconfig000066400000000000000000000005441445545121300162740ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later root = true [*] indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf [*.{rst,md,yaml,yml,json}] indent_size = 2 [Makefile] indent_style = tab reuse-tool-2.1.0/.github/000077500000000000000000000000001445545121300151545ustar00rootroot00000000000000reuse-tool-2.1.0/.github/workflows/000077500000000000000000000000001445545121300172115ustar00rootroot00000000000000reuse-tool-2.1.0/.github/workflows/docker.yaml000066400000000000000000000163071445545121300213530ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later name: Docker Images - test, build and push on: push: # Tags will carry the tag's version, e.g. v1.2.3: # - 1.2.3 # - 1.2 # - 1 (not with 0 though) # - latest" tags: - "v*.*.*" # Main branch will be "dev" branches: - main # On PRs only do tests pull_request: jobs: # =========================================================================== # Test Docker images # =========================================================================== docker_test: name: Test the docker images runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 # Dockerfile - name: Build Dockerfile run: | docker build -t reuse -f docker/Dockerfile . - name: Run Docker image run: | docker run -v "$(pwd):/data" reuse # Dockerfile-extra - name: Build Dockerfile-extra run: | docker build -t reuse-extra -f docker/Dockerfile-extra . - name: Run Docker extra image run: | docker run -v "$(pwd):/data" reuse-extra # Dockerfile-debian - name: Build Dockerfile-debian run: | docker build -t reuse-debian -f docker/Dockerfile-debian . - name: Run Docker debian image run: | docker run -v "$(pwd):/data" reuse-debian # =========================================================================== # Build and push Docker images for tagged releases # =========================================================================== docker_push_tag: name: Push Docker image for tags to Docker Hub runs-on: ubuntu-latest # Depends on successful Docker build/test needs: - docker_test if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/v') }} steps: - name: Check out the repo uses: actions/checkout@v2 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Log in to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} # Dockerfile - name: Default Docker - set metadata id: meta_default uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }} - name: Default Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_default.outputs.tags }} labels: ${{ steps.meta_default.outputs.labels }} # Dockerfile-extra - name: Extra Docker - set metadata id: meta_extra uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }} flavor: | suffix=-extra,onlatest=true - name: Extra Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile-extra platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_extra.outputs.tags }} labels: ${{ steps.meta_extra.outputs.labels }} # Dockerfile-debian - name: Debian Docker - set metadata id: meta_debian uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }} flavor: | suffix=-debian,onlatest=true - name: Debian Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile-debian platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_debian.outputs.tags }} labels: ${{ steps.meta_debian.outputs.labels }} # =========================================================================== # Build and push Docker images for main branch updated (dev tag) # =========================================================================== docker_push_dev: name: Push Docker image for main branch to Docker Hub runs-on: ubuntu-latest # Depends on successful Docker build/test needs: - docker_test if: ${{ github.event_name != 'pull_request' && ( github.ref == 'refs/heads/main' ) }} steps: - name: Check out the repo uses: actions/checkout@v2 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Log in to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} # Dockerfile - name: Default Docker - set metadata id: meta_default uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=raw,value=dev - name: Default Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_default.outputs.tags }} labels: ${{ steps.meta_default.outputs.labels }} # Dockerfile-extra - name: Extra Docker - set metadata id: meta_extra uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=raw,value=dev-extra - name: Extra Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile-extra platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_extra.outputs.tags }} labels: ${{ steps.meta_extra.outputs.labels }} # Dockerfile-debian - name: Debian Docker - set metadata id: meta_debian uses: docker/metadata-action@v3 with: images: fsfe/reuse tags: | type=raw,value=dev-debian - name: Debian Docker - build and push uses: docker/build-push-action@v2 with: context: . file: ./docker/Dockerfile-debian platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta_debian.outputs.tags }} labels: ${{ steps.meta_debian.outputs.labels }} reuse-tool-2.1.0/.github/workflows/gettext.yaml000066400000000000000000000026041445545121300215630ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later name: Update .pot file on: push: branches: - main paths: - "src/reuse/**.py" jobs: create-pot: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 with: fetch-depth: 1 # The main branch is protected. fsfe-system has been granted an # 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: Create .pot file run: make create-pot # Normally, POT-Creation-Date changes in two locations. Check if the diff # includes more than just those two lines. - name: Check if sufficient lines were changed id: diff run: echo "changed=$(git diff -U0 | grep '^[+|-][^+|-]' | grep -Ev '^[+-]"POT-Creation-Date' | wc -l)" >> $GITHUB_OUTPUT - name: Commit and push updated reuse.pot if: ${{ steps.diff.outputs.changed != '0' }} run: | git config --global user.name "fsfe-system" git config --global user.email "<>" git add po/reuse.pot po/*.po git commit -m "Update reuse.pot" git push origin main reuse-tool-2.1.0/.github/workflows/license_list_up_to_date.py000066400000000000000000000042211445545121300244420ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later """A simple script that checks whether the license lists in reuse are up-to-date. For convenience, also overwrite the files. """ import argparse import json import sys import urllib.request from pathlib import Path API_URL = "https://api.github.com/repos/spdx/license-list-data/releases/latest" URLS = { # pylint: disable=line-too-long "exceptions.json": "https://raw.githubusercontent.com/spdx/license-list-data/{tag}/json/exceptions.json", "licenses.json": "https://raw.githubusercontent.com/spdx/license-list-data/{tag}/json/licenses.json", } # Fetch arguments parser = argparse.ArgumentParser( description="Check and update included SPDX licenses and exceptions" ) parser.add_argument( "-d", "--download", action="store_true", help="if newer licenses/exceptions are found, download them to the repo", ) args = parser.parse_args() def latest_tag(): """Find out the tag name of latest stable release of the repo""" with urllib.request.urlopen(API_URL) as response: contents = response.read().decode("utf-8") dictionary = json.loads(contents) return dictionary["tag_name"] def main(args_): """Compare local and remote files, and download if not matching""" result = 0 tag = latest_tag() print(f"spdx-license-list-data latest version is {tag}") for file_, url in URLS.items(): url = url.format(tag=tag) path = Path(f"src/reuse/resources/{file_}") local_contents = path.read_text(encoding="utf-8") with urllib.request.urlopen(url) as response: remote_contents = response.read().decode("utf-8") if remote_contents == local_contents: print(f"{file_} is up-to-date") else: if args_.download: print(f"{file_} is not up-to-date, downloading newer release") path.write_text(remote_contents, encoding="utf-8") else: result = 1 print(f"{file_} is not up-to-date") return result if __name__ == "__main__": sys.exit(main(args)) reuse-tool-2.1.0/.github/workflows/license_list_up_to_date.yaml000066400000000000000000000011301445545121300247500ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later name: Verify that the license lists are up-to-date on: schedule: - cron: "0 9 * * *" jobs: license-list-up-to-date: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v1 with: python-version: 3.x - name: Verify that the license lists are up-to-date run: | python .github/workflows/license_list_up_to_date.py reuse-tool-2.1.0/.github/workflows/test.yaml000066400000000000000000000071301445545121300210550ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2023 DB Systel GmbH # # SPDX-License-Identifier: GPL-3.0-or-later name: Test suites on: push: branches: - main pull_request: jobs: test: runs-on: ${{ matrix.os }} strategy: max-parallel: 10 # do not abort the whole test job if one combination in the matrix fails fail-fast: false matrix: python-version: ["3.8", "3.9", "3.10", "3.11"] os: [ubuntu-20.04] include: - python-version: "3.8" os: macos-latest - python-version: "3.8" os: windows-latest steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | pip install poetry poetry install --no-interaction - name: Run tests with pytest run: | # Re-enable this once # https://github.com/pytest-dev/pytest-cov/issues/564 is resolved. # poetry run pytest --cov=reuse poetry run pytest pylint: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry poetry install --no-interaction - name: Lint with Pylint run: | poetry run pylint src/reuse/ tests/ black: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry poetry install --no-interaction - name: Test formatting with black run: | poetry run isort --check src/ tests/ poetry run black . mypy: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.7 - name: Install dependencies run: | pip install poetry poetry install --no-interaction - name: Test typing with mypy run: | poetry run mypy prettier: runs-on: ubuntu-20.04 container: node:latest steps: - uses: actions/checkout@v2 - name: Install prettier run: npm install prettier@2.7.1 - name: Run prettier run: npx prettier --check . reuse: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-20.04, macos-latest, windows-latest] steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry poetry install --no-interaction --no-dev - name: Test REUSE compliance run: | make reuse docs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry pip install -r docs/requirements.txt - name: Create docs with Sphinx run: | make docs-ci reuse-tool-2.1.0/.github/workflows/third_party_lint.py000066400000000000000000000077041445545121300231520ustar00rootroot00000000000000#!/usr/bin/env python3 # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """Lint 3rd party repositories""" import argparse import shutil import subprocess import sys import tempfile from pathlib import Path from git import Repo CLONE_DIR = Path(tempfile.gettempdir()) / "reuse-third-party" DEFAULT_REPOS = { "https://github.com/fsfe/reuse-example": {}, "https://github.com/curl/curl": {}, "https://github.com/spdx/license-list-XML": {"expect-failure": True}, } def rm_fr(path): """Force-remove directory.""" path = Path(path) if path.exists(): shutil.rmtree(path) def lint_repo(repo, force_clone=False, expect_failure=False, json=False): """Meta function to clone and lint a repository, start to finish.""" # The sanitation only works on Linux. If we want to do this 'properly', we # should use the pathvalidate dependency. repo_dir = Path(f"{CLONE_DIR}/{repo.replace('/', '_')}") if force_clone: rm_fr(repo_dir) # Clone repo if not repo_dir.exists(): print(f"[INFO] Cloning {repo} to {repo_dir}") repo_git = Repo.clone_from( repo, repo_dir, # Shallow clone. depth=1, ) else: print(f"[INFO] Not cloning {repo} as it exists locally.") repo_git = Repo(repo_dir) # Get last commit of repo repo_sha = repo_git.head.object.hexsha # Lint repo print(f"[INFO] Start linting of {repo} (commit {repo_sha})") lint_result = subprocess.run( ["reuse", "--root", repo_dir, "lint", "--json"], capture_output=True, check=False, ) if json: print(lint_result.stdout.decode("utf-8")) print() if lint_result.returncode != 0 and not expect_failure: print(f"[ERROR] Linting {repo} failed unexpectedly") elif lint_result.returncode == 0 and expect_failure: print(f"[ERROR] Linting {repo} succeeded unexpectedly") elif lint_result.returncode != 0 and expect_failure: print(f"[OK] Linting {repo} failed expectedly") elif lint_result.returncode == 0 and not expect_failure: print(f"[OK] Linting {repo} succeeded expectedly") return lint_result def main(args): """Main function""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "-f", "--force", action="store_true", help="force re-clone of third-party repositories", ) parser.add_argument( "--json", action="store_true", help="show json output of lint", ) parser.add_argument( "--expect-failure", action="store_true", help="expect the lint to fail", ) mutex_group = parser.add_mutually_exclusive_group(required=True) mutex_group.add_argument( "repo", help="link to repository", nargs="?", ) mutex_group.add_argument( "--defaults", action="store_true", help="run against some default repositories", ) args = parser.parse_args() total_lint_fails = 0 if args.defaults: for repo, settings in DEFAULT_REPOS.items(): expect_failure = ( settings.get("expect-failure") or args.expect_failure ) result = lint_repo( repo, force_clone=args.force, expect_failure=expect_failure, json=args.json, ) if result.returncode and not expect_failure: total_lint_fails += 1 else: result = lint_repo( args.repo, force_clone=args.force, expect_failure=args.expect_failure, json=args.json, ) if result.returncode and not args.expect_failure: total_lint_fails += 1 return total_lint_fails if __name__ == "__main__": sys.exit(main(sys.argv[1:])) reuse-tool-2.1.0/.github/workflows/third_party_lint.yaml000066400000000000000000000040101445545121300234470ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later # Build reuse-tool and lint 3rd party repositories for which we know that they # are reliably REUSE compliant, rather complex, use several annotation # strategies, and are quite popular. This shall prevent that we introduce # unforeseen and unintended breaking changes. name: Lint 3rd party repositories on: push: branches: - main pull_request: jobs: third-party-lint: runs-on: ubuntu-latest strategy: # do not abort the whole test job if one combination in the matrix fails fail-fast: false matrix: repo: [ "https://github.com/fsfe/reuse-example", "https://github.com/curl/curl", ] steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry poetry install --no-interaction # Clone and lint repositories - name: Clone and lint repositories run: poetry run python .github/workflows/third_party_lint.py --json ${{ matrix.repo }} third-party-lint-expect-failure: runs-on: ubuntu-latest strategy: # do not abort the whole test job if one combination in the matrix fails fail-fast: false matrix: repo: ["https://github.com/spdx/license-list-XML"] steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install dependencies run: | pip install poetry poetry install --no-interaction # Clone and lint repositories - name: Clone and lint repositories run: poetry run python .github/workflows/third_party_lint.py --json --expect-failure ${{ matrix.repo }} reuse-tool-2.1.0/.gitignore000066400000000000000000000046331445545121300156120ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: CC0-1.0 # Created by https://www.gitignore.io/api/linux,python # Edit at https://www.gitignore.io/?templates=linux,python ### Linux ### *~ # temporary files which can be created if a process still has a handle open of a deleted file .fuse_hidden* # KDE directory preferences .directory # Linux trash folder which might appear on any partition or disk .Trash-* # .nfs files are created when an open file is removed but is still being accessed .nfs* ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don’t work, or not # install all needed dependencies. #Pipfile.lock # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # End of https://www.gitignore.io/api/linux,python po/reuse.pot *.mo docs/api/ docs/history.md docs/readme.md docs/contributing.md prof/ # Nix-related .direnv/ result .envrc reuse-tool-2.1.0/.pre-commit-config.yaml000066400000000000000000000017661445545121300201070ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later repos: - repo: https://github.com/psf/black rev: 22.8.0 hooks: - id: black - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: - id: isort name: isort (python) types: [python] - id: isort name: isort (cython) types: [cython] - id: isort name: isort (pyi) types: [pyi] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.2.0 hooks: - id: mypy - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.7.1 hooks: - id: prettier name: prettier - repo: local hooks: - id: pylint name: pylint entry: poetry run pylint language: system types: [python] exclude: ^docs/ args: [ "-rn", # Only display messages "-sn", # Don't display the score ] reuse-tool-2.1.0/.pre-commit-hooks.yaml000066400000000000000000000005221445545121300177520ustar00rootroot00000000000000# SPDX-FileCopyrightText: © 2020 Liferay, Inc. # # SPDX-License-Identifier: GPL-3.0-or-later - id: reuse name: reuse entry: reuse args: ["lint"] language: python pass_filenames: false description: "Lint the project directory for compliance with the REUSE Specification" language_version: python3 reuse-tool-2.1.0/.prettierignore000066400000000000000000000005051445545121300166570ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later # SPDX resources /src/reuse/resources/*.json # Additional paths in which third-party code/files are located .env .pytest_cache/ .tox/ .venv build/ dist/ docs/_build/ env.bak/ env/ ENV/ venv.bak/ venv/ reuse-tool-2.1.0/.prettierrc.yaml000066400000000000000000000005651445545121300167470ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later printWidth: 80 proseWrap: always useTabs: false tabWidth: 4 overrides: # Identical to file types specified in .editorconfig - files: - "*.rst" - "*.md" - "*.yaml" - "*.yml" - "*.json" options: tabWidth: 2 reuse-tool-2.1.0/.pylintrc000066400000000000000000000043311445545121300154620ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later [MASTER] jobs=0 [MESSAGES CONTROL] disable=duplicate-code, logging-fstring-interpolation, implicit-str-concat enable=useless-suppression [REPORTS] output-format=text reports=no [FORMAT] expected-line-ending-format=LF ignore-long-lines=^\s*(# )??$|^# SPDX-.*$ indent-after-paren=4 indent-string=' ' max-line-length=80 single-line-if-stmt=no [REFACTORING] max-nested-blocks=4 never-returning-functions=sys.exit [BASIC] argument-naming-style=snake_case attr-naming-style=snake_case bad-names=foo, bar, baz, toto, tutu, tata class-attribute-rgx=^[a-z0-9_]*$|^[A-Z0-9_]*$ class-naming-style=PascalCase const-naming-style=UPPER_CASE docstring-min-length=3 function-naming-style=snake_case good-names=i,j,k,ex,Run,_,fp inlinevar-naming-style=snake_case method-naming-style=snake_case module-naming-style=snake_case variable-naming-style=snake_case [MISCELLANEOUS] notes=FIXME,XXX [SIMILARITIES] ignore-comments=yes ignore-docstrings=yes ignore-imports=yes min-similarity-lines=4 [SPELLING] max-spelling-suggestions=4 spelling-store-unknown-words=no [STRING] check-quote-consistency=yes check-str-concat-over-line-jumps=yes [DESIGN] max-args=6 max-attributes=10 max-bool-expr=5 # we probably want to reduce this a bit, after some refactoring max-branches=12 max-locals=15 max-parents=7 max-public-methods=20 max-returns=6 max-statements=50 min-public-methods=1 [IMPORTS] allow-wildcard-with-all=no analyse-fallback-blocks=no deprecated-modules=optparse,tkinter.tix,distutils known-third-party=enchant [CLASSES] defining-attr-methods=__init__, __new__, setUp, __post_init__ exclude-protected=_asdict, _fields, _replace, _source, _make valid-classmethod-first-arg=cls valid-metaclass-classmethod-first-arg=cls [EXCEPTIONS] overgeneral-exceptions=builtins.BaseException, builtins.Exception reuse-tool-2.1.0/.readthedocs.yaml000066400000000000000000000007721445545121300170510ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: CC0-1.0 version: 2 build: # This should mirror the configuration in ./.github/workflows/pythonpackage.yaml os: "ubuntu-20.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 sphinx: configuration: docs/conf.py reuse-tool-2.1.0/.reuse/000077500000000000000000000000001445545121300150155ustar00rootroot00000000000000reuse-tool-2.1.0/.reuse/dep5000066400000000000000000000022021445545121300155710ustar00rootroot00000000000000Format: 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 reuse-tool-2.1.0/AUTHORS.rst000066400000000000000000000034261445545121300155000ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-FileCopyrightText: 2017 Sebastian Schuberth SPDX-License-Identifier: CC-BY-SA-4.0 ======= Credits ======= Development Lead ---------------- - Carmen Bianca Bakker Contributors ------------ - Sebastian Schuberth - Max Mehl - Matija Šuklje - Greg Kroah-Hartman - Basil Peace - Keith Maxwell - Stefan Bakker - Kirill Elagin - John Mulligan - Tuomas Siipola - Diego Elio Pettenò - David Alfonso - Maximilian Dolling - yoctocell - Tuomas Siipola - Gri-ffin - Nico Rikken - Florian Snow - Linus Sehn - Yaman Qalieh - Pietro Albini - Stefan Hynek - roberto-red 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 reuse-tool-2.1.0/CHANGELOG.md000066400000000000000000000766241445545121300154440ustar00rootroot00000000000000 # Change log This change log follows the [Keep a Changelog](http://keepachangelog.com/) spec. Every release contains the following sections: - `Added` for new features. - `Changed` for changes in existing functionality. - `Deprecated` for soon-to-be removed features. - `Removed` for now removed features. - `Fixed` for any bug fixes. - `Security` in case of vulnerabilities. The versions follow [semantic versioning](https://semver.org) for the `reuse` CLI command and its behaviour. There are no guarantees of stability for the `reuse` Python library. ## Unreleased - YYYY-MM-DD ### Added ### Changed ### Deprecated ### Removed ### Fixed ### Security ## 2.1.0 - 2023-07-18 After the yanked 2.0.0 release, we're excited to announce our latest major version packed with new features and improvements! We've expanded our file type recognition, now including Fennel, CommonJS, Qt .pro, .pri, .qrc, .qss, .ui, Textile, Visual Studio Code workspace, Application Resource Bundle, Svelte components, AES encrypted files, Jakarta Server Page, Clang format, Browserslist config, Prettier config and ignored files, Flutter pubspec.lock, .metadata, Terraform and HCL, Typst and more. We've also added the ability to detect SPDX snippet tags in files and introduced additional license metadata for the Python package. A new `--json` flag has been added to the `lint` command, marking the first step towards better integration of REUSE output with other tools. On the changes front, we've bumped the SPDX license list to v3.21 and made significant updates to our Sphinx documentation. Please note that Python 3.6 and 3.7 support has been dropped in this release. We've fixed several issues including automatic generation of Sphinx documentation via readthedocs.io and a compatibility issue where reuse could not be installed if gettext is not installed. This update is all about making your experience better. Enjoy adding copyright and licensing information to your code! ### Added - Detect SPDX snippet tags in files. (#699) - More file types are recognised: - Fennel (`.fnl`) (#638) - CommonJS (`.cjs`) (#632) - Qt .pro (`.pro`) (#632) - Qt .pri (`.pri`) (#755) - Qt .qrc (`.qrc`) (#755) - Qt .qss(`.qss`) (#755) - Qt .ui (`.ui`) (#755) - Textile (`.textile`) (#712) - Visual Studio Code workspace (`.code-workspace`) (#747) - Application Resource Bundle (`.arb`) (#749) - Svelte components (`.svelte`) - AES encrypted files (`.aes`) (#758) - Jakarte Server Page (`.jsp`) (#757) - Clang format (`.clang-format`) (#632) - Browserslist config (`.browserslist`) - Prettier config (`.prettierrc`) and ignored files (`.prettierignore`) - Flutter pubspec.lock (`pubspec.lock`) (#751) - Flutter .metadata (`.metadata`) (#751) - Terraform (`.tf`, `tfvars`) and HCL (`.hcl`). (#756) - Typst (`.typ`) - Added loglevel argument to pytest and skip one test if loglevel is too high (#645). - `--add-license-concluded`, `--creator-person`, and `--creator-organization` added to `reuse spdx`. (#623) - Additional license metadata for the Python package has been added. The actual SPDX license expression remains the same: `Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND GPL-3.0-or-later`. (#733) - Added `--contributor` option to `annotate`. (#669) - Added `--json` flag to `lint` command (#654). - `reuse.ReuseInfo` now has `copy` and `union` methods. (#759) - `reuse.ReuseInfo` now stores information about the source from which the information was gathered. (#654, #787) - Added Ukrainian and Czech translations (#767) - Added `--suppress-deprecation` to hide (verbose) deprecation warnings. (#778) ### Changed - Bumped SPDX license list to v3.20. (#692) - `reuse.SpdxInfo` was renamed to `reuse.ReuseInfo`. It is now a (frozen) dataclass instead of a namedtuple. This is only relevant if you're using reuse as a library in Python. Other functions and methods were similarly renamed. (#669) - Sphinx documentation: Switched from RTD theme to Furo. (#673, #716) - Removed dependency on setuptools' `pkg_resources` to determine the installed version of reuse. (#724) - Bumped SPDX license list to v3.21. (#763) - `Project.reuse_info_of` now returns a list of `ReuseInfo` objects instead of a single one. This is because the source information is now stored alongside the REUSE information. (#787) ### Deprecated - Pending deprecation of aggregation of file sources. Presently, when copyright and licensing information is defined both within e.g. the file itself and in the DEP5 file, then the information is merged or aggregated for the purposes of linting and BOM generation. In the future, this will no longer be the case unless explicitly defined. The exact mechanism for this is not yet concrete, but a `PendingDeprecationWarning` will be shown to the user to make them aware of this. (#778) ### Removed - Python 3.6 and 3.7 support has been dropped. (#673, #759) - Removed runtime and build time dependency on `setuptools`. (#724) ### Fixed - Fixed automatic generation of Sphinx documentation via readthedocs.io by adding a `.readthedocs.yaml` configuration file (#648) - Fixed a compatibility issue where reuse could not be installed (built) if gettext is not installed. (#691) - Translations are available in Docker images. (#701) - Marked the `/data` directory in Docker containers as safe in Git, preventing errors related to linting Git repositories. (#720) - Repaired error when using Galician translations. (#719) ### Security ## 2.0.0 - 2023-06-21 [YANKED] This version was yanked because of an unanticipated workflow that we broke. The breaking change is the fact that an order of precedence was defined for copyright and licensing information sources. For instance, if a file contained the `SPDX-License-Identifier` tag, and if that file was also (explicitly or implicitly) covered by DEP5, then the information from the DEP5 setting would no longer apply to that file. While the intention of the breaking change was sound (don't mix information sources; define a single source of truth), there were legitimate use-cases that were broken as a result of this. Apologies to everyone whose CI broke. We'll get this one right before long. ## 1.1.2 - 2023-02-09 ### Fixed - Note to maintainers: It is now possible/easier to use the `build` module to build this module. Previously, there was a namespace conflict. (#640) ## 1.1.1 - 2023-02-05 ### Fixed - Don't include documentation files (e.g. `README.md`) in top-level (i.e., `site-packages/`). (#657) - Include documentation directory in sdist. (#657) ## 1.1.0 - 2022-12-01 ### Added - Added support for Python 3.11. (#603) - More file types are recognised: - Kotlin script (`.kts`) - Android Interface Definition Language (`.aidl`) - Certificate files (`.pem`) - Added comment styles: - Apache Velocity Template (Extensions: `.vm`, `.vtl`) (#554) - XQuery comment style (Extensions: `.xq(l|m|y|uery|)`) (#610) - Some special endings are always stripped from copyright and licensing statements (#602): - `">` (and variations such as `'>`, `" >`, and `"/>`) - `] ::` ### Changed - Removed `setup.py` and replaced it with a Poetry configuration. Maintainers beware. (#600) - Updated PyPI development status to 'production/stable' (#381) - The pre-commit hook now passes `lint` as an overridable argument. (#574) - `addheader` has been renamed to `annotate`. The functionality remains the same. (#550) - Bumped SPDX license list to v3.19. ### Deprecated - `addheader` has been deprecated. It still works, but is now undocumented. (#550) ### Removed - `setup.py`. (#600) - Releases to PyPI are no longer GPG-signed. Support for this is not present in Poetry and not planned. (#600) - Dependency on `requests` removed; using `urllib.request` from the standard library instead. (#600) ### Fixed - Repair tests related to CVE-2022-39253 changes in upstream Git. New versions of Git no longer allow `git submodule add repository path` where repository is a file. A flag was added to explicitly allow this in the test framework. (#619) - Sanitize xargs input in scripts documentation. (#525) - License identifiers in comments with symmetrical ASCII art frames are now properly detected (#560) - Fixed an error where copyright statements contained within a multi-line comment style on a single line could not be parsed (#593). - In PHP files, add header after `=0.X.Y` in your requirements.txt, you will get the latest version of `reuse` when you install `fsfe-reuse`. You may like to change the name to `reuse` explicitly, but this is not strictly necessary. - If you depend on `fsfe-reuse==0.X.Y`, then you will keep getting that version. When you bump the version you depend on, you will need to change the name to `reuse`. - If you depend on `fsfe-reuse>=0.X.Y<1.0.0`, then 0.6.0 will be the latest version you receive. In order to get a later version, you will need to change the name to `reuse`. ## 0.6.0 - 2019-11-19 ### Added - `--include-submodules` is added to also include submodules when linting et cetera. - `addheader` now also recognises the following extensions: - .kt - .xml - .yaml - .yml ### Changed - Made the workaround for `MachineReadableFormatError` introduced in 0.5.2 more generic. - Improved shebang detection in `addheader`. - For `addheader`, the SPDX comment block now need not be the first thing in the file. It will find the SPDX comment block and deal with it in-place. - Git submodules are now ignored by default. - `addheader --explicit-license` now no longer breaks on unsupported filetypes. ## 0.5.2 - 2019-10-27 ### Added - `python3 -m reuse` now works. ### Changed - Updated license list to 3.6-2-g2a14810. ### Fixed - Performance of `reuse lint` improved by at least a factor of 2. It no longer does any checksums on files behind the scenes. - Also handle `MachineReadableFormatError` when parsing DEP5 files. Tries to import that error. If the import is unsuccessful, it is handled. ## 0.5.1 - 2019-10-24 [YANKED] This release was replaced by 0.5.2 due to importing `MachineReadableFormatError`, which is not a backwards-compatible change. ## 0.5.0 - 2019-08-29 ### Added - TeX and ML comment styles added. - Added `--year` and `--exclude-year` to `reuse addheader`. - Added `--template` to `reuse addheader`. - Added `--explicit-license` to `reuse addheader`. - `binaryornot` added as new dependency. - Greatly improved the usage documentation. ### Changed - `reuse addheader` now automatically adds the current year to the copyright notice. - `reuse addheader` preserves the original header below the new header if it did not contain any SPDX information. - `reuse addheader` now correctly handles `.license` files. - Bad licenses are no longer resolved to LicenseRef-Unknown. They are instead resolved to the stem of the path. This reduces the magic in the code base. - `.gitkeep` files are now ignored by the tool. - Changed Lisp's comment character from ';;' to ';'. ## 0.4.1 - 2019-08-07 ### Added - `--all` argument help to `reuse download`, which downloads all detected missing licenses. ### Fixed - When using `reuse addheader` on a file that contains a shebang, the shebang is preserved. - Copyright lines in `reuse spdx` are now sorted. - Some publicly visible TODOs were patched away. ## 0.4.0 - 2019-08-07 This release is a major overhaul and refactoring of the tool. Its primary focus is improved usability and speed, as well as adhering to version 3.0 of the REUSE Specification. ### Added - `reuse addheader` has been added as a way to automatically add copyright statements and license identifiers to the headers of files. It is currently not complete. - `reuse init` has been added as a way to initialise a REUSE project. Its functionality is currently scarce, but should improve in the future. ### Changed - `reuse lint` now provides a helpful summary instead of merely spitting out non-compliant files. - `reuse compile` is now `reuse spdx`. - In addition to `Copyright` and `©`, copyright lines can be marked with the tag `SPDX-FileCopyrightText:`. This is the new recommended default. - Project no longer depends on pygit2. - The list of SPDX licenses has been updated. - `Valid-License-Identifier` is no longer used, and licenses and exceptions can now only live inside of the LICENSES/ directory. ### Removed - Removed `--ignore-debian`. - Removed `--spdx-mandatory`, `--copyright-mandatory`, `--ignore-missing` arguments from `reuse lint`. - Remove `reuse license`. - GPL-3.0 and GPL-3.0+ (and all other similar GPL licenses) are no longer detected as SPDX identifiers. Use GPL-3.0-only and GPL-3.0-or-later instead. ### Fixed - Scanning a Git directory is a lot faster now. - Scanning binary files is a lot faster now. ## 0.3.4 - 2019-04-15 This release should be a short-lived one. A new (slightly backwards-incompatible) version is in the works. ### Added - Copyrights can now start with `©` in addition to `Copyright`. The former is now recommended, but they are functionally similar. ### Changed - The source code of reuse is now formatted with black. - The repository has been moved from to . ## 0.3.3 - 2018-07-15 ### Fixed - Any files with the suffix `.spdx` are no longer considered licenses. ## 0.3.2 - 2018-07-15 ### Fixed - The documentation now builds under Python 3.7. ## 0.3.1 - 2018-07-14 ### Fixed - When using reuse from a child directory using pygit2, correctly find the root. ## 0.3.0 - 2018-05-16 ### Changed - The output of `reuse compile` is now deterministic. The files, copyright lines and SPDX expressions are sorted alphabetically. ### Fixed - When a GPL license could not be found, the correct `-only` or `-or-later` extension is now used in the warning message, rather than a bare `GPL-3.0`. - If you have a license listed as `SPDX-Valid-License: GPL-3.0-or-later`, this now correctly matches corresponding SPDX identifiers. Still it is recommended to use `SPDX-Valid-License: GPL-3.0` instead. ## 0.2.0 - 2018-04-17 ### Added - Internationalisation support added. Initial support for: - English. - Dutch. - Esperanto. - Spanish. ### Fixed - The license list of SPDX 3.0 has deprecated `GPL-3.0` and `GPL-3.0+` et al in favour of `GPL-3.0-only` and `GPL-3.0-or-later`. The program has been amended to accommodate sufficiently for those licenses. ### Changed - `Project.reuse_info_of` now extracts, combines and returns information both from the file itself and from debian/copyright. - `ReuseInfo` now holds sets instead of lists. - As a result of this, `ReuseInfo` will not hold duplicates of copyright lines or SPDX expressions. - click removed as dependency. Good old argparse from the library is used instead. ## 0.1.1 - 2017-12-14 ### Changed - The `reuse --help` text has been tidied up a little bit. ### Fixed - Release date in change log fixed. - The PyPI homepage now gets reStructuredText instead of Markdown. ## 0.1.0 - 2017-12-14 ### Added - Successfully parse old-style C and HTML comments now. - Added `reuse compile`, which creates an SPDX bill of materials. - Added `--ignore-missing` to `reuse lint`. - Allow to specify multiple paths to `reuse lint`. - `chardet` added as dependency. - `pygit2` added as soft dependency. reuse remains usable without it, but the performance with `pygit2` is significantly better. Because `pygit2` has a non-Python dependency (`libgit2`), it must be installed independently by the user. In the future, when reuse is packaged natively, this will not be an issue. ### Changed - Updated to version 2.0 of the REUSE recommendations. The most important change is that `License-Filename` is no longer used. Instead, the filename is deducted from `SPDX-License-Identifier`. This change is **NOT** backwards compatible. - The conditions for linting have changed. A file is now non-compliant when: - The license associated with the file could not be found. - There is no SPDX expression associated with the file. - There is no copyright notice associated with the file. - Only read the first 4 KiB (by default) from code files rather than the entire file when searching for SPDX tags. This speeds up the tool a bit. - `Project.reuse_info_of` no longer raises an exception. Instead, it returns an empty `ReuseInfo` object when no reuse information is found. - Logging is a lot prettier now. Only output entries from the `reuse` module. ### Fixed - `reuse --ignore-debian compile` now works as expected. - The tool no longer breaks when reading a file that has a non-UTF-8 encoding. Instead, `chardet` is used to detect the encoding before reading the file. If a file still has errors during decoding, those errors are silently ignored and replaced. ## 0.0.4 - 2017-11-06 ### Fixed - Removed dependency on `os.PathLike` so that Python 3.5 is actually supported ## 0.0.3 - 2017-11-06 ### Fixed - Fixed the link to PyPI in the README. ## 0.0.2 - 2017-11-03 This is a very early development release aimed at distributing the program as soon as possible. Because this is the first release, the changelog is a little empty beyond "created the program". The program can do roughly the following: - Detect the license of a given file through one of three methods (in order of precedence): - Information embedded in the .license file. - Information embedded in its header. - Information from the global debian/copyright file. - Find and report all files in a project tree of which the license could not be found. - Ignore files ignored by Git. - Do some logging into STDERR. reuse-tool-2.1.0/CODE_OF_CONDUCT.md000066400000000000000000000004651445545121300164200ustar00rootroot00000000000000 All activity surrounding this project is covered by the Code of Conduct of the Free Software Foundation Europe, which can be found at . reuse-tool-2.1.0/CONTRIBUTING.md000066400000000000000000000056611445545121300160550ustar00rootroot00000000000000 # Contribution guidelines Any issues or suggestions are welcome at or via e-mail to one of the maintainers. General inquiries can be sent to . ## Code of conduct Interaction within this project is covered by the [FSFE's Code of Conduct](https://fsfe.org/about/codeofconduct). ## 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 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. ## Translation Translations are welcome at . If you need additional help to get started, don't hesitate to get in touch with the maintainers. Broader instructions on how to help the FSFE translate things into local languages can be found at . The translators keep in touch with the mailing list. ## Local development Starting local development is very simple, just execute the following commands: ```bash git clone git@github.com:fsfe/reuse-tool.git cd reuse-tool/ poetry install # You may need to install poetry using your package manager. poetry run pre-commit install # Using poetry is optional here if you already have pre-commit. ``` Next, you'll find the following commands handy: - `poetry run reuse` - `poetry run pytest` - `poetry run pylint src` - `poetry run mypy` - `make docs` ## Development conventions ### 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, especially when generating the `poetry.lock` file. You can `pip install poetry~=1.2.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`. ## Release checklist - Verify changelog - Create branch release-x.y.z - `bumpversion --new-version x.y.z minor` - `make update-resources` - Alter changelog - Do some final tweaks/bugfixes (and alter changelog) - `make test-release` - `pip install -i https://test.pypi.org/simple reuse` and test the package. - Once everything is good, `git tag -s vx.y.z`. Minimal tag message. - `git push origin vx.y.z` - `make release` - `git checkout main` - `git merge release-x.y.z` - `git push origin main` - Create a release on GitHub. - 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) reuse-tool-2.1.0/LICENSES/000077500000000000000000000000001445545121300150215ustar00rootroot00000000000000reuse-tool-2.1.0/LICENSES/Apache-2.0.txt000066400000000000000000000261361445545121300172500ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. reuse-tool-2.1.0/LICENSES/CC-BY-SA-4.0.txt000066400000000000000000000472431445545121300171710ustar00rootroot00000000000000Attribution-ShareAlike 4.0 International ======================================================================= Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= Creative Commons Attribution-ShareAlike 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. Additional offer from the Licensor -- Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter's License You apply. c. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. b. ShareAlike. In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 1. The Adapter's License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. reuse-tool-2.1.0/LICENSES/CC0-1.0.txt000066400000000000000000000156101445545121300164260ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. reuse-tool-2.1.0/LICENSES/GPL-3.0-or-later.txt000066400000000000000000001045151445545121300202330ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . reuse-tool-2.1.0/Makefile000066400000000000000000000062671445545121300152670ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later .DEFAULT_GOAL := help .PHONY: help help: ## show this help message @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' .PHONY: clean clean: clean-build clean-pyc clean-test clean-docs ## remove all build, test, coverage and Python artifacts .PHONY: clean-build clean-build: ## remove build artifacts rm -fr build/ rm -fr dist/ rm -fr .cache/ rm -fr .eggs/ rm -fr pip-wheel-metadata/ find . -name '*.mo' -exec rm -f {} + find . -name '*.egg-info' -exec rm -fr {} + find . -name '*.egg' -exec rm -fr {} + .PHONY: clean-pyc clean-pyc: ## remove Python file artifacts find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + find . -name '__pycache__' -exec rm -fr {} + .PHONY: clean-test clean-test: ## remove test and coverage artifacts rm -f .coverage* rm -fr htmlcov/ rm -fr .pytest_cache/ .PHONY: clean-docs clean-docs: ## remove docs build artifacts -$(MAKE) -C docs clean rm -fr docs/api/ rm -f docs/*.md .PHONY: reuse reuse: dist ## check with self poetry run reuse lint tar -xf dist/reuse*.tar.gz -C dist/ # This prevents the linter from using the project root as root. git init dist/reuse*/ poetry run reuse --root dist/reuse*/ lint .PHONY: lint-third-party lint-third-party: ## Lint selected third-party repositories to compare with expected output poetry run python3 .github/workflows/third_party_lint.py --defaults --json .PHONY: docs 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 .PHONY: dist dist: clean-build clean-pyc clean-docs ## builds source and wheel package poetry build ls -l dist .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 --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 \ msgmerge --output=$${name} $${name} po/reuse.pot; \ done .PHONY: update-po-files update-po-files: create-pot ## update .po files find ./po -name "*.po" -exec msgmerge --width=79 --output={} {} po/reuse.pot \; .PHONY: test-release test-release: ## package and upload to testpypi poetry config repositories.test-pypi https://test.pypi.org/legacy/ # You may need to use `poetry config pypi-token.test-pypi pypi-YYYYYYYY` poetry publish --build -r test-pypi .PHONY: release release: ## package and upload a release # You may need to use `poetry config pypi-token.pypi pypi-YYYYYYYY` poetry publish --build .PHONY: update-resources update-resources: ## update spdx data files python .github/workflows/license_list_up_to_date.py --download reuse-tool-2.1.0/README.md000066400000000000000000000233251445545121300151000ustar00rootroot00000000000000 # reuse [![The latest version of reuse can be found on PyPI.](https://img.shields.io/pypi/v/reuse.svg)](https://pypi.python.org/pypi/reuse) [![Information on what versions of Python reuse supports can be found on PyPI.](https://img.shields.io/pypi/pyversions/reuse.svg)](https://pypi.python.org/pypi/reuse) [![REUSE status](https://api.reuse.software/badge/github.com/fsfe/reuse-tool)](https://api.reuse.software/info/github.com/fsfe/reuse-tool) [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme) [![Packaging status](https://repology.org/badge/tiny-repos/reuse.svg?header=in%20distro%20repos)](https://repology.org/project/reuse/versions) [![Translation status](https://hosted.weblate.org/widgets/fsfe/-/reuse-tool/svg-badge.svg)](https://hosted.weblate.org/projects/fsfe/reuse-tool/) reuse is a tool for compliance with the [REUSE](https://reuse.software/) recommendations. - Documentation: and - Source code: - PyPI: - REUSE: 3.0 - Python: 3.8+ ## Table of contents - [Background](#background) - [Install](#install) - [Usage](#usage) - [Maintainers](#maintainers) - [Contributing](#contributing) - [License](#license) ## Background Copyright and licensing is difficult, especially when reusing software from different projects that are released under various different licenses. [REUSE](https://reuse.software) was started by the [Free Software Foundation Europe](https://fsfe.org) (FSFE) to provide a set of recommendations to make licensing your Free Software projects easier. Not only do these recommendations make it easier for you to declare the licenses under which your works are released, but they also make it easier for a computer to understand how your project is licensed. As a short summary, the recommendations are threefold: 1. Choose and provide licenses 2. Add copyright and licensing information to each file 3. Confirm REUSE compliance You are recommended to read [our tutorial](https://reuse.software/tutorial) for a step-by-step guide through these three steps. The [FAQ](https://reuse.software/faq) covers basic questions about licensing, copyright, and more complex use cases. Advanced users and integrators will find the [full specification](https://reuse.software/spec) helpful. This tool exists to facilitate the developer in complying with the above recommendations. There are [other tools](https://reuse.software/comparison) that have a lot more features and functionality surrounding the analysis and inspection of copyright and licenses in software projects. The REUSE helper tool, on the other hand, is solely designed to be a simple tool to assist in compliance with the REUSE recommendations. ## Install ### Installation via package manager (Recommended) There are packages available for easy install on many operating systems. You are welcome to help us package this tool for more distributions! An automatically generated list can be found at [repology.org](https://repology.org/project/reuse/versions), without any guarantee for completeness. ### Install and run via pipx (Recommended) The following one-liner both installs and runs this tool from [PyPI](https://pypi.org/project/reuse/) via [pipx](https://pypa.github.io/pipx/): ```bash pipx run reuse lint ``` pipx automatically isolates reuse into its own Python virtualenv, which means that it won't interfere with other Python packages, and other Python packages won't interfere with it. If you want to be able to use reuse without prepending it with `pipx run` every time, install it globally like so: ```bash pipx install reuse ``` reuse will then be available in `~/.local/bin`, which must be added to your `$PATH`. After this, make sure that `~/.local/bin` is in your `$PATH`. On Windows, the required path for your environment may look like `%USERPROFILE%\AppData\Roaming\Python\Python39\Scripts`, depending on the Python version you have installed. To upgrade reuse, run this command: ```bash pipx upgrade reuse ``` For full functionality, the following pieces of software are recommended: - Git - Mercurial 4.3+ ### Installation via pip To install reuse into `~/.local/bin`, run: ```bash pip3 install --user reuse ``` Subsequently, make sure that `~/.local/bin` is in your `$PATH` like described in the previous section. To upgrade reuse, run this command: ```bash pip3 install --user --upgrade reuse ``` ### Installation from source You can also install this tool from the source code, but we recommend the methods above for easier and more stable updates. Please make sure the requirements for the installation via pip are present on your machine. ```bash pip install . ``` ## Usage First, read the [REUSE tutorial](https://reuse.software/tutorial/). In a nutshell: 1. Put your licenses in the `LICENSES/` directory. 2. Add a comment header to each file that says `SPDX-License-Identifier: GPL-3.0-or-later`, and `SPDX-FileCopyrightText: $YEAR $NAME`. You can be flexible with the format, just make sure that the line starts with `SPDX-FileCopyrightText:`. 3. Verify your work using this tool. Example of header: ``` # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: CC-BY-SA-4.0 ``` ### CLI 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 :-) ``` This tool can do various more things, detailed in the documentation. Here a short summary: - `annotate` --- Add copyright and/or licensing information to the header of a file. - `download` --- Download the specified license into the `LICENSES/` directory. - `init` --- Set up the project for REUSE compliance. - `lint` --- Verify the project for REUSE compliance. - `spdx` --- Generate an SPDX Document of all files in the project. - `supported-licenses` --- Prints all licenses supported by REUSE. ### Example demo In this screencast, we are going to follow the [tutorial](https://reuse.software/tutorial), making the [REUSE example repository](https://github.com/fsfe/reuse-example/) compliant. ![Demo of some basic REUSE tool commands](https://download.fsfe.org/videos/reuse/screencasts/reuse-tool.gif) ### Run in Docker The `fsfe/reuse` Docker image is available on [Docker Hub](https://hub.docker.com/r/fsfe/reuse). With it, you can easily include REUSE in CI/CD processes. This way, you can check for REUSE compliance for each build. In our [resources for developers](https://reuse.software/dev/) you can learn how to integrate the REUSE tool in Drone, Travis, GitHub, or GitLab CI. You can run the helper tool simply by providing the command you want to run (e.g., `lint`, `spdx`). The image's working directory is `/data` by default. So if you want to lint a project that is in your current working directory, you can mount it on the container's `/data` directory, and tell the tool to lint. That looks a little like this: ```bash docker run --rm --volume $(pwd):/data fsfe/reuse lint ``` You can also provide additional arguments, like so: ```bash docker run --rm --volume $(pwd):/data fsfe/reuse --include-submodules spdx -o out.spdx ``` There are a number of tags available: - `latest` is the most recent stable release. - `dev` follows the `main` branch of this repository. Up-to-date, but potentially unstable. - `latest-extra` has a few extra packages installed, currently `openssh-client`. - `latest-debian` is based on `python:slim`. It is larger, but may be better suited for license compliance. ### Run as pre-commit hook You can automatically run `reuse lint` on every commit as a pre-commit hook for Git. This uses [pre-commit](https://pre-commit.com/). Once you [have it installed](https://pre-commit.com/#install), add this to the `.pre-commit-config.yaml` in your repository: ```yaml repos: - repo: https://github.com/fsfe/reuse-tool rev: v2.1.0 hooks: - id: reuse ``` Then run `pre-commit install`. Now, every time you commit, `reuse lint` is run in the background, and will prevent your commit from going through if there was an error. ## Maintainers - Carmen Bianca Bakker - Max Mehl - Linus Sehn ## Contributing If you're interested in contributing to the reuse project, there are several ways to get involved. Development of the project takes place on GitHub at . There, you can submit bug reports, feature 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. Additionally, the mailing list is available for discussion and support related to the project. You can find the full contribution guidelines at . ## License 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: - All original source code is licensed under GPL-3.0-or-later. - All documentation is licensed under CC-BY-SA-4.0. - Some configuration and data files are licensed under CC0-1.0. - Some code borrowed from [spdx/tools-python](https://github.com/spdx/tools-python) is licensed under Apache-2.0. For more accurate information, check the individual files. reuse-tool-2.1.0/_build.py000066400000000000000000000041751445545121300154330ustar00rootroot00000000000000#!/usr/bin/env python3 # # SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later """Script called by poetry. The API used by poetry is unstable, but let's hope this stays functional. """ import glob import logging import os import shutil import subprocess from pathlib import Path _LOGGER = logging.getLogger(__name__) ROOT_DIR = Path(os.path.dirname(__file__)) BUILD_DIR = ROOT_DIR / "build" PO_DIR = ROOT_DIR / "po" def mkdir_p(path): """Make directory and its parents.""" Path(path).mkdir(parents=True, exist_ok=True) def rm_fr(path): """Force-remove directory.""" path = Path(path) if path.exists(): shutil.rmtree(path) def main(): """Compile .mo files and move them into src directory.""" rm_fr(BUILD_DIR) mkdir_p(BUILD_DIR) msgfmt = None for executable in ["msgfmt", "msgfmt.py", "msgfmt3.py"]: msgfmt = shutil.which(executable) if msgfmt: break if msgfmt: po_files = glob.glob(f"{PO_DIR}/*.po") mo_files = [] # Compile for po_file in po_files: _LOGGER.info(f"compiling {po_file}") lang_dir = ( BUILD_DIR / "reuse/locale" / Path(po_file).stem / "LC_MESSAGES" ) mkdir_p(lang_dir) destination = Path(lang_dir) / "reuse.mo" subprocess.run( [ msgfmt, "-o", str(destination), str(po_file), ], check=True, ) mo_files.append(destination) # Move compiled files into src rm_fr(ROOT_DIR / "src/reuse/locale") for mo_file in mo_files: relative = ( ROOT_DIR / Path("src") / os.path.relpath(mo_file, BUILD_DIR) ) _LOGGER.info(f"copying {mo_file} to {relative}") mkdir_p(relative.parent) shutil.copyfile(mo_file, relative) if __name__ == "__main__": main() reuse-tool-2.1.0/docker/000077500000000000000000000000001445545121300150635ustar00rootroot00000000000000reuse-tool-2.1.0/docker/Dockerfile000066400000000000000000000016401445545121300170560ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later # Create a base image that has dependencies installed. FROM alpine:3.17 AS base RUN apk --no-cache add git mercurial python3 # Build reuse into a virtualenv FROM base AS build RUN apk --no-cache add poetry gettext WORKDIR /reuse-tool COPY . /reuse-tool/ ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN poetry install --no-interaction --no-dev --no-root RUN poetry build --no-interaction RUN pip install dist/*.whl # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN git config --global --add safe.directory /data WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-2.1.0/docker/Dockerfile-debian000066400000000000000000000020771445545121300203030ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # Like normal Dockerfile, but based on python:slim (Debian) to ease compliance # Create a base image that has dependencies installed. FROM python:slim AS base RUN apt-get update \ && apt-get install -y git mercurial \ && rm -rf /var/lib/apt/lists/* # Build reuse into a virtualenv FROM base AS build RUN apt-get update \ && apt-get install -y python3-dev python3-pip gettext \ && rm -rf /var/lib/apt/lists/* RUN pip install poetry WORKDIR /reuse-tool COPY . /reuse-tool/ ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN poetry install --no-interaction --no-dev --no-root RUN poetry build --no-interaction RUN pip install dist/*.whl # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN git config --global --add safe.directory /data WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-2.1.0/docker/Dockerfile-extra000066400000000000000000000016451445545121300202040ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # Like normal Dockerfile, but install additional packages on top # Create a base image that has dependencies installed. FROM alpine:3.17 AS base RUN apk --no-cache add git mercurial python3 openssh-client # Build reuse into a virtualenv FROM base AS build RUN apk --no-cache add poetry gettext WORKDIR /reuse-tool COPY . /reuse-tool/ ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN poetry install --no-interaction --no-dev --no-root RUN poetry build --no-interaction RUN pip install dist/*.whl # Copy over the virtualenv and use it FROM base COPY --from=build /opt/venv /opt/venv ENV VIRTUAL_ENV=/opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN git config --global --add safe.directory /data WORKDIR /data ENTRYPOINT ["reuse"] CMD ["lint"] reuse-tool-2.1.0/docs/000077500000000000000000000000001445545121300145445ustar00rootroot00000000000000reuse-tool-2.1.0/docs/Makefile000066400000000000000000000013101445545121300161770ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = reuse SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @poetry run $(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @poetry run $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) reuse-tool-2.1.0/docs/_static/000077500000000000000000000000001445545121300161725ustar00rootroot00000000000000reuse-tool-2.1.0/docs/_static/.gitkeep000066400000000000000000000000001445545121300176110ustar00rootroot00000000000000reuse-tool-2.1.0/docs/authors.rst000066400000000000000000000002441445545121300167630ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC-BY-SA-4.0 .. include:: ../AUTHORS.rst reuse-tool-2.1.0/docs/conf.py000066400000000000000000000135721445545121300160530ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # # 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. # # 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. # 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 shutil import copyfile sys.path.insert(0, os.path.abspath("../src/")) # -- General configuration ------------------------------------------------ # 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.coverage", "sphinx.ext.viewcode", "sphinx_autodoc_typehints", "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" 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") except PackageNotFoundError: release = "2.1.0" # The short X.Y.Z version. version = ".".join(release.split(".")[:3]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # 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 exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- 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 = [ ( master_doc, "reuse.tex", "reuse Documentation", "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 = [ ( master_doc, "reuse", "reuse Documentation", author, "reuse", "One line description of project.", "Miscellaneous", ) ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {"https://docs.python.org/3/": None} 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") def setup(app): app.connect("builder-inited", copy_markdown) reuse-tool-2.1.0/docs/index.rst000066400000000000000000000012031445545121300164010ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC-BY-SA-4.0 .. reuse documentation master file, created by sphinx-quickstart on Wed Nov 1 14:41:46 2017. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to reuse's documentation! ================================= .. toctree:: :maxdepth: 2 Overview usage scripts contributing authors history API Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` reuse-tool-2.1.0/docs/requirements.txt000066400000000000000000000055151445545121300200360ustar00rootroot00000000000000alabaster==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.7.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-autodoc-typehints==1.23.2 ; 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" reuse-tool-2.1.0/docs/requirements.txt.license000066400000000000000000000001741445545121300214530ustar00rootroot00000000000000SPDX-FileCopyrightText: 2023 2023 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC0-1.0 reuse-tool-2.1.0/docs/reuse-r-only.svg000066400000000000000000000127501445545121300176330ustar00rootroot00000000000000 image/svg+xml reuse-tool-2.1.0/docs/reuse-r-only.svg.license000066400000000000000000000001511445545121300212440ustar00rootroot00000000000000SPDX-FileCopyrightText: 2023 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC-BY-SA-4.0 reuse-tool-2.1.0/docs/scripts.rst000066400000000000000000000132201445545121300167630ustar00rootroot00000000000000.. SPDX-FileCopyrightText: 2022 Nico Rikken SPDX-License-Identifier: CC-BY-SA-4.0 ============== Helper scripts ============== This section contains scripts and snippets to help with the usage of REUSE. REUSE already has a lot of functionality builtin, but there are still cases where REUSE could use support from some external scripts. A typical example is adding SPDX headers based on the information in the version control system. This collection of scripts and snippets offers help for such situations. .. warning:: These scripts help you run REUSE against your codebase. Automatically extracted information might not resemble the truth. The correctness of these scripts is not guaranteed. Use with caution and at your own risk. ****************************** Starting point of the codebase ****************************** The first code contribution can be a worthwhile date to include in the copyright annotation. First commit ============ Git log can show summaries of all commits. At the moment of writing git does not allow selecting just one commit, so ``head`` is used to restrict the output. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --reverse --all | head -n 3 commit cdcea0887e0a85149f93e734b647301a16dd893e Author: Carmen Bianca Bakker Date: Tue Oct 10 18:27:11 2017 +0200 .. SPDX-SnippetEnd Year of first commit ==================== With a custom format just the year of the first commit can be displayed. This output is convenient for use in larger scripts. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --reverse --date="format:%Y" --format="format:%cd" | head -n 1 2017 .. SPDX-SnippetEnd ******* Authors ******* Unless the authors have signed away their copyright to a company or the project, the authors are also the copyright holders of their contributions. So in a lot of cases it is valuable to know the original authors in order to explicitly state these copyright holders. Commit authors ============== Some examples on how to get information about the authors from the codebase. Based on commit order --------------------- Print out the authors known to git in chronological order. Awk is used to filter out subsequent duplicate entries so each entry is shown only for the first appearance. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --reverse --all --format="%aN <%aE>" | awk '!seen[$0]++' Carmen Bianca Bakker carmenbianca Carmen Bianca Bakker ... .. SPDX-SnippetEnd The same command, but now without the email addresses. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --reverse --all --format="%aN" | awk '!seen[$0]++' Carmen Bianca Bakker carmenbianca Sebastian Schuberth ... .. SPDX-SnippetEnd Sorted by name -------------- All authors as known to the version control system, simply sorted by name. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --all --format="%aN <%aE>" | sort | uniq Adam Spiers Ajinkya Patil Alvar <8402811+oxzi@users.noreply.github.com> ... .. SPDX-SnippetEnd The same command, but now without the email addresses. .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --all --format="%aN" | sort | uniq Adam Spiers Ajinkya Patil Alvar ... .. SPDX-SnippetEnd Authors in commit trailers like sign-off ======================================== A sign-off annotation in a commit also contains author details that can be as valuable. .. TODO: improve this oneliner based on built-in Git options as documented in https://stackoverflow.com/a/41361273/12013233 .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git log --all | grep -i 'Signed-off-by\|Co-authored-by' | sort | uniq Co-authored-by: Ethel Morgan Co-authored-by: max.mehl Co-authored-by: Max Mehl Signed-off-by: Carmen Bianca Bakker ... .. SPDX-SnippetEnd *********** Add headers *********** A common use-case is to add headers to existing, modified or newly written code. Add headers to staged files based on git settings ================================================= This script helps you add your copyright headers right before committing the code you wrote. The list of files staged in git can be retrieved using ``git diff --name-only --cached``, which is the basis to apply the ``reuse annotate`` command to. Git user and email address are available through ``git config --get user.name`` and ``git config --get user.email``. REUSE already sets the current year, so there is no need to set that explicitly. These elements can be combined into a single command: .. SPDX-SnippetBegin .. SPDX-Snippet-License-Identifier: CC0-1.0 .. code-block:: console $ git diff --name-only --cached | xargs -I {} reuse annotate -c "$(git config --get user.name) <$(git config --get user.email)>" "{}" .. SPDX-SnippetEnd .. rubric:: Copyright This page is licensed under the `Creative Commons Attribution-ShareAlike 4.0 International license `_. Examples, recipes, and other code in the documentation are additionally licensed under the `Creative Commons Zero v1.0 Universal License `_. reuse-tool-2.1.0/docs/usage.rst000066400000000000000000000305121445545121300164030ustar00rootroot00000000000000===== 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. reuse-tool-2.1.0/docs/usage.rst.license000066400000000000000000000003001445545121300200140ustar00rootroot00000000000000SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. SPDX-FileCopyrightText: © 2020 Liferay, Inc. SPDX-License-Identifier: CC-BY-SA-4.0 reuse-tool-2.1.0/po/000077500000000000000000000000001445545121300142325ustar00rootroot00000000000000reuse-tool-2.1.0/po/POTFILES.in000066400000000000000000000005131445545121300160060ustar00rootroot00000000000000# 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 reuse-tool-2.1.0/po/cs.po000066400000000000000000000745031445545121300152100ustar00rootroot00000000000000# 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. # SPDX-License-Identifier: GPL-3.0-or-later # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-04-12 13:49+0000\n" "Last-Translator: Jiří Podhorecký \n" "Language-Team: Czech \n" "Language: cs\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==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 4.17-dev\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse je nástrojem pro dodržování doporučení REUSE. Další informace " "naleznete na adrese a online dokumentaci na adrese " "." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "Podpořte činnost FSFE:" #: src/reuse/_main.py:47 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 "" "Dary jsou pro naši sílu a nezávislost zásadní. Umožňují nám pokračovat v " "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:70 msgid "enable debug statements" msgstr "povolit příkazy pro ladění" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "nepřeskakovat submoduly systému Git" #: src/reuse/_main.py:85 msgid "do not skip over Meson subprojects" msgstr "nepřeskakovat podprojekty Meson" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "nepoužívat multiprocessing" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "definovat kořen projektu" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit jej" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "dílčí příkazy" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-license is specified, the " "header is placed in a .license file." 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:159 #, fuzzy msgid "deprecated in favor of annotate" msgstr "'reuse addheader' bylo zrušeno ve prospěch 'reuse annotate'" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "inicializace projektu REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "seznam všech nevyhovujících souborů" #: src/reuse/_main.py:204 #, 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 "" "Zkontrolujte soulad adresáře projektu s verzí {reuse_version} specifikace " "REUSE. Nejnovější verzi specifikace najdete na adrese .\n" "\n" "Konkrétně se kontrolují následující kritéria:\n" "\n" "- Jsou v projektu nějaké špatné (nerozpoznané, nevyhovující SPDX) licence?\n" "\n" "- Jsou uvnitř projektu nějaké licence, na které se odkazuje, ale nejsou " "obsaženy v adresáři LICENSES/?\n" "\n" "- Jsou v adresáři LICENSES/ obsaženy licence, které se uvnitř projektu " "nepoužívají?\n" "\n" "- Mají všechny soubory platné informace o autorských právech a licencích?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "seznam všech podporovaných licencí SPDX" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Nepodařilo se analyzovat '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' není soubor" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' není adresář" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "nelze otevřít '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "nelze zapisovat do adresáře '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "nelze zapisovat do '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "nelze číst ani zapisovat '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' není platný výraz SPDX, přeruší se" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' není platný identifikátor licence SPDX." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "Měl jste na mysli:" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Seznam platných identifikátorů licence SPDX naleznete na adrese ." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Licence SPDX Identifikátor licence" #: src/reuse/download.py:93 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:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Chyba: {spdx_identifier} již existuje." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Chyba: Nepodařilo se stáhnout licenci." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Funguje vaše internetové připojení?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Úspěšně stažen {spdx_identifier}." #: src/reuse/download.py:134 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:138 msgid "the following arguments are required: license" msgstr "jsou vyžadovány tyto argumenty: licence" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "nelze použít --output s více než jednou licencí" #: src/reuse/header.py:132 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/header.py:414 #, 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/header.py:421 #, 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/header.py:444 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:" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "Přeskočen nerozpoznaný soubor {path}" #: src/reuse/header.py:509 #, fuzzy, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Přeskočený soubor '{path}' již obsahuje informace SPDX" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Chyba: Nepodařilo se vytvořit komentář pro '{path}'" #: src/reuse/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Úspěšně změněna hlavička {path}" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "prohlášení o autorských právech, opakovatelné" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identifikátor SPDX, opakovatelný" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identifikátor SPDX, opakovatelný" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "rok vydání prohlášení o autorských právech, nepovinné" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "styl komentáře, který se má použít, nepovinné" #: src/reuse/header.py:620 msgid "copyright style to use, optional" msgstr "styl autorských práv, který se má použít, nepovinné" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "název šablony, která se má použít, nepovinné" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "neuvádět rok v prohlášení" #: src/reuse/header.py:637 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/header.py:642 msgid "force single-line comment style, optional" msgstr "vynutit jednořádkový styl komentáře, nepovinné" #: src/reuse/header.py:647 msgid "force multi-line comment style, optional" msgstr "vynutit víceřádkový styl komentáře, nepovinné" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "zapsat soubor .license místo hlavičky uvnitř souboru" #: src/reuse/header.py:664 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/header.py:671 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/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "přeskočit soubory s nerozpoznanými styly komentářů" #: src/reuse/header.py:682 #, fuzzy msgid "skip files that already contain REUSE information" msgstr "přeskočit soubory, které již obsahují informace SPDX" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "'reuse addheader' bylo zrušeno ve prospěch 'reuse annotate'" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "je vyžadována volba --copyright nebo --licence" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "volby --exclude-year a --year se vzájemně vylučují" #: src/reuse/header.py:710 msgid "option --single-line and --multi-line are mutually exclusive" msgstr "volby --single-line a --multi-line se vzájemně vylučují" #: src/reuse/header.py:716 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/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "--explicit-license bylo zrušeno ve prospěch --force-dot-license" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "šablonu {template} se nepodařilo najít" #: src/reuse/header.py:819 #, 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/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "Pod jakou licencí je váš projekt? Uveďte identifikátor licence SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Pod jakou jinou licencí je váš projekt? Uveďte identifikátor licence SPDX." #: src/reuse/init.py:40 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:78 msgid "Project already initialized" msgstr "Projekt je již inicializován" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Inicializace projektu REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Jaký je název projektu?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Jaká je internetová adresa projektu?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Jak se jmenuje správce?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Jaká je e-mailová adresa správce?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Hotovo! Inicializuje se." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Stahování {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} již existuje" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Nelze stáhnout {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Vytvoření .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Inicializace dokončena." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "NEVHODNÉ LICENCE" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' nalezeno v:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "ZASTARALÉ LICENCE" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Následující licence jsou v SPDX zrušeny:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCE BEZ KONCOVKY SOUBORU" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Následující licence nemají příponu souboru:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "CHYBĚJÍCÍ LICENCE" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "NEPOUŽITÉ LICENCE" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Následující licence nejsou používány:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "CHYBY ČTENÍ" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Nelze načíst:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "CHYBĚJÍCÍ INFORMACE O AUTORSKÝCH PRÁVECH A LICENCÍCH" #: src/reuse/lint.py:126 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:137 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:146 msgid "The following files have no licensing information:" msgstr "Následující soubory neobsahují žádné licenční informace:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "SHRNUTÍ" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Neplatné licence:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Zastaralé licence:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licence bez přípony souboru:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Chybějící licence:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Nepoužité licence:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Použité licence:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Chyby čtení: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Soubory s informacemi o autorských právech: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Soubory s licenčními informacemi: {count} / {total}" #: src/reuse/lint.py:190 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:197 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/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' zahrnuto v .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 obsahuje chyby syntaxe" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr ".reuse/dep5 nelze analyzovat jako utf-8" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "určující identifikátor '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} nemá příponu souboru" #: src/reuse/project.py:359 #, 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 "" "Nepodařilo se přeložit identifikátor licence SPDX {path}, přeloženo na " "{identifier}. Zkontrolujte, zda je licence v seznamu licencí nalezeném na " "adrese nebo zda začíná znakem 'LicenseRef-' a " "zda má příponu souboru." #: src/reuse/project.py:371 #, 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/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Nepodařilo se načíst '{path}'" #: src/reuse/report.py:270 #, 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/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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}' neodpovídá běžnému vzoru souboru SPDX. Navrhované konvence pro " "pojmenování najdete zde: https://spdx.github.io/spdx-spec/conformance/#44-" "standard-data-format-requirements" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "použití: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() není definováno" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" s režimem %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nelze otevřít '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nelze sloučit akce - dvě skupiny se jmenují %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' je neplatný argument pro pozicionály" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "neplatný řetězec %(option)r: musí začínat znakem %(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= je vyžadováno pro možnosti jako %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "neplatná hodnota conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "konfliktní volitelný řetězec: %s" msgstr[1] "konfliktní volitelné řetězce: %s" msgstr[2] "konfliktních volitelných řetězců: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "vzájemně se vylučující argumenty musí být nepovinné" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "poziční argumenty" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "nepovinné argumenty" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "zobrazit tuto nápovědu a ukončit" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "nemůže mít více argumentů dílčího parseru" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "neuznané argumenty: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "není povoleno s argumentem %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "ignoroval explicitní argument %r" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "jsou vyžadovány následující argumenty: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "jeden z argumentů %s je povinný" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "očekávaný jeden argument" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "očekává se nejvýše jeden argument" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "očekává se alespoň jeden argument" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "očekáván %s argument" msgstr[1] "očekávány %s argumenty" msgstr[2] "očekáváno %s argumentů" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "neočekávaný volitelný řetězec: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r nelze volat" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "neplatná hodnota %(type)s: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "neplatná volba: %(value)r (vyberte z %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "konfliktní volitelný řetězec: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "konfliktní volitelný řetězec: %s" #, fuzzy #~ msgid "can't open '%s': %s" #~ msgstr "nelze otevřít '{}'" #~ msgid "could not find supported VCS" #~ msgstr "nepodařilo se najít podporovaný VCS" reuse-tool-2.1.0/po/de.po000066400000000000000000000714161445545121300151730ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 Max Mehl # SPDX-FileCopyrightText: 2020 Thomas Doczkal # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse ist ein Werkzeug, um die Empfehlungen von REUSE umzusetzen und zu " "überprüfen. Mehr Informationen finden Sie auf oder " "in der Online-Dokumentation auf ." #: src/reuse/_main.py:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Diese Version von reuse ist kompatibel mit Version {} der REUSE-" "Spezifikation." #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "Die Arbeit der FSFE unterstützen:" #: src/reuse/_main.py:47 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 "" "Spenden sind entscheidend für unsere Leistungsfähigkeit und Autonomie. Sie " "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:70 msgid "enable debug statements" msgstr "Debug-Statements aktivieren" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "Git-Submodules nicht überspringen" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "Git-Submodules nicht überspringen" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "kein Multiprocessing verwenden" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "Stammverzeichnis des Projekts bestimmen" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "zeige die Versionsnummer des Programms und beende" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "Unterkommandos" #: src/reuse/_main.py:113 msgid "add copyright and licensing into the header of files" msgstr "" "schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von Dateien" #: src/reuse/_main.py:116 #, 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 --explicit-license is specified, the " "header is placed in a .license file." msgstr "" "Schreibe Urheberrechts- und Lizenzinformationen in die Kopfzeilen von einer " "oder mehr Dateien.\n" "\n" "Mit der Benutzung von --copyright und --license können Sie bestimmen, welche " "Urheber und Lizenzen Sie in die Kopfzeilen der jeweiligen Dateien " "hinzufügen.\n" "\n" "Der Kommentarstil wird normalerweise automatisch erkannt. Wenn das nicht der " "Fall ist, endet der Vorgang. Benutzen Sie --style um einen Kommentarstil zu " "bestimmen oder zu forcieren.\n" "\n" "Sie können die Vorlage für die Kopfzeilen-Kommentare mit --template ändern. " "Erstellen Sie dazu eine Jinja2-Vorlage in .reuse/templates/mytemplate." "jinja2. Sie können die Vorlage verwenden mithilfe von '--template " "mytemplate'. Mehr Informationen zu dieser Funktion in der Online-" "Dokumentation.\n" "\n" "Wenn eine Binärdatei erkannt wurde, oder wenn --explicit-license verwendet " "wurde, werden die Kopfzeilen in einer .license-Datei gespeichert.\n" "\n" "WICHTIG: Diese Funktion ist momentan EXPERIMENTELL!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "REUSE-Projekt initialisieren" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "alle nicht-konformen Dateien zeigen" #: src/reuse/_main.py:204 #, 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 "" "Überprüfen Sie das Projektverzeichnis auf die Einhaltung der Version " "{reuse_version} der REUSE-Spezifikation. Die neueste Version der " "Spezifikation finden Sie unter .\n" "\n" "Im Einzelnen werden die folgenden Kriterien geprüft:\n" "\n" "- Sind im Projekt schlechte (nicht erkannte, nicht SPDX-konforme) Lizenzen " "vorhanden?\n" "\n" "- Gibt es Lizenzen, auf die innerhalb des Projekts verwiesen wird, die aber " "nicht im Verzeichnis LICENSES/ enthalten sind?\n" "\n" "- Sind Lizenzen im Verzeichnis LICENSES/ enthalten, die nicht innerhalb des " "Projekts verwendet werden?\n" "\n" "- Sind alle Dateien mit gültigen Urheberrechts- und Lizenzinformationen " "versehen?" #: src/reuse/_main.py:231 msgid "print the project's bill of materials in SPDX format" msgstr "Komponentenliste im SPDX-Format ausgeben" #: src/reuse/_main.py:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kann '{expression}' nicht parsen" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' ist keine Datei" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' ist kein Verzeichnis" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "kann '{}' nicht öffnen" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "kann nicht in Verzeichnis '{}' schreiben" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "kann nicht in '{}' schreiben" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "kann '{}' nicht lesen oder schreiben" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ist kein gültiger SPDX-Ausdruck, breche ab" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ist kein gültiger SPDX-Lizenz-Identifikator." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Besuchen Sie für eine Liste von gültigen SPDX-" "Lizenz-Identifikatoren." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "SPDX-Lizenz-Identifikator der Lizenz" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "lade alle fehlenden Lizenzen herunter, die im Projekt gefunden wurden" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fehler: {spdx_identifier} existiert bereits." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Fehler: Lizenz konnte nicht heruntergeladen werden." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Funktioniert Ihre Internetverbindung?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} erfolgreich heruntergeladen." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "Die folgenden Argumente sind erforderlich: license" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "Kann --output nicht mit mehr als einer Lizenz verwenden" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "Dem generierten Kommentar fehlen Zeilen zum Urheberrecht oder Lizenzausdrücke" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' hat keine erkannte Dateiendung, bitte verwenden Sie --style oder --" "explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Fehler: Kann kein Kommentar für '{path}' erstellen" #: src/reuse/header.py:550 #, 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 "" "Fehler: Die generierten Kommentar-Kopfzeilen für '{path}' enthalten fehlende " "Urheberrechtszeilen oder Lizenzausdrücke. Die Vorlage ist wahrscheinlich " "falsch. Keine neuen Kopfzeile geschrieben." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Kopfzeilen von {path} erfolgreich geändert" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "Urheberrechtsinformation, wiederholbar" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "SPDX-Lizenz-Identifikator, wiederholbar" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "SPDX-Lizenz-Identifikator, wiederholbar" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "Jahr der Urheberrechtsinformation, optional" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "zu benutzender Kommentarstil, optional" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "zu benutzender Kommentarstil, optional" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "Name der zu verwendenden Vorlage, optional" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "füge kein Jahr in Angabe hinzu" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "Jahr der Urheberrechtsinformation, optional" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "zu benutzender Kommentarstil, optional" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "zu benutzender Kommentarstil, optional" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "Option --copyright oder --license ist erforderlich" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "Die Optionen --exclude-year und --year schließen sich gegenseitig aus" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "Die Optionen --exclude-year und --year schließen sich gegenseitig aus" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "Vorlage {template} konnte nicht gefunden werden" #: src/reuse/header.py:819 #, python-brace-format 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Unter welcher Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" "Identifikator an." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Unter welcher anderen Lizenz steht Ihr Projekt? Geben Sie den SPDX-Lizenz-" "Identifikator an." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Um keine weiteren Lizenzen hinzuzufügen, drücken Sie ENTER." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Projekt bereits initialisiert" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Initialisiere Projekt für REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Was ist der Name des Projekts?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Was ist die Internetadresse des Projekts?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Was ist der Name der Betreuenden?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Wie lautet die E-Mail-Adresse der Betreuenden?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Alles erledigt! Initialisiere jetzt." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Lade {} herunter" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} existiert bereits" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Konnte {} nicht herunterladen" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Erstelle .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Initialisierung vollständig." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "FALSCHE LIZENZEN" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' gefunden in:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "VERALTETE LIZENZEN" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Die folgenden Lizenzen wurden von SPDX als veraltetet gekennzeichnet:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LIZENZEN OHNE DATEIENDUNG" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Die folgenden Lizenzen haben keine Dateiendung:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "FEHLENDE LIZENZEN" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "NICHT VERWENDETE LIZENZEN" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Die folgenden Lizenzen werden nicht benutzt:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "LESEFEHLER" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Unlesbar:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FEHLENDE URHEBERRECHTS- UND LIZENZINFORMATIONEN" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "" "Die folgenden Dateien haben keine Urheberrechts- und Lizenzinformationen:" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "Die folgenden Dateien haben keine Urheberrechtsinformationen:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Die folgenden Dateien haben keine Lizenzinformationen:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "ZUSAMMENFASSUNG" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Falsche Lizenzen:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Veraltete Lizenzen:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Lizenzen ohne Dateiendung:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Fehlende Lizenzen:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Unbenutzte Lizenzen:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Verwendete Lizenzen:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Lesefehler: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Dateien mit Urheberrechtsinformationen: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Dateien mit Lizenzinformationen: {count} / {total}" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Herzlichen Glückwunsch! Ihr Projekt ist konform mit Version {} der REUSE-" "Spezifikation :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Leider ist Ihr Projekt nicht konform mit Version {} der REUSE-" "Spezifikation :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' abgedeckt durch .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 hat Syntaxfehler" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "erkenne Identifikator von '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} hat keine Dateiendung" #: src/reuse/project.py:359 #, 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 "" "Konnte SPDX-Lizenz-Identifikator von {path} nicht erkennen, der auf " "{identifier} verweist. Stellen Sie sicher, dass die Lizenz in der " "Lizenzliste unter steht oder mit 'LicenseRef-' " "beginnt und eine Dateiendung hat." #: src/reuse/project.py:371 #, 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/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Konnte '{path}' nicht lesen" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Unerwarteter Fehler beim Parsen von '{path}' aufgetreten" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "Benutzung: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() nicht definiert" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "Argument \"-\" mit Modus %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "Kann '%(filename)s' nicht öffnen: %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "Kann Aktionen nicht zusammenführen - zwei Gruppen heißen %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' ist ein ungültiges Argument für Positionsangaben" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "Ungültige Option %(option)r: Muss mit einem Buchstaben %(prefix_chars)r " "beginnen" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= ist erforderlich für Optionen wie %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Ungültiger Wert für conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "Widersprüchliche Option: %s" msgstr[1] "Widersprüchliche Optionen: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "Sich gegenseitig ausschließende Argumente müssen optional sein" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "Positions-Argumente" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "Optionale Argumente" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "zeige diese Hilfsnachricht und beende" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "mehrere Subparser-Argumente sind nicht möglich" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "unbekannte Argumente: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "nicht erlaubt mit Argument %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "explizites Argument %r ignoriert" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "die folgenden Argumente sind erforderlich: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "eines der Argumente %s ist erforderlich" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "erwartete ein Argument" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "erwartete höchstens ein Argument" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "erwartete mindestens ein Argument" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "erwartete %s Argument" msgstr[1] "erwartete %s Argumente" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "mehrdeutige Option: %(option)s könnte %(matches)s bedeuten" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "unerwarteter Options-String: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r ist nicht aufrufbar" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ungültiger %(type)s Wert: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ungültige Auswahl: %(value)r (wähle von %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "Widersprüchliche Option: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "Widersprüchliche Option: %s" #~ msgid "can't open '%s': %s" #~ msgstr "Kann '%s' nicht öffnen: %s" #~ msgid "place header in path.license instead of path" #~ msgstr "Speichere Kopfzeilen in path.license anstatt path" #~ msgid "could not find Git" #~ msgstr "konnte Git nicht finden" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' endet nicht mit .spdx" reuse-tool-2.1.0/po/eo.po000066400000000000000000001007521445545121300152020ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018, 2020 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2018 Tirifto # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-07-10 21:48+0000\n" "Last-Translator: Carmen Bianca Bakker \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "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.0-dev\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse estas ilo por konformiĝo al la rekomendoj de REUSE. Vidu por pli da informo, kaj por " "la reta dokumentado." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "Subtenu la laboradon de FSFE:" #: src/reuse/_main.py:47 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 "" "Donacoj estas gravegaj por niaj forto kaj aŭtonomeco. Ili ebligas nin " "daŭrigi laboradon por libera programaro, kie ajn tio necesas. Bonvolu " "pripensi fari donacon ĉe ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "ŝalti sencimigajn ordonojn" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "kaŝi avertojn de evitindaĵoj" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "ne preterpasi Git-submodulojn" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "ne preterpasi Meson-subprojektojn" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "ne uzi plurprocesorado" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "difini radikon de la projekto" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "montri versionumeron de programo kaj eliri" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "subkomandoj" #: src/reuse/_main.py:113 msgid "add copyright and licensing into the header of files" msgstr "aldoni kopirajtahn kaj permesilajn informojn en la kapojn de dosieroj" #: src/reuse/_main.py:116 #, 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 --explicit-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!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "evitindigita favore al annotate" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "pravalorizi REUSE-projekton" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "listigi ĉiujn nekonformajn dosierojn" #: src/reuse/_main.py:204 #, 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 "" "Kontroli la projektdosierujon por konformiĝo je versio {reuse_version} de la " "REUSE Specifo. Vi povas trovi la lastan version de la specifo ĉe .\n" "\n" "Specife, oni kontrolas la sekvajn kriteriojn:\n" "\n" "- Ĉu estas malbonaj (nekonitaj, nekonformaj) permesiloj en la projekto?\n" "\n" "- Ĉu uziĝas permesiloj en la projekto, kiuj ne estas en la LICENSES/-" "dosierujo?\n" "\n" "- Ĉu estas permesiloj en la LICENSES/-dosierujo, kiuj estas neuzataj?\n" "\n" "- Ĉu ĉiuj dosieroj havas validajn kopirajtajn kaj permesilajn informojn?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "listigi ĉiujn subtenitajn SPDX-permesilojn" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Ne povis analizi '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' ne estas dosiero" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' ne estas dosierujo" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "ne povas malfermi '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "ne povas skribi al dosierujo '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "ne povas skribi al '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "ne povas legi aŭ skribi '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' ne estas valida SPDX-esprimo. Ĉesigante" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' ne estas valida SPDX Permesila Identigilo." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "Ĉu vi intencis:" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Vidu por listo de validaj SPDX Permesilaj " "Identigiloj." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "SPDX Permesila Identigilo de permesilo" #: src/reuse/download.py:93 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:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Eraro: {spdx_identifier} jam ekzistas." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Eraro: Malsukcesis elŝuti permesilon." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Ĉu via retkonekto funkcias?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Sukceses elŝutis {spdx_identifier}." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "--output faras nenion kiam --all ankaŭ uziĝas" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "la sekvaj argumentoj nepras: license" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "ne povas uzi --output kun pli ol unu permesilo" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "al generita komento mankas kopirajtlinioj aŭ permesilesprimoj" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" "'{path}' ne subtenas unuopliniajn komentojn, bonvolu ne uzi --single-line" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" "'{path}' ne subtenas plurliniajn komentojn, bonvolu ne uzi --multi-line" #: src/reuse/header.py:444 #, 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:" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "Preterpasis nekonatan dosieron {path}" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Preterpasis dosieron '{path}' kiu jam enhavas REUSE-informojn" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Eraro: Ne povis krei komenton por '{path}'" #: src/reuse/header.py:550 #, 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 "" "Eraro: Al generita komentkapo por '{path}' mankas kopirajtlinioj aŭ " "permesilesprimoj. La ŝablono probable malbonas. Ne skribis novan kapon." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Sukcese ŝanĝis kapon de {path}" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "kopirajtlinio, ripetabla" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "SPDX Identigilo, ripetabla" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "SPDX Identigilo, ripetabla" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "jaro de kopirajtlinio, malnepra" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "uzenda komentstilo, malnepra" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "uzenda komentstilo, malnepra" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nomo de uzenda ŝablono, malnepra" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "ne inkluzivi jaron en kopirajtlinio" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "jaro de kopirajtlinio, malnepra" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "uzenda komentstilo, malnepra" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "uzenda komentstilo, malnepra" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "opcio --copyright aŭ --license necesas" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "opcio --exclude-year kaj --year ekskluzivas unu la alian" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "ŝablono {template} netroveblas" #: src/reuse/header.py:819 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "'{path}' estas duuma, tiel uzante '{new_path}' por la kapo" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sub kiu permesilo estas via projekto? Provizu la SPDX Permesilan Identigilon." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Sub kiuj aliaj permesiloj estas via projekto? Provizu la SPDX Permesilan " "Identigilon." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Por ĉesigi aldonadon de permesiloj, premu la enigan klavon." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Projekto jam pravalorizita" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Pravalorizante projekton por REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Kiu estas la nomo de la projekto?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Kiu estas la reta adreso de la projekto?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Kiu estas la nomo de la daŭriganto?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Kiu estas la retpoŝtadreso de la daŭriganto?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Tute farita! Pravalorizante nun." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Elŝutante {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} jam ekzistas" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Ne povis elŝuti {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Krante .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Finfaris pravalorizadon." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "MALBONAJ PERMESILOJ" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' trovita en:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "ARĤAIKIGITAJ PERMESILOJ" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "La sekvajn permesilojn arĥaikigis SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "PERMESILOJ SEN DOSIERSUFIKSO" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "La sekvaj permesiloj ne havas dosiersufikson:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "MANKANTAJ PERMESILOJ" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "NEUZATAJ PERMESILOJ" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "La sekvajn permesilojn oni ne uzas:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "LEG-ERAROJ" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Ne povis legi:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANKANTAJ KOPIRAJTAJ KAJ PERMESILAJ INFORMOJ" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn kaj permesilajn informojn:" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "La sekvaj dosieroj ne havas kopirajtajn informojn:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "La sekvaj dosieroj ne havas permesilajn informojn:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Malbonaj permesiloj:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Arĥaikigitaj permesiloj:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Permesiloj sen dosiersufikso:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Mankantaj permesiloj:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Neuzataj permesiloj:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Uzataj permesiloj:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Leg-eraroj: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Dosieroj sen kopirajtinformo: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Dosieroj sen permesilinformo: {count} / {total}" #: src/reuse/lint.py:190 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:197 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/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' sub .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 havas sintaksajn erarojn" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "precizigante identigilon de '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} ne havas dosiersufikson" #: src/reuse/project.py:359 #, 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 "" "Ne povis precizigi SPDX Permesila Identigilo de {path}, uzante {identifier}. " "Certigu ke la permesilo estas en la listo ĉe aŭ " "ke ĝi komencas per 'LicenseRef-' kaj havas dosiersufikson." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} estas la SPDX Permesila Identigilo de kaj {path} kaj " "{other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Ne povis legi '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Okazis neanticipita eraro dum analizado de '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "uzo: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() ne difiniĝas" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nekonata analizilo %(parser_name)r (elektoj: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" kun moduso %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "ne povas malfermi '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "ne povas kunigi agojn - du grupoj nomiĝas %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' estas nevalida argumento por poziciaj" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "nevalida elektebla ĉeno %(option)r: devas komenciĝi per signo " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= nepras por elektebloj kiel %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "nevalida valoro de conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "konfliktanta elektebla ĉeno: %s" msgstr[1] "konfliktantaj elekteblaj ĉenoj: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "reciproke ekskluzivaj argumentoj devas esti malnepraj" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "poziciaj argumentoj" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "malnepraj argumentoj" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "montri ĉi tiun helpmesaĝon kaj eliri" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "ne povas havi plurajn subanalizilajn argumentojn" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "nekonataj argumentoj: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "ne permesita kun argumento: %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "malatentis malimplicitan argumenton %r" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "la sekvaj argumentoj nepras: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "unu el la argumentoj %s nepras" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "anticipis unu argumenton" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "anticipis maksimume unu argumenton" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "anticipis minimume unu argumenton" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "anticipis %s argumenton" msgstr[1] "anticipis %s argumentojn" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "dubsenca elekteblo: %(option)s povus egali al %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "neanticipita elektebla ĉeno: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r ne alvokeblas" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "nevalida %(type)s-valoro: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "nevalida elekto: %(value)r (elektu el %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eraro: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "konfliktanta elektebla ĉeno: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "konfliktanta elektebla ĉeno: %s" #~ msgid "can't open '%s': %s" #~ msgstr "ne povas malfermi '%s': %s" #~ msgid "place header in path.license instead of path" #~ msgstr "meti kapon en path.license anstataŭ path" #~ msgid "could not find Git" #~ msgstr "ne povis trovi programaron Git" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' ne finiĝas per .spdx" #~ msgid "yielding %s" #~ msgstr "traktante %s" #~ msgid "currently walking in %s" #~ msgstr "ĉimomente irante en %s" #~ msgid "ignoring %s" #~ msgstr "ignoras %s" #~ msgid "searching %s for reuse information" #~ msgstr "serĉanta en %s por reuse-informoj" #~ msgid "%s could not be decoded" #~ msgstr "ne povis malkodi %s" #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "{path} subas permesilon {identifier}, sed ties dosiero mankas" #~ msgid "searching %s for license tags" #~ msgstr "serĉante permesiletikedojn en %s" #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "Ne povis determini SPD-identigilo de {path}, do uziĝas {identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "neniu debian/copyright dosiero, aŭ ne povis legi ĝin" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "reuse Kopirajto (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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.\n" #~ "\n" #~ "You should have received a copy of the GNU General Public License along " #~ "with reuse. If not, see ." #~ msgstr "" #~ "reuse estas libera programaro: vi povas ĝin pludistribui kaj/aŭ modifi je " #~ "la kondiĉoj de la GNU Ĝenerala Pubika Permesilo, eldonita de la Free " #~ "Software Foundation, laŭ la versio 3 de la permesilo, aŭ (se vi " #~ "preferas) ajna posta versio.\n" #~ "\n" #~ "Ni distribuas reuse esperante, ke ĝi estos utila, tamen SEN IA AJN " #~ "GARANTIO, i.a. sen la implica garantio pri SURMERKATIGEBLO aŭ TAŬGECO POR " #~ "IU KONKRETA CELO. Pliajn detalojn vidu en la GNU Ĝenerala Publika " #~ "Permesilo.\n" #~ "\n" #~ "Ekzemplaro de la GNU Ĝenerala Publika Permesilo devas esti liverita al vi " #~ "kun reuse. Se ne, vidu ." #~ msgid "IMPORTANT:" #~ msgstr "GRAVA:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "Vi ne jam instalis pygit2. reuse malrapidiĝas ege pro ĉi tio. Por akiri " #~ "pli bonan rendimenton, bonvolu instali version de pygit2 de via distribuo." #~ msgid "could not read %s" #~ msgstr "ne povis legi dosieron %s" #~ msgid "none\n" #~ msgstr "neniu\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "ne uzi debian/copyright por eltiri reuse-informon" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Listigi ĉiujn nekonformajn dosierojn.\n" #~ "\n" #~ "Dosiero nekonformas kiam:\n" #~ "\n" #~ "- Ĝi havas neniun kopirajtinformon.\n" #~ "\n" #~ "- Ĝi havas neniun permesilon (deklaritan kiel SPDX-esprimo).\n" #~ "\n" #~ "- Ĝia permesilo ne troveblas.\n" #~ "\n" #~ "Ĉi tiu komando presas nur la dosierindikojn, kiuj ne konformas. Ĉiu " #~ "dosiero estas presata sur propra linio.\n" #~ "\n" #~ "Eraraj kaj avertaj mesaĝoj estas presotaj al STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "SPDX-esprimoj nepras por konformiĝo" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "kopirajtafiŝoj nepras por konformiĝo" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "presi la SPDX-esprimon de ĉiu donita dosiero" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versio {}\n" reuse-tool-2.1.0/po/es.po000066400000000000000000001032121445545121300152000ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 pd # SPDX-FileCopyrightText: 2018 flow # SPDX-FileCopyrightText: 2020 Roberto Bauglir # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-02-20 19:38+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse es una herramienta para cumplir con las recomendaciones de la " "iniciativa REUSE. Visita para obtener más " "información, y para acceder a la " "documentación en línea." #: src/reuse/_main.py:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Esta versión de reuse es compatible con la versión {} de la Especificación " "REUSE." #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "Apoya el trabajo de la FSFE:" #: src/reuse/_main.py:47 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 "" "Las donaciones son esenciales para nuestra fortaleza y autonomía. Estas nos " "permiten continuar trabajando por el Software Libre allá donde sea " "necesario. Por favor, considera el hacer una donación en ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "habilita instrucciones de depuración" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "no omitas los submódulos de Git" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "no omitas los submódulos de Git" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "no utilices multiproceso" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "define el origen del proyecto" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "muestra la versión del programa y sale" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "subcomandos" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-license is specified, the " "header is placed in a .license file." msgstr "" "Añade copyright y licencias en la cabecera de uno o más archivos.\n" "\n" "Usando --copyright y --license, puede especificar qué titulares de derechos " "de autor y licencias añadir a las cabeceras de los archivos dados.\n" "\n" "El estilo de comentario debería detectarse automáticamente para sus " "archivos. Si no se puede detectar un estilo de comentario, el proceso se " "aborta. Utilice --style para especificar o anular el estilo de comentario a " "utilizar.\n" "\n" "Puede cambiar la plantilla del comentario de cabecera usando --template. " "Coloque una plantilla Jinja2 en .reuse/templates/mytemplate.jinja2. Puedes " "usar la plantilla especificando '--template mytemplate'. Lea la información " "en internet sobre cómo utilizar esta función.\n" "\n" "Si se detecta un archivo binario, o si se especifica --explicit-license, la " "cabecera se coloca en un archivo .license.\n" "\n" "IMPORTANTE: ¡Esto está actualmente disponible de forma EXPERIMENTAL!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "inicia el proyecto REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "lista todos los ficheros no compatibles" #: src/reuse/_main.py:204 #, 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 "" "Examina el directorio del proyecto para comprobar su conformidad con la " "versión {reuse_version} de la Especificación REUSE. Puedes encontrar la " "última versión de la especificación en \n" "\n" "Los siguientes criterios son específicamente chequeados:\n" "\n" "- ¿Hay alguna licencia mala (no reconocida, no compatible con SPDX...) en el " "proyecto?\n" "\n" "- ¿Se hace referencia a alguna licencia dentro del proyecto, pero esta no se " "encuentra incluida en el directorio LICENSES/?\n" "\n" "- ¿Existe alguna licencia, de las incluidas en el directorio LICENSES/, que " "no esté en uso en el proyecto?\n" "\n" "- ¿Tienen todos los ficheros información válida sobre copyright y licencia?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "No se pudo procesar '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' no es un fichero" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' no es un directorio" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "no se puede abrir '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "no se pude escribir en el directorio '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "no se puede escribir en '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "no se puede leer o escribir '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' no es una expresión SPDX válida; abortando" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' no es un Identificador SPDX de Licencia válido." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consulta para obtener un listado de los " "Identificadores SPDX de Licencia válidos." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Identificador SPDX de la licencia" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "descargar todas las licencias no disponibles detectadas en el proyecto" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Error: {spdx_identifier} ya existe." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Error: Fallo al descargar la licencia." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "¿Está funcionando tu conexión a Internet?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} descargado con éxito." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "se requieren los siguientes parámetros: license" #: src/reuse/download.py:140 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:132 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/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' carece de una extensión de fichero conocida: por favor, utiliza --" "style o --explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Error: No se pudo crear un comentario para '{path}'" #: src/reuse/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Cabecera de {path} correctamente cambiada" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "declaración de los derechos de autor, repetible" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX, repetible" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identificador SPDX, repetible" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "año de la declaración de copyright; opcional" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nombre de la plantilla a utilizar; opcional" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "no incluir el año en la declaración" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "año de la declaración de copyright; opcional" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "estilo de comentario a utilizar; opcional" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "una de estas opciones es necesaria: --copyright o --license" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "las opciones -exclude-year y --year son mutuamente excluyentes" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "las opciones -exclude-year y --year son mutuamente excluyentes" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "no pudo encontrarse la plantilla {template}" #: src/reuse/header.py:819 #, 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/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "¿Bajo qué licencia se encuentra tu proyecto? Aporta el Identificador SPDX de " "Licencia." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "¿Bajo qué otras licencias se encuentra tu proyecto? Proporciona el " "Identificador SPDX de Licencia." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para terminar de añadir licencias pulsa RETORNO." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Proyecto ya inicializado" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Inicializando el proyecto para REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "¿Cuál es el nombre del proyecto?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "¿Cuál es la dirección de Internet del proyecto?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "¿Cuál es el nombre del mantenedor?" #: src/reuse/init.py:105 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:111 msgid "All done! Initializing now." msgstr "¡Ya hemos terminado! Iniciando." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Descargando {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} ya existe" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "No se pudo descargar {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Creando .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Inicialización completa." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "LICENCIAS MALAS" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' encontrado en:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "LICENCIAS OBSOLETAS" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Las siguientes licencias han quedado obsoletas según SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCIAS SIN EXTENSIÓN DE FICHERO" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Las siguientes licencias no tienen extensión de fichero:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "LICENCIAS NO ENCONTRADAS" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "LICENCIAS NO UTILIZADAS" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Las siguientes licencias no son utilizadas:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ERRORES DE LECTURA" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "No se pudo leer:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "FALTA INFORMACIÓN SOBRE COPYRIGHT Y LICENCIA" #: src/reuse/lint.py:126 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:137 msgid "The following files have no copyright information:" msgstr "Los siguientes ficheros carecen de información de copyright:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Los siguientes ficheros carecen de información de licencia:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RESUMEN" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Licencias malas:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Licencias obsoletas:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licencias sin extensión de fichero:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Licencias no encontradas:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Licencias no utilizadas:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Licencias utilizadas:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Errores de lectura: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Ficheros con información sobre copyright: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Ficheros con información de licencia: {count} / {total}" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "¡Enhorabuena! Tu proyecto es compatible con la versión {} de la " "Especificación REUSE :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Desafortunadamente, tu proyecto no es compatible con la versión {} de la " "Especificación REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' cubierto por .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 presenta errores de sintaxis" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinando el identificador de '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} no tiene extensión de fichero" #: src/reuse/project.py:359 #, 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 "" "No pudo detectarse el Identificador SPDX de Licencia de {path}: detectando " "{identifier}. Asegúrate de que la licencia consta en la lista de licencias " "alojada en , o de que empieza por 'LicenseRef-', " "y de que posee una extensión de fichero." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} es el Identificador SPDX de Licencia, tanto de {path}, como de " "{other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "No se pudo leer '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Se produjo un error inesperado al procesar '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "uso: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() no definido" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" "analizador sintáctico desconocido: %(parser_name)r (alternativas: " "%(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "parámetro \"-\" con modo %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no se puede abrir '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "no se pueden fusionar las acciones: dos grupos se llaman %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento posicional inválido" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "Opción no válida %(option)r: Debe comenzar con una letra %(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "se requiere dest= para opciones como %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor no válido de conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "cadena de opción conflictiva: %s" msgstr[1] "cadenas de opción conflictivas: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "los parámetros mutuamente excluyentes deben ser opcionales" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "parámetros posicionales" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "parámetros opcionales" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "no puede contener múltiples parámetros del subanalizador sintáctico" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "parámetros no reconocidos: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "no permitido con el parámetro %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "parámetro explícito ignorado: %r" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "los siguientes parámetros son obligatorios: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "se requiere uno de los parámetros %s" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "se espera un parámetro" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "se espera un parámetro, como máximo" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "se espera un parámetro, como mínimo" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "se espera el parámetro %s" msgstr[1] "se esperan los parámetros %s" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría coincidir con %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "cadena de opción inesperada: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r no se puede invocar" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor no válido de %(type)s: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opción inválida: %(value)r (opciones: %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "cadena de opción conflictiva: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "cadena de opción conflictiva: %s" #~ msgid "can't open '%s': %s" #~ msgstr "no se puede abrir '%s': %s" #~ msgid "place header in path.license instead of path" #~ msgstr "coloca la cabecera en path.license, en lugar de path" #~ msgid "could not find Git" #~ msgstr "no se pudo encontrar Git" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' no acaba en .spdx" #~ msgid "yielding %s" #~ msgstr "apuntando a %s" #~ msgid "currently walking in %s" #~ msgstr "actualmente recorriendo %s" #~ msgid "ignoring %s" #~ msgstr "ignorando %s" #~ msgid "searching %s for reuse information" #~ msgstr "buscando información de reuse en %s" #~ msgid "%s could not be decoded" #~ msgstr "%s no se pudo decodificar" #~ msgid "%s covered by debian/copyright" #~ msgstr "%s cubierto por debian/copyright" #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "" #~ "{path} con licencia {identifier}, pero no se encontró el archivo con la " #~ "licencia" #~ msgid "searching %s for license tags" #~ msgstr "buscando etiquetas de licencia en %s" #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "" #~ "No se pudo resolver el identificador SPDX de {path}, resolviendo a " #~ "{identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "no existe o no se pudo leer el archivo debian/copyright" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "Copyright (C) 2017-2018 de reuse Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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.\n" #~ "\n" #~ "You should have received a copy of the GNU General Public License along " #~ "with reuse. If not, see ." #~ msgstr "" #~ "reuse es software libre: puedes redistribuirlo y/o modificarlo bajo los " #~ "términos de la Licencia Pública General GNU (GNU GPL) tal y como está " #~ "publicada por la Free Software Foundation, tanto la versión 3 de la " #~ "Licencia, o (a tu elección) cualquier versión posterior.\n" #~ "\n" #~ "reuse se distribuye con la esperanza de ser útil, pero SIN NINGUNA " #~ "GARANTIA; ni siquiera la garantia implícita de COMERCIABILIDAD o " #~ "ADECUACIÓN PARA UN PROPÓSITO PARTICULAR. Consulta la Licencia Pública " #~ "General GNU para más detalles.\n" #~ "\n" #~ "Deberías haber recibido una copia de la Licencia Pública General GNU con " #~ "reuse. Si no es así, consulta ." #~ msgid "IMPORTANT:" #~ msgstr "IMPORTANTE:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "No tienes instalado pygit2 por lo que reuse funcionará significativamente " #~ "más lento. Por favor, instala la versión de pygit2 de tu distribución " #~ "para un mejor rendimiento." #~ msgid "could not read %s" #~ msgstr "no se pudo leer %s" #~ msgid "none\n" #~ msgstr "nada\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "no use debian/copyright para extraer información de reuse" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Lista todos los ficheros no compatibles.\n" #~ "\n" #~ "Un fichero es no compatible si:\n" #~ "\n" #~ "- no tiene información de copyright.\n" #~ "\n" #~ "- no tiene licencia (declarada como una expresión SPDX).\n" #~ "\n" #~ "- su licencia no se encuentra.\n" #~ "\n" #~ "Esto imprime únicamente las rutas de los ficheros no compatibles, cada " #~ "fichero en una línea separada.\n" #~ "\n" #~ "Los mensajes de error y aviso se muestran en STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "Las expresiones SPDX son de obligatorio cumplimiento" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "las notas de copyright son de obligatorio cumplimiento" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "imprime las expresiones SPDX de cada fichero proporcionado" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versión {}\n" reuse-tool-2.1.0/po/fr.po000066400000000000000000000723531445545121300152130ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 OliBug # SPDX-FileCopyrightText: 2020 Vincent Lequertier # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.16-dev\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse est un outil pour la conformité aux recommandations de l'initiative " "REUSE. Voir pour plus d'informations, et pour la documentation en ligne." #: src/reuse/_main.py:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Cette version de reuse est compatible avec la version {} de la spécification " "REUSE." #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "Soutenir le travail de la FSFE :" #: src/reuse/_main.py:47 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 "" "Les dons sont cruciaux pour notre force et notre autonomie. Ils nous " "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:70 msgid "enable debug statements" msgstr "activer les instructions de débogage" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "ne pas omettre les sous-modules Git" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "ne pas omettre les sous-modules Git" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "pas de multiprocessing" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "définition de la racine (root) du projet" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "voir la version du programme et quitter" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "sous-commandes" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-license is specified, the " "header is placed in a .license file." 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" "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" "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" "IMPORTANT: cette fonctionnalité est EXPÉRIMENTALE pour le moment !" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "initialiser le projet REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "lister tous les fichiers non-conformes" #: src/reuse/_main.py:204 #, 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 "" "Vérifiez le répertoire projet pour assurer la conformité à la version " "{reuse_version} de la spécification REUSE. Vous pouvez trouver la dernière " "version de la spécification à l'adresse .\n" "\n" "En particulier, les critères suivants sont vérifiés :\n" "\n" "- Une mauvaise licence (non reconnue, non-conforme à SPDX) se trouve-t-elle " "dans le projet ?\n" "\n" "- Y a-t-il des licences dans le répertoire LICENSES/ qui sont inutilisées " "dans le projet ?\n" "\n" "- Tous les fichiers disposent-ils d'informations de droits d'auteur et de " "licence valides ?" #: src/reuse/_main.py:231 msgid "print the project's bill of materials in SPDX format" msgstr "imprimer la nomenclature du projet au format SPDX" #: src/reuse/_main.py:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Analyse de la syntaxe de '{expression}' impossible" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' n'est pas un fichier" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' n'est pas un répertoire" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "'{}' ne peut être ouvert" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "écriture impossible dans le répertoire '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "écriture impossible dans '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "lecture ou écriture impossible pour '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' n'est pas une expression SPDX valide, abandon" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' n'est pas un identifiant de licence SPDX valide." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consultez pour une liste des identifiants de " "licence SPDX valides." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Identification de la licence SPDX" #: src/reuse/download.py:93 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:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erreur : {spdx_identifier} existe déjà." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Erreur : échec du téléchargement de licence." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Votre connexion internet fonctionne-t-elle ?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Téléchargement de {spdx_identifier} terminé." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "les arguments suivants sont nécessaires : license" #: src/reuse/download.py:140 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:132 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/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' n'est pas une extension de fichier reconnue, merci d'utiliser --" "style ou --explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erreur : les commentaires ne peuvent être créés dans '{path}'" #: src/reuse/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "En-tête de {path} modifié avec succès" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "déclaration de droits d'auteur, répétable" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identifiant SPDX, répétable" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identifiant SPDX, répétable" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "année de déclaration de droits d'auteur, optionnel" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "style de commentaire à utiliser, optionnel" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "style de commentaire à utiliser, optionnel" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nom de modèle à utiliser, optionnel" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "ne pas inclure d'année dans la déclaration" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "année de déclaration de droits d'auteur, optionnel" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "style de commentaire à utiliser, optionnel" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "style de commentaire à utiliser, optionnel" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "une des options --copyright ou --license est nécessaire" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "les options --exclude-year et --year sont mutuellement exclusives" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "les options --exclude-year et --year sont mutuellement exclusives" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "le modèle {template} est introuvable" #: src/reuse/header.py:819 #, 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/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sous quelle licence est enregistrè votre projet ? Merci de fournir un " "identifiant de licence SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Sous quelle autre licence est enregistré votre projet ? Merci de fournir un " "identifiant de licence SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Pour finir l'ajout de licences, presser ENTRÉE." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Le projet est déjà initialisé" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Initialisation du projet pour REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Quel est le nom du projet ?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Quelle est l'adresse internet du projet ?" #: src/reuse/init.py:99 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:105 msgid "What is the e-mail address of the maintainer?" msgstr "" "Quelle est l'adresse électronique de la personne chargée de la maintenance ?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Tout est prêt ! Maintenant, on initialise." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Télécharge {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} existe déjà" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "{} n'a pas pu être téléchargé" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Création de .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Initialisation terminée." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "MAUVAISES LICENCES" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' trouvé dans :" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "LICENCES OBSOLÈTES" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Les licences suivantes sont rendues obsolètes par SPDX :" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENCES SANS EXTENSION DE FICHIER" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Les licences suivantes n'ont pas d'extension de fichier :" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "LICENCES MANQUANTES" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "LICENCES INUTILISÉES" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Les licences suivantes ne sont pas utilisées :" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ERREURS DE LECTURE" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Illisibles :" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMATION DE DROITS D'AUTEUR ET DE LICENCE MANQUANTE" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "" "Les fichiers suivants ne contiennent pas d'information de droits d'auteurs " "et de licence :" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "" "Les fichiers suivants ne contiennent pas d'information de droits d'auteurs :" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Les fichiers suivants ne contiennent pas d'information de licence :" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RÉSUMÉ" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Mauvaises licences :" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Licences obsolètes :" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licences sans extension de fichier :" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Licences manquantes :" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Licences inutilisées :" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Licences utilisées :" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Erreurs de lecture : {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "" "Fichiers contenant des informations de droits d'auteur : {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Fichiers contenant des informations de licence : {count} / {total}" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Félicitations ! Votre projet est conforme à la version {} de la " "spécification REUSE :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Malheureusement, votre projet n'est pas conforme à la version {} de la " "spécification REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' est couvert par .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 contient des erreurs de syntaxe" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "résolution de l'identifiant de '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} n'a pas d'extension de fichier" #: src/reuse/project.py:359 #, 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 "" "Impossible de résoudre l'identifiant de licence SPDX de {path}, utilisation " "de {identifier}. Merci de vérifier que la licence est dans la liste " "trouvable à ou qu'elle débute par 'LicenseRef-', " "et qu'elle contient une extension de fichier." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "{identifier} est l'identifiant de {path} comme de {other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Lecture de '{path}' impossible" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Erreur inattendue lors de l'analyse de '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "usage : " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() est indéfini" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analyseur %(parser_name)r inconnu (choix : %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" avec le mode %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' ne peut pas être ouvert : %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' est un argument invalide pour les positionnels" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "option de chaîne %(option)r invalide : doit débuter par un caractère " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= est nécessaire pour les options comme %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valeur de résolution de conflit invalide : %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "chane d'options contradictoire : %s" msgstr[1] "chaînes d'options contradictoires : %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "les arguments mutuellement exclusifs doivent être optionnels" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "arguments positionnels" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "arguments optionnels" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "impossible de considérer des arguments de sous-analyse multiples" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "arguments non reconnus : %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "non autorisé avec l'argument %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "l'argument explicite %r est ignoré" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "les arguments suivants sont nécessaires : %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "un des arguments %s est nécessaire" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "un argument est attendu" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "au plus un argument est attendu" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "au moins un argument est attendu" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "l'argument %s est attendu" msgstr[1] "les arguments %s sont attendus" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambigüe : %(option)s ne correspond pas à %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "option inattendue : %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r ne peut être appelé" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s invalide : %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisir parmi %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "chane d'options contradictoire : %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "chane d'options contradictoire : %s" #~ msgid "can't open '%s': %s" #~ msgstr "impossible d'ouvrir '%s' : %s" #~ msgid "place header in path.license instead of path" #~ msgstr "placez l'en-tête dans path.license au lieu de path" #~ msgid "could not find Git" #~ msgstr "Git ne peut pas être trouvé" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' ne se termine pas en .spdx" reuse-tool-2.1.0/po/gl.po000066400000000000000000000703371445545121300152060ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 pd # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse é unha ferramenta para o cumprimento das recomendacións REUSE. Ver " " para máis información e para a documentación en liña." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "Apoie o traballo da FSFE:" #: src/reuse/_main.py:47 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 "" "As doazóns son críticas para a nosa forza e autonomía. Permítennos seguir " "traballando polo software libre onde sexa necesario. Considere facer unha " "doazón a ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "habilitar sentencias de depuración" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "non salte os submódulos de Git" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non salte os submódulos de Git" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "non empregue multiprocesamento" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "definir a raíz do proxecto" #: src/reuse/_main.py:102 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:106 msgid "subcommands" msgstr "subcomandos" #: src/reuse/_main.py:113 msgid "add copyright and licensing into the header of files" msgstr "engadir copyright e licenza na cabeceira dos arquivos" #: src/reuse/_main.py:116 #, 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 --explicit-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!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 msgid "download a license and place it in the LICENSES/ directory" msgstr "Descargar unha licenza e gardala na carpeta LICENSES/" #: src/reuse/_main.py:170 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:193 msgid "initialize REUSE project" msgstr "iniciar un proxecto REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "listar todos os arquivos que non cumplen os criterios" #: src/reuse/_main.py:204 #, 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 "" "Verificar que a carpeta do proxecto cumple coa versión {reuse_version} da " "especificación REUSE. Pode atopar a última versión da especificación en " ".\n" "\n" "Comprobase específicamente os seguintes criterios:\n" "\n" "- Existen licenzas inapropiadas (non recoñecidas ou que incumplen o SPDX) no " "proxecto?\n" "\n" "- Hai algunha licenza mencionada no proxecto que non está incluida na " "carpeta LICENSES/?\n" "\n" "- A carpeta LICENSES/ contén licenzas non usadas no proxecto?\n" "\n" "- Todos os arquivos teñen información correcta de copyright e licenza?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non se pode analizar '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' non é un arquivo" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' non é un directorio" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "non se pode abrir '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "non se pode escribir no directorio '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "non se pode escribir en '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "non se pode ler ou escribir en '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non é unha expresión SPDX válida, cancelando" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non é un Identificador de Licenza SPDX válido." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consulte unha lista de Identificadores de Licenza SPDX válidos en ." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Identificador de Licenza SPDX da licenza" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "descargar todas as licenzas detectadas mais non atopadas no proxecto" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} xa existe." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Erro: Fallo descargando a licenza." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Está a funcionar a súa conexión a internet?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Descargouse correctamente o {spdx_identifier}." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "requirense os seguintes argumentos: licenza" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "non se pode usar --output con máis dunha licenza" #: src/reuse/header.py:132 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/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' non ten unha extensión de arquivo recoñecida, precisa usar --style " "ou --explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Erro: Non se pode crear un comentario para '{path}'" #: src/reuse/header.py:550 #, 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: 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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "A cabeceira de {path} cambiada con éxito" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "declaración de copyright, repetibel" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX, repetibel" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identificador SPDX, repetibel" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "ano da declaración de copyright, opcional" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "estilo de comentario a usar, opcional" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "estilo de comentario a usar, opcional" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nome do modelo a usar, opcional" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "non incluir ano na declaración" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "ano da declaración de copyright, opcional" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "estilo de comentario a usar, opcional" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "estilo de comentario a usar, opcional" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "precisase a opción --copyright ou --license" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "as opcións --exclude-year e --year non se poden usar á vez" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "as opcións --exclude-year e --year non se poden usar á vez" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "no se atopa o modelo {template}" #: src/reuse/header.py:819 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "'{path}' é binario, logo úsase '{new_path}' para a cabeceira" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Baixo que licenza está o seu proxecto? indique o Identificador de Licenza " "SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Baixo que outra licenza está o seu proxecto? indique o Identificador de " "Licenza SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para rematar de engadir licenzas, prema ENTER." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "O proxecto xa está iniciado" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Iniciando o proxecto para REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Cal é o nome do proxecto?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Cal é o enderezo en internet do proxecto?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Cal é o nome do mantenedor?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Cal é o correo electrónico do mantenedor?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Rematou todo! iniciando arestora." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Descargando {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} xa existe" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Non se pode descargar {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Creando .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Inicialización completada." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "LICENZAS DEFECTUOSAS" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' atopado en:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "LICENZAS OBSOLETAS" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenzas son obsoletas para SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZAS SEN EXTENSIÓN DE ARQUIVO" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "As seguintes licenzas non teñen extesión de arquivo:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "LICENZAS NON ATOPADAS" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "LICENZAS SEN USO" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "As seguintes licenzas non se usan:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ERROS DE LECTURA" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Non se pode ler:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "NON SE ATOPA INFORMACIÓN DE LICENZA OU COPYRIGHT" #: src/reuse/lint.py:126 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:137 msgid "The following files have no copyright information:" msgstr "Os seguintes arquivos non teñen información de copyright:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Os seguintes arquivos non teñen información de licenza:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Licenzas defectuosas:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Licenzas obsoletas:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licenzas sen extensión de arquivo:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Licenzas non atopadas:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Licenzas non usadas:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Licenzas usadas:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Erros de lectura: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Arquivos con información de copyright: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Arquivos con información de licenza: {count} / {total}" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Congratulacións! O seu proxecto cumple coa versión {} da especificación " "REUSE :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Desgraciadamente o seu proxecto non cumple coa versión {} da especificación " "REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' cuberto por .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 ten erros de sintaxe" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "resolvendo o identificador de '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ten extensión de arquivo" #: src/reuse/project.py:359 #, 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 "" "Non se pode resolver o Identificador de Licenza SPDX de {path}, resólvese " "como {identifier}. Asegúrese que a licenza está na lista publicada en " " ou que comeza con 'LicenseRef-' e ten unha " "extensión de arquivo." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} é o Identificador de Licenza SPDX de ambos os dous {path} e " "{other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non se pode ler '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Aconteceu un erro inesperado lendo '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "uso: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() non definido" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analizador descoñecido %(parser_name)r (alternativas: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" con modo %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "non se pode abrir '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "non se poden misturar as accións - dous grupos teñen o nome %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' non é un argumento valido para os posicionais" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "cadea de opción non válida %(option)r: precisa comenzar cun carácter " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "requírese dest= para opcións do tipo %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor non válido para conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "cadea de opción conflictiva: %s" msgstr[1] "cadeas de opción conflictivas: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "os argumentos mutuamente exclusivos deben ser opcionais" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "argumentos posicionais" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "mostrar esta mensaxe de axuda e sair" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "non pode haber múltiples argumentos para o subanalizador" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos non recoñecidos: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "non se permite co argumento %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "argumento explicito %r ignorado" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "precísanse os seguintes argumentos: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "precísase un dos argumentos %s" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "espérase un argumento" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "espérase un argumento como máximo" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "espérase un argumento como mínimo" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "espérase %s argumento" msgstr[1] "espéranse %s argumentos" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s pode encaixar con %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "opción de cadea non esperada: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r non se pode chamar" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor non válido %(type)s: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alternativa non válida: %(value)r (elixir entre %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "cadea de opción conflictiva: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "cadea de opción conflictiva: %s" #~ msgid "can't open '%s': %s" #~ msgstr "non se pode abrir '%s': %s" #~ msgid "place header in path.license instead of path" #~ msgstr "colocar a cabeceira en carpeta.licenza no canto de carpeta" #~ msgid "could not find Git" #~ msgstr "non se pode atopar o Git" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' non remata en .spdx" reuse-tool-2.1.0/po/it.po000066400000000000000000000713101445545121300152100ustar00rootroot00000000000000# SPDX-FileCopyrightText: Luca Bonissi # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-dev\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse è uno strumento per la conformità alle raccomandazioni REUSE. Visita " " per maggiori informazioni, e per accedere alla documentazione in linea." #: src/reuse/_main.py:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" "Questa versione di reuse è compatibile con la versione {} della Specifica " "REUSE." #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "Sostieni il lavoro della FSFE:" #: src/reuse/_main.py:47 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 "" "Le donazioni sono fondamentali per la nostra forza e la nostra autonomia. Ci " "permettono di continuare a lavorare per il Software Libero ovunque sia " "necessario. Prendi in considerazione di fare una donazione su ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "abilita le istruzioni di debug" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "non omettere i sottomoduli Git" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "non omettere i sottomoduli Git" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "non utilizzare il multiprocessing" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "impostare la directory principale del progetto" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "mostra la versione del programma ed esce" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "sottocomandi" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-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!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 msgid "download a license and place it in the LICENSES/ directory" msgstr "scarica una licenza e salvala nella directory LICENSES/" #: src/reuse/_main.py:170 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:193 msgid "initialize REUSE project" msgstr "inizializza il progetto REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "lista dei file non conformi" #: src/reuse/_main.py:204 #, 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 "" "Controlla che la directory del progetto sia conforme con la versione " "{reuse_version} della Specifica REUSE. Puoi trovare l'ultima versione della " "specifica su \n" "\n" "In particolare, vengono eseguiti i seguenti controlli:\n" "\n" "- Nel progetto c'è qualche licenza non valida (non riconosciuta, non " "conforme con SPDX)?\n" "\n" "- C'è qualche licenza utilizzata all'interno del progetto, ma non inclusa " "nella directory LICENSES/?\n" "\n" "- C'è qualche licenza inclusa della directory LICENSES/ ma non utilizzata " "nel progetto?\n" "\n" "- Tutti i file hanno informazioni valide sul copyright e sulla licenza?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Non è possibile parsificare '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' non è un file" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' non è una directory" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "non è possibile aprire '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "non è possibile scrivere nella directory '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "non è possibile scrivere su '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "non è possibile leggere o scrivere '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' non è una espressione valida SPDX, interruzione" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' non è un valido Identificativo di Licenza SPDX." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consulta per la lista degli Identificativi di " "Licenza SPDX validi." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Identificativo di Licenza SPDX" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "scarica tutte le licenze mancanti ma usate nel progetto" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Errore: {spdx_identifier} esiste già." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Errore: Fallito lo scaricamento della licenza." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "La tua connessione Internet funziona?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Scaricamento completato di {spdx_identifier}." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "sono richiesti i seguenti parametri: license" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "non puoi usare --output con più di una licenza" #: src/reuse/header.py:132 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/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' non ha una estensione conosciuta, usa --style o --explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Errore: Non è possibile creare il commento per '{path}'" #: src/reuse/header.py:550 #, 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 "" "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." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Instestazione di {path} aggiornata" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "dichiarazione del copyright, ripetibile" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identificativo SPDX, ripetibile" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identificativo SPDX, ripetibile" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "anno della dichiaraione del copyright, opzionale" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "stile dei commenti da usare, opzionale" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "stile dei commenti da usare, opzionale" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nome del template da usare, opzionale" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "non include l'anno nella dichiarazione" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "anno della dichiaraione del copyright, opzionale" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "stile dei commenti da usare, opzionale" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "stile dei commenti da usare, opzionale" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "è necessario specificare il parametro --copyright o --license" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "i parametri --exclude-year e --year sono multualmente esclusivi" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "il modello {template} non è stato trovato" #: src/reuse/header.py:819 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" "'{path}' è un file binario, occorre utilizzare '{new_path}' per " "l'intestazione" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sotto quale licenza viene rilasciato il tuo progetto? Indica " "l'Identificativo di Licenza SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Quali altre licenze utilizza il tuo progetto? Indica l'Identificativo di " "Licenza SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Per terminare l'aggiunta di licenze, premi INVIO." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Progetto già inizializzato" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Inizializzazione del progetto per REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Qual è il nome del progetto?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Qual è l'indirizzo Internet del progetto?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Qual è il nome del responsabile del progetto?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Qual è l'indirizzo e-mail del responsabile del progetto?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Tutto OK! Sto inizializzando." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Scaricamento {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} esiste già" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Non è stato possibile scaricare {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Creazione di .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Inizializzazione completa." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "LICENZE NON VALIDA" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' trovato in:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "LICENZE OBSOLETE" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Le seguenti licenze sono obsolete secondo SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENZE SENZA ESTENSIONE DEL FILE" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Le seguenti licenze non hanno l'estensione del file:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "LICENZE MANCANTI" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "LICENZE NON UTILIZZATE" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Le seguenti licenze non sono utilizzate:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ERRORI DI LETTURA" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Non è possibile leggere:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "MANCANO LE INFORMAZIONI SU COPYRIGHT E LICENZA" #: src/reuse/lint.py:126 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:137 msgid "The following files have no copyright information:" msgstr "I seguenti file non hanno informazioni sul copyright:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "I seguenti file non hanno informazioni sulla licenza:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RAPPORTO" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Licenze non valide:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Licenze obsolete:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licenze senza estensione del file:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Licenze mancanti:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Licenze non utilizzate:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Licenze usate:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Errori di lettura: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "File con informazioni sul copyright: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "File con informazioni sulla licenza: {count} / {total}" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" "Congratulazioni! Il tuo progetto è conforme con la versione {} della " "Specifica REUSE :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Siamo spiacenti, il tuo progetto non è conforme con la versione {} della " "Specifica REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' verificato da .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 presenta errori di sintassi" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "determinazione dell'identificativo di '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} non ha l'estensione del file" #: src/reuse/project.py:359 #, 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 "" "Non è possibile rilevare l'Identificativo di Licenza SPDX per {path}, viene " "impostato a {identifier}. Assicurati che la licenza sia nella lista delle " "licenze elencate su o che inizi con " "'LicenseRef-', e che abbia un'estensione del file." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} è l'Identificativo di Licenza SPDX sia di {path} che di " "{other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Non è possibile leggere '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Errore sconosciuto durante la parsificazione di '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "uso: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() non definita" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parsificatore sconosciuto: %(parser_name)r (alternative: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "parametro \"-\" con modo %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "non è possibile aprire '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "non è possibile unire le azioni - due gruppi hanno lo stesso nome %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' non è un parametro posizionale valido" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "nome opzione non valida %(option)r: deve iniziare con un carattere " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= è richiesto per opzioni come %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valore per conflict_resolution non valido: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "nome opzione in conflitto: %s" msgstr[1] "nomi opzioni in conflitto: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "i parametri mutualmente esclusivi devono essere opzionali" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "parametri posizionali" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "parametri opzionali" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "mostra questo messaggio ed esci" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "non è possibile avere più di un parametro con sotto-parsificatore" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "parametro sconosciuto: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "non permesso con parametro %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "parametro esplicito ignorato %r" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "i seguenti parametri sono obbligatori: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "uno dei parametri %s è richiesto" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "richiesto un parametro" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "al massimo un parametro aspettato" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "richiesto almeno un parametro" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "richiesto il parametro %s" msgstr[1] "richiesti i parametri %s" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opzione ambigua: %(option)s può essere %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "nome opzione inaspettato: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r non è richiamabile" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valore %(type)s non valido: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "scelta non valida: %(value)r (opzioni valide: %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "nome opzione in conflitto: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "nome opzione in conflitto: %s" #~ msgid "can't open '%s': %s" #~ msgstr "non è possibile aprire '%s': %s" #~ msgid "place header in path.license instead of path" #~ msgstr "inserisci l'intestazione in path.license invece di path" #~ msgid "could not find Git" #~ msgstr "non è stato possibile trovare Git" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' non ha estensione .spdx" reuse-tool-2.1.0/po/nl.po000066400000000000000000001020011445545121300151750ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018, 2020 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2017, 2020 André Ockers # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-02-18 10:24+0000\n" "Last-Translator: \"J. Lavoie\" \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse is een tool voor naleving van de REUSE Initiatief aanbevelingen. Zie " " voor meer informatie en voor de online documentatie." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "Ondersteun het werk van de FSFE:" #: src/reuse/_main.py:47 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 "" "Donaties zijn belangrijk voor onze sterkte en autonomie. Ze staan ons toe om " "verder te werken voor vrije software waar nodig. Overweeg alstublieft om een " "donatie te maken bij ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "zet debug statements aan" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "sla Git-submodules niet over" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "sla Git-submodules niet over" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "gebruik geen multiprocessing" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "bepaal de root van het project" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "versienummer van het programma laten zien en verlaten" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "subcommando's" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-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!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "initialiseer REUSE-project" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "lijst maken van alle bestanden die tekortschieten" #: src/reuse/_main.py:204 #, 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 "" "Voer een statische controle op de naleving van versie {reuse_version} van de " "REUSE-specificatie uit. U kunt de laatste versie van de specificatie vinden " "op .\n" "\n" "De volgende criteria worden in het bijzonder gecontroleerd:\n" "\n" "- Bevat het project slechte (niet-herkende, niet met SPDX in overeenstemming " "zijnde) licenties?\n" "\n" "- Bevat het project gerefereerde licenties die zich niet in de LICENSES/ map " "bevinden?\n" "\n" "- Bevat de map LICENSES/ licenties die binnen het project niet worden " "gebruikt?\n" "\n" "- Bevatten alle bestanden geldige informatie over auteursricht en licenties?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Kon '{expression}' niet parsen" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' is geen bestand" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' is geen map" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "kan '{}' niet openen" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "kan niet schrijven naar map '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "kan niet schrijven naar '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "kan '{}' niet lezen of schrijven" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' is geen geldige SPDX-uitdrukking, aan het afbreken" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' is geen geldige SPDX Licentie Identificatie." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Zie voor een lijst met geldige SPDX Licentie " "Identificaties." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "SPDX Licentie Identificatie of licentie" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "" "download alle ontbrekende licenties die in het project zijn gedetecteerd" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Fout: {spdx_identifier} bestaat al." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Fout: downloaden van licentie mislukt." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Werkt uw internetverbinding?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} met succes gedowload." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "de volgende argumenten zijn verplicht: licentie" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "kan --output niet met meer dan een licentie gebruiken" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "gegenereerd commentaar mist auteursrechtregels of licentie-uitdrukkingen" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' heeft geen erkende bestandsextensie; gebruik alstublieft --style of " "--explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Fout: Kon geen commentaar voor '{path}' creëren" #: src/reuse/header.py:550 #, 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 "" "Fout: de gegenereerde commentaarheader voor '{path}' mist auteursrechtregels " "of licentie-uitdrukkingen. Het sjabloon is waarschijnlijk niet correct. " "Schreef geen nieuwe header." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Succesvolle verandering van de header van {path}" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "auteursrechtverklaring (herhaalbaar)" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "SPDX Identificatie (herhaalbaar)" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "SPDX Identificatie (herhaalbaar)" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "jaar van auteursrechtverklaring (optie)" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "te gebruiken commentaarstijl (optie)" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "te gebruiken commentaarstijl (optie)" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "naam van het te gebruiken sjabloon (optie)" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "voeg geen jaar toe aan verklaring" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "jaar van auteursrechtverklaring (optie)" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "te gebruiken commentaarstijl (optie)" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "te gebruiken commentaarstijl (optie)" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "de optie --copyright of --license is vereist" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "de opties --exclude-year en --year sluiten elkaar uit" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "de opties --exclude-year en --year sluiten elkaar uit" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "sjabloon {template} kon niet worden gevonden" #: src/reuse/header.py:819 #, python-brace-format 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Onder welke licentie valt uw project? Voeg de SPDX Licientie Identificatie " "toe." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Onder welke andere licentie valt uw project? Voeg de SPDX Licientie " "Identificatie toe." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Typ RETURN om te stoppen met het toevoegen van licenties." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Project al geïnitialiseerd" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Project voor REUSE initialiseren." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Wat is de naam van het project?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Wat is het internetadres van het project?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Wat is de naam van de beheerder?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Wat is het e-mailadres van de beheerder?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Klaar! Nu aan het initialiseren." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "{} aan het downloaden" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} bestaat al" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Kon {} niet downloaden" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr ".reuse/dep5 aan het creëren" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Initialisatie voltooid." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "SLECHTE LICENTIES" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' gevonden in:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "VEROUDERDE LICENTIES" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "De volgende licenties zijn verouderd door SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENTIES ZONDER BESTANDSEXTENSIE" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "De volgende licenties hebben geen bestandsextensie:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "ONTBREKENDE LICENTIES" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "ONGEBRUIKTE LICENTIES" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "De volgende licenties zijn niet gebruikt:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "LEES FOUTEN" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Kon niet lezen:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "AUTEURSRECHT- EN LICENTIE-INFORMATIE ONTBREEKT" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "" "De volgende bestanden bevatten geen auteursrecht- en licentie-informatie:" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "De volgende bestanden hebben geen auteursrechtinformatie:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "De volgende bestanden bevatten geen licentie-informatie:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "SAMENVATTING" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Slechte licenties:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Verouderde licenties:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licenties zonder bestandsextensie:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Ontbrekende licenties:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Ongebruikte licenties:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Gebruikte licenties:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Lees fouten: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Bestanden met auteursrechtinformatie: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Bestanden met licentie-informatie: {count} / {total}" #: src/reuse/lint.py:190 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:197 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/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' valt onder .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 kent syntaxfouten" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "identificatie van '{path}' bepalen" #: src/reuse/project.py:349 #, 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:359 #, 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 "" "Kon de SPDX Licentie Identificatie van {path} niet bepalen, dus gebruiken we " "{identifier}. Zorg ervoor dat de licentie zich in de licentielijst bevind " "die gevonden kan worden op of dat deze begint " "met 'LicenseRef-' en dat deze een bestandsextensie heeft." #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} is de SPDX Licentie Identificatie van zowel {path} als " "{other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Kon '{path}' niet lezen" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Onverwachte fout vond plaats tijdens het parsen van '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "gebruik: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() is niet gedefinieerd" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "onbekende parser %(parser_name)r (keuzes: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" met mode %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "kan '%(filename)s' niet openen: %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kan acties niet samenvoegen - twee groepen delen de naam %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' is een ongeldig argument voor positionele argumenten" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "ongeldige optiestring %(option)r: moet beginnen met een karakter " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= is benodigd voor opties zoals %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ongeldige conflictresolutiewaarde: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "tegenstrijdige optiestring: %s" msgstr[1] "tegenstrijdige optiestrings: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "argumenten die elkaar uitsluiten moeten optioneel zijn" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "positionele argumenten" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "optionele argumenten" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "dit helpbericht laten zien en verlaten" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "kan niet meerdere subparser-argumenten hebben" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "niet erkende argumenten: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "niet toegestaan met argument %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "expliciet argument %r genegeerd" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "de volgende argumenten zijn verplicht: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "één van de argumenten %s is benodigd" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "verwachtte één argument" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "verwachtte maximaal één argument" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "verwachtte minimaal één argument" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "verwachtte %s argument" msgstr[1] "verwachtte %s argumenten" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" "dubbelzinnige optie: %(option)s zou ook gelijk kunnen zijn aan %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "onverwachtte optiestring: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r is niet callable" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ongeldige %(type)s waarde: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ongeldige keuze: %(value)r (kiezen uit %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "tegenstrijdige optiestring: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "tegenstrijdige optiestring: %s" #~ msgid "can't open '%s': %s" #~ msgstr "kan '%s' niet openen: %s" #~ msgid "place header in path.license instead of path" #~ msgstr "plaats header in path.license in plaats van path" #~ msgid "could not find Git" #~ msgstr "kon Git niet vinden" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' eindigt niet met .spdx" #~ msgid "yielding %s" #~ msgstr "%s aan het verwerken" #~ msgid "currently walking in %s" #~ msgstr "aan het lopen door %s" #~ msgid "ignoring %s" #~ msgstr "%s negeren" #~ msgid "searching %s for reuse information" #~ msgstr "%s aan het doorzoeken voor reuse informatie" #~ msgid "%s could not be decoded" #~ msgstr "%s kon niet gedecodeerd worden" #~ msgid "%s covered by debian/copyright" #~ msgstr "debian/copyright omvat %s" #~ msgid "" #~ "{path} is licensed under {identifier}, but its license file could not be " #~ "found" #~ msgstr "" #~ "{path} valt onder {identifier}, maar het licentiebestand kon niet " #~ "gevonden worden" #~ msgid "searching %s for license tags" #~ msgstr "%s aan het doorzoeken voor licentie-tags" #~ msgid "" #~ "Could not resolve SPDX identifier of {path}, resolving to {identifier}" #~ msgstr "Kon SPDX-identifier van {path} niet oplossen, gebruik {identifier}" #~ msgid "no debian/copyright file, or could not read it" #~ msgstr "geen debian/copyright bestand, of kon het niet lezen" #~ msgid "reuse Copyright (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgstr "" #~ "reuse Auteursrecht (C) 2017-2018 Free Software Foundation Europe e.V." #~ msgid "" #~ "reuse 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.\n" #~ "\n" #~ "reuse 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.\n" #~ "\n" #~ "You should have received a copy of the GNU General Public License along " #~ "with reuse. If not, see ." #~ msgstr "" #~ "reuse is vrije software: u mag het herdistribueren en/of wijzigen onder " #~ "de voorwaarden van de GNU Algemene Publieke Licentie zoals gepubliceerd " #~ "door de Free Software Foundation, onder versie 3 van de Licentie of (naar " #~ "uw keuze) elke latere versie.\n" #~ "\n" #~ "reuse is gedistribueerd in de hoop dat het nuttig zal zijn maar ZONDER " #~ "ENIGE GARANTIE; zelfs zonder de impliciete garanties die GEBRUIKELIJK " #~ "ZIJN IN DE HANDEL of voor BRUIKBAARHEID VOOR EEN SPECIFIEK DOEL. Zie de " #~ "GNU Algemene Publieke Licentie voor meer details.\n" #~ "\n" #~ "U hoort een kopie van de GNU Algemene Publieke Licentie te hebben " #~ "ontvangen samen met reuse. Als dat niet het geval is, zie ." #~ msgid "IMPORTANT:" #~ msgstr "BELANGRIJK:" #~ msgid "" #~ "You do not have pygit2 installed. reuse will slow down significantly " #~ "because of this. For better performance, please install your " #~ "distribution's version of pygit2." #~ msgstr "" #~ "U heeft pygit2 niet geïnstalleerd. reuse zal hierdoor significant " #~ "langzamer draaien. Voor betere prestatie, installeer alstublieft uw " #~ "distributie's versie van pygit2." #~ msgid "could not read %s" #~ msgstr "kon %s niet lezen" #~ msgid "none\n" #~ msgstr "geen\n" #~ msgid "do not use debian/copyright to extract reuse information" #~ msgstr "debian/copyright niet gebruiken om reuse informatie te extraheren" #~ msgid "" #~ "List all non-compliant files.\n" #~ "\n" #~ "A file is non-compliant when:\n" #~ "\n" #~ "- It has no copyright information.\n" #~ "\n" #~ "- It has no license (declared as SPDX expression).\n" #~ "\n" #~ "- Its license could not be found.\n" #~ "\n" #~ "This prints only the paths of the files that do not comply, each file on " #~ "a separate line.\n" #~ "\n" #~ "Error and warning messages are output to STDERR." #~ msgstr "" #~ "Lijst maken van niet-voldoenende bestanden.\n" #~ "\n" #~ "Een bestand voldoet niet als:\n" #~ "\n" #~ "- Het geen auteursrechtinformatie heeft.\n" #~ "\n" #~ "- Het geen licentie heeft (gegeven als SPDX-uitdrukking).\n" #~ "\n" #~ "- Zijn licentie niet gevonden kan worden.\n" #~ "\n" #~ "Dit print enkel de paden van de bestanden die niet voldoen. Elk bestand " #~ "heeft zijn eigen regel.\n" #~ "\n" #~ "Fout- en waarschuwingsmeldingen worden geprint naar STDERR." #~ msgid "SPDX expressions are mandatory for compliance" #~ msgstr "SPDX-uitdrukkingen zijn verplicht voor voldoening" #~ msgid "copyright notices are mandatory for compliance" #~ msgstr "auteursrechtnotities zijn verplicht voor voldoening" #~ msgid "print the SPDX expressions of each provided file" #~ msgstr "de SPDX-uitdrukkingen van elke gegeven file printen" #~ msgid "reuse, version {}\n" #~ msgstr "reuse, versie {}\n" reuse-tool-2.1.0/po/pt.po000066400000000000000000000714751445545121300152330ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 José Vieira # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "O reuse é uma ferramenta para observância das recomendações REUSE. Ver " " para mais informação e para documentação em linha." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "Apoiar o trabalho da FSFE:" #: src/reuse/_main.py:47 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 "" "Os donativos são cruciais para a nossa força e autonomia. Permitem-nos " "continuar a trabalhar em prol do Sotware Livre sempre que necessário. " "Considere fazer um donativo em ." #: src/reuse/_main.py:70 msgid "enable debug statements" msgstr "activar expressões de depuração" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "não ignorar sub-módulos do Git" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "não ignorar sub-módulos do Git" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "não usar multi-processamento" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "definir a raíz do projecto" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "mostrar o número de versão do programa e sair" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "sub-comandos" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-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!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 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:170 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:193 msgid "initialize REUSE project" msgstr "iniciar um projecto REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "listar todos os ficheiros não conformes" #: src/reuse/_main.py:204 #, 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 "" "Analisar (lint) a pasta do projecto para verificar a conformidade com a " "versão {reuse_version} da especificação REUSE. A última versão da " "especificação encontra-se em .\n" "\n" "Em concreto, são verificados os seguintes critérios:\n" "\n" "- Há no projecto licenças irregulares (não reconhecidas ou não conformes com " "o SPDX)?\n" "\n" "- Há alguma licença mencionada no projecto que não esteja incluída na pasta " "LICENSES/?\n" "\n" "- Há alguma licença incluída na pasta LICENSES/ que não seja usada no " "projecto?\n" "\n" "- Todos os ficheiros têm informação válida de direitos de autor e de " "licenciamento?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Não foi possível executar parse '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' não é um ficheiro" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' não é uma pasta" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "não é possível abrir '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "não é possível escrever no directório '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "não é possível escrever em '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "não é possível ler ou escrever em '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' não é uma expressão SPDX válida; a abortar" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' não é um Identificador de Licença SPDX válido." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Consultar uma lista de Identificadores de Licença SPDX válidos em ." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Identificador de Licença SPDX da licença" #: src/reuse/download.py:93 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:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Erro: {spdx_identifier} já existe." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Erro: Falha ao descarregar a licença." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "A ligação à Internet está a funcionar?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} transferido com êxito." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "são requeridos os seguintes argumentos: licença" #: src/reuse/download.py:140 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:132 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/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' não têm uma extensão de ficheiro reconhecida; usar --style ou --" "explicit-license" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, 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/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "O cabeçalho de {path} foi alterado com êxito" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "declaração de direitos de autor (repetível)" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Identificador SPDX (repetível)" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "Identificador SPDX (repetível)" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "ano da declaração de direitos de autor (opcional)" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "estilo de comentário a usar (opcional)" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "estilo de comentário a usar (opcional)" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "nome do modelo a usar (opcional)" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "não incluir o ano na declaração" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "ano da declaração de direitos de autor (opcional)" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "estilo de comentário a usar (opcional)" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "estilo de comentário a usar (opcional)" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "é requerida uma das opções --copyright ou --license" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "as opções --exclude-year e --year são mutuamente exclusivas" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "as opções --exclude-year e --year são mutuamente exclusivas" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "o modelo {template} não foi encontrado" #: src/reuse/header.py:819 #, 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/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Sob que licença está o projecto? Indicar o Identificador de Licença SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Sob que outra licença está o projecto? Indicar o Identificador de Licença " "SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Para parar a agregação de licenças, premir INTRODUZIR/ENTER." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Projecto já iniciado" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "A iniciar o projecto para REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Qual é o nome do projecto?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Qual é o endereço do projecto na internet?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Qual é o nome do responsável (maintainer)?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Qual é o endereço electrónico do responsável?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Pronto! A iniciar." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "A descarregar {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} já existe" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Não foi possível descarregar {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "A criar .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Iniciação completada." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "LICENÇAS IRREGULARES" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' encontrado em:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "LICENÇAS DESCONTINUADAS" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "As seguintes licenças foram descontinuadas pelo SPDX:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "LICENÇAS SEM EXTENSÃO DE FICHEIRO" #: src/reuse/lint.py:73 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:81 msgid "MISSING LICENSES" msgstr "LICENÇAS EM FALTA" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "LICENÇAS NÃO USADAS" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "As seguintes licenças não estão a ser usadas:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ERROS DE LEITURA" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Não foi possível ler:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "INFORMAÇÃO EM FALTA SOBRE DIREITOS DE AUTOR E LICENCIAMENTO" #: src/reuse/lint.py:126 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:137 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:146 msgid "The following files have no licensing information:" msgstr "Os seguintes ficheiros não contêm informação de licenciamento:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "RESUMO" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Licenças irregulares:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Licenças descontinuadas:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Licenças sem extensão de ficheiro:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Licenças em falta:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Licenças não usadas:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Licenças usadas:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Erros de leitura: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Ficheiros com informação de direitos de autor: {count} / {total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Ficheiros com informação de licenciamento: {count} / {total}" #: src/reuse/lint.py:190 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:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" "Infelizmente, o projecto não está conforme com a versão {} da especificação " "REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' abrangido por .reuse/dep5" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 tem erros de sintaxe" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "a determinar o identificador de '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} não tem extensão de ficheiro" #: src/reuse/project.py:359 #, 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 "" "Não foi possível determinar o Identificador de Licença SPDX de {path}; a " "determinar como {identifier}. Confirmar que a licença está na lista " "publicada em ou que começa por 'LicenseRef-' e " "tem uma extensão de ficheiro." #: src/reuse/project.py:371 #, 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/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Não foi possível ler '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Ocorreu um erro inesperado ao analisar (parse) '{path}'" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "uso: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() não definido" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analisador desconhecido %(parser_name)r (alternativas: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com modo %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível combinar as acções - há dois grupos com o nome %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' não é um argumento válido para posicionais" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" "linha de opções %(option)r inválida: tem que começar com um carácter " "%(prefix_chars)r" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "é requerido dest= para opções do tipo %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor de conflict_resolution inválido: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "linha de opções conflituante: %s" msgstr[1] "linhas de opções conflituantes: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos têm que ser opcionais" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "argumentos posicionais" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "mostrar esta mensagem de ajuda e sair" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "não pode haver argumentos múltiplos de sub-análise (subparser)" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "não permitido com o argumento %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "são requeridos os seguintes argumentos: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "é requerido um dos argumentos %s" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "é esperado um argumento" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "é esperado um argumento, no máximo" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "é esperado um argumento, no mínimo" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "é esperado %s argumento" msgstr[1] "são esperados %s argumentos" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s pode ser igual a %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "linha de opções não esperada: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r não é invocável" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor %(type)s inválido: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alternativa inválida: %(value)r (escolher de %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "linha de opções conflituante: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "linha de opções conflituante: %s" #~ msgid "can't open '%s': %s" #~ msgstr "não é possível abrir '%s': %s" #~ msgid "place header in path.license instead of path" #~ msgstr "colocar o cabeçalho em path.license em vez de em path" #~ msgid "could not find Git" #~ msgstr "não foi encontrado o Git" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' não termina em .spdx" reuse-tool-2.1.0/po/reuse.pot000066400000000000000000000501461445545121300161070ustar00rootroot00000000000000# 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. # #, fuzzy msgid "" msgstr "" "#-#-#-#-# reuse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "#-#-#-#-# argparse.pot (PACKAGE VERSION) #-#-#-#-#\n" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/reuse/_main.py:34 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:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "" #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "" #: src/reuse/_main.py:47 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:70 msgid "enable debug statements" msgstr "" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "" #: src/reuse/_main.py:85 msgid "do not skip over Meson subprojects" msgstr "" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "" #: src/reuse/_main.py:113 msgid "add copyright and licensing into the header of files" msgstr "" #: src/reuse/_main.py:116 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 --explicit-license is specified, the " "header is placed in a .license file." msgstr "" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 msgid "download a license and place it in the LICENSES/ directory" msgstr "" #: src/reuse/_main.py:170 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:193 msgid "initialize REUSE project" msgstr "" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "" #: src/reuse/_main.py:204 #, 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 "" #: src/reuse/_main.py:231 msgid "print the project's bill of materials in SPDX format" msgstr "" #: src/reuse/_main.py:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "" #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "" #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "" #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "" #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "" #: src/reuse/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "" #: src/reuse/header.py:599 msgid "file contributor, repeatable" msgstr "" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "" #: src/reuse/header.py:620 msgid "copyright style to use, optional" msgstr "" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "" #: src/reuse/header.py:637 msgid "merge copyright lines if copyright statements are identical" msgstr "" #: src/reuse/header.py:642 msgid "force single-line comment style, optional" msgstr "" #: src/reuse/header.py:647 msgid "force multi-line comment style, optional" msgstr "" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 msgid "option --contributor, --copyright or --license is required" msgstr "" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "" #: src/reuse/header.py:710 msgid "option --single-line and --multi-line are mutually exclusive" msgstr "" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "" #: src/reuse/header.py:819 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "" #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "" #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "" #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "" #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "" #: src/reuse/lint.py:167 msgid "Read errors:" msgstr "" #: src/reuse/lint.py:169 msgid "files with copyright information:" msgstr "" #: src/reuse/lint.py:173 msgid "files with license information:" msgstr "" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "" #: src/reuse/project.py:217 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" #: src/reuse/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr "" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "" #: src/reuse/project.py:359 #, 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 "" #: src/reuse/project.py:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "" #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr "" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" reuse-tool-2.1.0/po/reuse.pot.license000066400000000000000000000001541445545121300175220ustar00rootroot00000000000000SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER SPDX-License-Identifier: CC0-1.0 reuse-tool-2.1.0/po/tr.po000066400000000000000000000701131445545121300152210ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 T. E. Kalayci # # SPDX-License-Identifier: GPL-3.0-or-later msgid "" msgstr "" "Project-Id-Version: FSFE reuse\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-06-21 09:53+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #: src/reuse/_main.py:34 msgid "" "reuse is a tool for compliance with the REUSE recommendations. See for more information, and " "for the online documentation." msgstr "" "reuse, REUSE önerileriyle uyum için bir araçtır. Daha fazla bilgi için " " sitesini, çevrimiçi belgelendirme için sitesini ziyaret edebilirsiniz." #: src/reuse/_main.py:40 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:43 msgid "Support the FSFE's work:" msgstr "FSFE'nin çalışmalarını destekleyin:" #: src/reuse/_main.py:47 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 "" "Gücümüz ve özerkliğimiz için bağışlar oldukça önemli. Gereken her yerde " "Ö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:70 msgid "enable debug statements" msgstr "hata ayıklama cümlelerini etkinleştirir" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "Git alt modüllerini atlamaz" #: src/reuse/_main.py:85 #, fuzzy msgid "do not skip over Meson subprojects" msgstr "Git alt modüllerini atlamaz" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "çoklu işlem kullanmaz" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "projenin kökünü tanımlar" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "programın sürüm numarasını gösterip çıkar" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "alt komutlar" #: src/reuse/_main.py:113 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:116 #, 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 --explicit-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" "ilgili dosyaların başlığına hangi telif hakkı sahiplerinin ve lisansların " "ekleneceğini --copyright ve --license değişkenlerini kullanarak " "belirtebilirsiniz.\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" "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.\n" "\n" "ÖNEMLİ: Bu şu anda DENEYSELDİR!" #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "" #: src/reuse/_main.py:167 msgid "download a license and place it in the LICENSES/ directory" msgstr "bir lisans indirir ve LICENSES/ dizinine yerleştirir" #: src/reuse/_main.py:170 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:193 msgid "initialize REUSE project" msgstr "REUSE projesini ilkler" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "bütün uyumsuz dosyaları listeler" #: src/reuse/_main.py:204 #, 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 "" "Proje dizinini REUSE Belirtimi {reuse_version} sürümüyle uyumu için inceler. " "Belirtimin son sürümüne adresinden " "erişebilirsiniz.\n" "\n" "Özellikle aşağıdaki ölçütler denetleniyor:\n" "\n" "- Projede herhangi bir kötü (tanımlanamayan, SPDX ile uyumsuz) lisans var " "mı?\n" "\n" "- Projede belirtilen ama LICENSES/ dizininde yer almayan lisans var mı?\n" "\n" "- LICENSES/ dizininde yer alan ama projede kullanılmayan lisanslar var mı?\n" "\n" "- Bütün dosyalar telif hakkı ve lisans bilgisi içeriyor mu?" #: src/reuse/_main.py:231 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:239 msgid "list all supported SPDX licenses" msgstr "" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "'{expression}' çözümlenemiyor" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' bir dosya değil" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' bir dizin değil" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "'{}' açılamıyor" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "'{}' dizinine yazılamıyor" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "'{}' yazılamıyor" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "'{}' okunamıyor veya yazılamıyor" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' geçerli bir SPDX ifadesi değil, iptal ediliyor" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' geçerli bir SPDX Lisans Kimliği değil." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Geçerli SPDX Lisans Kimlikleri listesi için " "adresine bakın." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Lisansın SPDX Lisans Kimliği" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "projede tespit edilen bütün eksik lisansları indir" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Hata: {spdx_identifier} halihazırda mevcut." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Hata: lisans indirme başarısız oldu." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "İnternet bağlantınız çalışıyor mu?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "{spdx_identifier} başarılı bir şekilde indirildi." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "şu değişkenler gerekiyor: license" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "--output birden fazla lisansla birlikte kullanılamıyor" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "oluşturulan yorumda telif hakkı satırları veya lisans ifadeleri eksik" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" #: src/reuse/header.py:444 #, fuzzy msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "'{path}' tanınan bir dosya uzantısına sahip değil, lütfen --style veya --" "explicit-license değişkenlerini kullanın" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Hata: '{path}' için yorum oluşturulamıyor" #: src/reuse/header.py:550 #, 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 "" "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ı." #. TODO: This may need to be rephrased more elegantly. #: src/reuse/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "{path} başlığı başarılı bir şekilde değiştirildi" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "telif hakkı ifadesi, tekrarlanabilir" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "SPDX Kimliği, tekrarlanabilir" #: src/reuse/header.py:599 #, fuzzy msgid "file contributor, repeatable" msgstr "SPDX Kimliği, tekrarlanabilir" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "telif hakkı ifadesi, isteğe bağlı" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "kullanılacak yorum biçimi, isteğe bağlı" #: src/reuse/header.py:620 #, fuzzy msgid "copyright style to use, optional" msgstr "kullanılacak yorum biçimi, isteğe bağlı" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "kullanılacak şablon ismi, isteğe bağlı" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "ifadede yıl içerme" #: src/reuse/header.py:637 #, fuzzy msgid "merge copyright lines if copyright statements are identical" msgstr "telif hakkı ifadesi, isteğe bağlı" #: src/reuse/header.py:642 #, fuzzy msgid "force single-line comment style, optional" msgstr "kullanılacak yorum biçimi, isteğe bağlı" #: src/reuse/header.py:647 #, fuzzy msgid "force multi-line comment style, optional" msgstr "kullanılacak yorum biçimi, isteğe bağlı" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "" #: src/reuse/header.py:700 #, fuzzy msgid "option --contributor, --copyright or --license is required" msgstr "--copyright veya --license seçenekleri gereklidir" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "--exclude-year ve --year seçeneklerinden biri olmalıdır" #: src/reuse/header.py:710 #, fuzzy msgid "option --single-line and --multi-line are mutually exclusive" msgstr "--exclude-year ve --year seçeneklerinden biri olmalıdır" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "{template} şablonu bulunamıyor" #: src/reuse/header.py:819 #, python-brace-format 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" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "Projeniz hangi lisansa sahip? SPDX Lisans Kimliğini belirtin." #: src/reuse/init.py:29 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:40 msgid "To stop adding licenses, hit RETURN." msgstr "Lisans eklemeyi durdurmak için ENTER tuşuna basın." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Proje zaten ilklenmiş" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Proje REUSE için ilkleniyor." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Projenin ismi nedir?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Projenin İnternet adresi nedir?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Bakımcının adı nedir?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Bakımcının e-posta adresi nedir?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Tümü bitti! Şimdi ilkleniyor." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "{} indiriliyor" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} zaten mevcut" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "{} indirilemiyor" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr ".reuse/dep5 oluşturuluyor" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "İlkleme tamamlandı." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "KÖTÜ LİSANSLAR" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' şurada mevcut:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "MODASI GEÇMİŞ LİSANSLAR" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "Şu lisanslar artık SPDX tarafından kullanılmıyor:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "DOSYA UZANTISI OLMAYAN LİSANSLAR" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Şu lisansların dosya uzantısı yok:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "EKSİK LİSANSLAR" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "KULLANILMAYAN LİSANSLAR" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Şu lisanslar kullanılmıyor:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "OKUMA HATALARI" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Okunamıyor:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "EKSİK TELİF HAKKI VE LİSANS BİLGİSİ" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "Şu dosyalarda telif hakkı ve lisans bilgisi yok:" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "Şu dosyalarda telif hakkı bilgisi yok:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Şu dosyalarda lisans bilgisi yok:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "ÖZET" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Kötü lisanslar:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Modası geçmiş lisanslar:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Dosya uzantısı olmayan lisanslar:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Eksik lisanslar:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Kullanılmayan lisanslar:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Kullanılan lisanslar:" #: src/reuse/lint.py:167 #, fuzzy msgid "Read errors:" msgstr "Okuma hataları: {count}" #: src/reuse/lint.py:169 #, fuzzy msgid "files with copyright information:" msgstr "Telif hakkı içeren dosyalar: {count}/{total}" #: src/reuse/lint.py:173 #, fuzzy msgid "files with license information:" msgstr "Lisans bilgisi içeren dosyalar: {count} / {total}" #: src/reuse/lint.py:190 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:197 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/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' .reuse/dep5 ile kapsanıyor" #: src/reuse/project.py:217 #, 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/project.py:226 #, 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." msgstr "" #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 sözdizim hataları içeriyor" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "'{path}' kimliği belirleniyor" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} dosya uzantısına sahip değil" #: src/reuse/project.py:359 #, 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 "" "{path} için, {identifier} olarak çözümlenen SPDX Lisans Kimliği " "anlaşılamadı. Lisansın listesinde bulunduğundan " "veya 'LicenseRef-' ile başladığından ve bir dosya uzantısına sahip " "olduğundan emin olun." #: src/reuse/project.py:371 #, 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ği" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "'{path}' okunamıyor" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "'{path}' çözümlenirken beklenmedik bir hata oluştu" #: src/reuse/spdx.py:32 msgid "" "populate the LicenseConcluded field; note that reuse cannot guarantee the " "field is accurate" msgstr "" #: src/reuse/spdx.py:39 msgid "name of the person signing off on the SPDX report" msgstr "" #: src/reuse/spdx.py:44 msgid "name of the organization signing off on the SPDX report" msgstr "" #: 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 "" #: /usr/lib/python3.8/argparse.py:307 msgid "usage: " msgstr "kullanım: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() tanımlı değil" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "bilinmeyen ayrıştıcı %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "%r kipine sahip \"-\" argümanı" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' açılamıyor: %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "eylemler birleştirilemiyor - iki grup %r olarak adlandırılmış" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' konumsal parametre için hatalı bir değişkendir" #: /usr/lib/python3.8/argparse.py:1499 #, python-format msgid "" "invalid option string %(option)r: must start with a character " "%(prefix_chars)r" msgstr "hatalı %(option)r seçeneği: %(prefix_chars)r karakteriye başlamalı" #: /usr/lib/python3.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "%r gibi seçenekler için dest= gerekli" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "hatalı conflict_resolution değeri: %r" #: /usr/lib/python3.8/argparse.py:1554 #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "çelişkili seçenek karakter dizisi: %s" msgstr[1] "çelişkili seçenek karakter dizisi: %s" #: /usr/lib/python3.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "ayrık seçenekler isteğe bağlı olmalı" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "konumsal değişkenler" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "isteğe bağlı değişkenler" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "bu yardım mesajını gösterip çık" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "birden fazla altayrıştırıcı değişkeni içeremez" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "tanımlanamayan değişkenler: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "%s değişkeniyle izin yok" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "açık %r değişkeni yok sayıldı" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "şu değişkenler gereklidir: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "%s değişkenlerinden biri gereklidir" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "bir değişken bekleniyor" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "en fazla bir değişken bekleniyor" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "en azından bir değişken bekleniyor" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s değişkeni bekleniyor" msgstr[1] "%s değişkenleri bekleniyor" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "belirsiz seçenek: %(option)s, %(matches)s ile eşleşebilir" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "beklenmedik seçenek karakter dizisi: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r çağrılabilir değil" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "hatalı %(type)s değeri: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "hatalı tercih: %(value)r (%(choices)s seçilmelidir)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" #, fuzzy #~ msgid "conflicting subparser: %s" #~ msgstr "çelişkili seçenek karakter dizisi: %s" #, fuzzy #~ msgid "conflicting subparser alias: %s" #~ msgstr "çelişkili seçenek karakter dizisi: %s" #~ msgid "can't open '%s': %s" #~ msgstr "'%s' açılamıyor: %s" #~ msgid "place header in path.license instead of path" #~ msgstr "başlığı path yerine path.license içerisine koy" #~ msgid "could not find Git" #~ msgstr "Git bulunamadı" #~ msgid "'{path}' does not end with .spdx" #~ msgstr "'{path}' .spdx ile bitmiyor" reuse-tool-2.1.0/po/uk.po000066400000000000000000001137741445545121300152260ustar00rootroot00000000000000# 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. # SPDX-License-Identifier: GPL-3.0-or-later # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-07-18 08:51+0000\n" "PO-Revision-Date: 2023-07-07 18:47+0000\n" "Last-Translator: Ihor Hordiichuk \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.0-dev\n" #: src/reuse/_main.py:34 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:40 msgid "" "This version of reuse is compatible with version {} of the REUSE " "Specification." msgstr "Ця версія reuse сумісна з версією {} специфікації REUSE." #: src/reuse/_main.py:43 msgid "Support the FSFE's work:" msgstr "Підтримати роботу FSFE:" #: src/reuse/_main.py:47 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:70 msgid "enable debug statements" msgstr "увімкнути інструкції налагодження" #: src/reuse/_main.py:75 msgid "hide deprecation warnings" msgstr "сховати попередження про застарілість" #: src/reuse/_main.py:80 msgid "do not skip over Git submodules" msgstr "не пропускати підмодулі Git" #: src/reuse/_main.py:85 msgid "do not skip over Meson subprojects" msgstr "не пропускати підпроєкти Meson" #: src/reuse/_main.py:90 msgid "do not use multiprocessing" msgstr "не використовувати багатопроцесорність" #: src/reuse/_main.py:97 msgid "define root of project" msgstr "визначити кореневий каталог проєкту" #: src/reuse/_main.py:102 msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" #: src/reuse/_main.py:106 msgid "subcommands" msgstr "підкоманди" #: src/reuse/_main.py:113 msgid "add copyright and licensing into the header of files" msgstr "додати авторські права та ліцензії в заголовок файлів" #: src/reuse/_main.py:116 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 --explicit-license is specified, the " "header is placed in a .license file." msgstr "" "Додайте відомості про авторські права та ліцензування в заголовок одного або " "кількох файлів.\n" "\n" "За допомогою --copyright і --license ви можете вказати, яких власників " "авторських прав і ліцензій слід додати до заголовків цих файлів.\n" "\n" "Використовуючи --contributor, ви можете вказати людей або організацію, які " "зробили внесок, але не є власниками авторських прав на дані файли.\n" "Перший коментар замінено новим заголовком, що містить нову інформацію про " "авторське право та ліцензування, а також попередні авторські права та " "ліцензування. Якщо ви хочете залишити перший коментар недоторканим, " "використовуйте --no-replace --no-replace.\n" "\n" "Стиль коментарів має бути визначено автоматично для ваших файлів. Якщо стиль " "коментаря не вдалося визначити й не вказано --skip-unrecognised, процес буде " "перервано. Використовуйте --style, щоб вказати або перевизначити стиль " "коментування.\n" "\n" "Стиль однорядкового коментаря буде використано, якщо він доступний. Якщо " "стиль однорядкового коментаря недоступний, використовується стиль " "багаторядкового коментаря. Ви можете примусово застосувати певний стиль " "коментарів за допомогою --single-line або --multi-line.\n" "\n" "Ви можете змінити шаблон заголовка коментаря за допомогою --template. " "Помістіть шаблон Jinja2 до теки .reuse/templates/mytemplate.jinja2. Ви " "можете використовувати шаблон, вказавши '--template mytemplate'. Прочитайте " "онлайн-документацію про те, як користуватися цією функцією.\n" "\n" "Якщо виявлено двійковий файл або якщо вказано --explicit-license, заголовок " "буде розміщено у файлі .license." #: src/reuse/_main.py:159 msgid "deprecated in favor of annotate" msgstr "вилучено на користь анотації" #: src/reuse/_main.py:167 msgid "download a license and place it in the LICENSES/ directory" msgstr "завантажити ліцензію та розмістити її в каталозі LICENSES/" #: src/reuse/_main.py:170 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:193 msgid "initialize REUSE project" msgstr "ініціалізувати проєкт REUSE" #: src/reuse/_main.py:201 msgid "list all non-compliant files" msgstr "список усіх несумісних файлів" #: src/reuse/_main.py:204 #, 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:231 msgid "print the project's bill of materials in SPDX format" msgstr "друкувати опис матеріалів проєкту у форматі SPDX" #: src/reuse/_main.py:239 msgid "list all supported SPDX licenses" msgstr "список всіх підтримуваних ліцензій SPDX" #: src/reuse/_util.py:342 #, python-brace-format msgid "Could not parse '{expression}'" msgstr "Не вдалося проаналізувати '{expression}'" #: src/reuse/_util.py:476 msgid "'{}' is not a file" msgstr "'{}' не є файлом" #: src/reuse/_util.py:479 msgid "'{}' is not a directory" msgstr "'{}' не є каталогом" #: src/reuse/_util.py:482 msgid "can't open '{}'" msgstr "не вдалося відкрити '{}'" #: src/reuse/_util.py:487 msgid "can't write to directory '{}'" msgstr "неможливо записати в каталог '{}'" #: src/reuse/_util.py:493 src/reuse/header.py:575 msgid "can't write to '{}'" msgstr "неможливо записати в '{}'" #: src/reuse/_util.py:506 msgid "can't read or write '{}'" msgstr "неможливо прочитати чи записати '{}'" #: src/reuse/_util.py:516 msgid "'{}' is not a valid SPDX expression, aborting" msgstr "'{}' не є дійсним виразом SPDX, переривання" #: src/reuse/_util.py:544 msgid "'{}' is not a valid SPDX License Identifier." msgstr "'{}' не є дійсним ідентифікатором ліцензії SPDX." #: src/reuse/_util.py:551 msgid "Did you mean:" msgstr "Ви мали на увазі:" #: src/reuse/_util.py:558 msgid "" "See for a list of valid SPDX License " "Identifiers." msgstr "" "Перегляньте список дійсних ідентифікаторів " "ліцензії SPDX." #: src/reuse/download.py:88 msgid "SPDX License Identifier of license" msgstr "Ідентифікатор ліцензії SPDX" #: src/reuse/download.py:93 msgid "download all missing licenses detected in the project" msgstr "завантажити всі відсутні ліцензії, виявлені в проєкті" #: src/reuse/download.py:105 #, python-brace-format msgid "Error: {spdx_identifier} already exists." msgstr "Помилка: {spdx_identifier} вже існує." #: src/reuse/download.py:112 msgid "Error: Failed to download license." msgstr "Помилка: не вдалося завантажити ліцензію." #: src/reuse/download.py:117 msgid "Is your internet connection working?" msgstr "Чи працює ваше інтернет-з'єднання?" #: src/reuse/download.py:122 #, python-brace-format msgid "Successfully downloaded {spdx_identifier}." msgstr "Успішно завантажено {spdx_identifier}." #: src/reuse/download.py:134 msgid "--output has no effect when used together with --all" msgstr "--output не працює разом з --all" #: src/reuse/download.py:138 msgid "the following arguments are required: license" msgstr "необхідні такі аргументи: license" #: src/reuse/download.py:140 msgid "cannot use --output with more than one license" msgstr "не можна використовувати --output з кількома ліцензіями" #: src/reuse/header.py:132 msgid "generated comment is missing copyright lines or license expressions" msgstr "" "у згенерованому коментарі відсутні рядки про авторські права або вирази " "ліцензії" #: src/reuse/header.py:414 #, python-brace-format msgid "" "'{path}' does not support single-line comments, please do not use --single-" "line" msgstr "" "'{path}' не підтримує однорядкові коментарі, не використовуйте --single-line" #: src/reuse/header.py:421 #, python-brace-format msgid "" "'{path}' does not support multi-line comments, please do not use --multi-line" msgstr "" "'{path}' не підтримує багаторядкові коментарі, не використовуйте --multi-line" #: src/reuse/header.py:444 msgid "" "The following files do not have a recognised file extension. Please use --" "style, --force-dot-license or --skip-unrecognised:" msgstr "" "Ці файли не мають розпізнаного розширення файлу. Використовуйте --style, --" "force-dot-license або --skip-unrecognised:" #: src/reuse/header.py:497 #, python-brace-format msgid "Skipped unrecognised file {path}" msgstr "Пропущений нерозпізнаний файл {path}" #: src/reuse/header.py:509 #, python-brace-format msgid "Skipped file '{path}' already containing REUSE information" msgstr "Пропущений файл '{path}' вже містить інформацію REUSE" #: src/reuse/header.py:543 #, python-brace-format msgid "Error: Could not create comment for '{path}'" msgstr "Помилка: не вдалося створити коментар для '{path}'" #: src/reuse/header.py:550 #, 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/header.py:561 #, python-brace-format msgid "Successfully changed header of {path}" msgstr "Успішно змінено заголовок {path}" #: src/reuse/header.py:586 msgid "copyright statement, repeatable" msgstr "оголошення авторського права, повторюване" #: src/reuse/header.py:593 msgid "SPDX Identifier, repeatable" msgstr "Ідентифікатор SPDX, повторюваний" #: src/reuse/header.py:599 msgid "file contributor, repeatable" msgstr "співавтор файлу, повторюваний" #: src/reuse/header.py:606 msgid "year of copyright statement, optional" msgstr "рік оголошення авторського права, необов'язково" #: src/reuse/header.py:614 msgid "comment style to use, optional" msgstr "використовуваний стиль коментарів, необов'язковий" #: src/reuse/header.py:620 msgid "copyright style to use, optional" msgstr "використовуваний стиль авторського права, необов'язковий" #: src/reuse/header.py:627 msgid "name of template to use, optional" msgstr "використовувана назва шаблону, необов'язково" #: src/reuse/header.py:632 msgid "do not include year in statement" msgstr "не включати рік в оголошення" #: src/reuse/header.py:637 msgid "merge copyright lines if copyright statements are identical" msgstr "" "об’єднувати рядки авторських прав, якщо оголошення авторських прав ідентичні" #: src/reuse/header.py:642 msgid "force single-line comment style, optional" msgstr "примусовий однорядковий стиль коментаря, необов'язково" #: src/reuse/header.py:647 msgid "force multi-line comment style, optional" msgstr "примусовий багаторядковий стиль коментарів, необов'язково" #: src/reuse/header.py:657 msgid "write a .license file instead of a header inside the file" msgstr "записувати файл .license замість заголовка всередині файлу" #: src/reuse/header.py:664 msgid "add headers to all files under specified directories recursively" msgstr "рекурсивно додавати заголовки до всіх файлів у вказаних каталогах" #: src/reuse/header.py:671 msgid "do not replace the first header in the file; just add a new one" msgstr "не замінювати перший заголовок у файлі; просто додавати новий" #: src/reuse/header.py:677 msgid "skip files with unrecognised comment styles" msgstr "пропускати файли з нерозпізнаними стилями коментарів" #: src/reuse/header.py:682 msgid "skip files that already contain REUSE information" msgstr "пропускати файли, які вже містять інформацію REUSE" #: src/reuse/header.py:693 msgid "'reuse addheader' has been deprecated in favour of 'reuse annotate'" msgstr "'reuse addheader' застаріло й замінено на 'reuse annotate'" #: src/reuse/header.py:700 msgid "option --contributor, --copyright or --license is required" msgstr "потрібен параметр --contributor, --copyright або --license" #: src/reuse/header.py:705 msgid "option --exclude-year and --year are mutually exclusive" msgstr "параметр --exclude-year і --year взаємосуперечливі" #: src/reuse/header.py:710 msgid "option --single-line and --multi-line are mutually exclusive" msgstr "параметр --single-line і --multi-line взаємосуперечливі" #: src/reuse/header.py:716 msgid "--skip-unrecognised has no effect when used together with --style" msgstr "--skip-unrecognised не працює разом із --style" #: src/reuse/header.py:723 msgid "--explicit-license has been deprecated in favour of --force-dot-license" msgstr "--explicit-license замінено на --force-dot-license" #: src/reuse/header.py:767 #, python-brace-format msgid "template {template} could not be found" msgstr "не вдалося знайти шаблон {template}" #: src/reuse/header.py:819 #, python-brace-format msgid "'{path}' is a binary, therefore using '{new_path}' for the header" msgstr "" "'{path}' — це двійковий файл, тому для заголовка використовується " "'{new_path}'" #: src/reuse/init.py:25 msgid "" "What license is your project under? Provide the SPDX License Identifier." msgstr "" "Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX." #: src/reuse/init.py:29 msgid "" "What other license is your project under? Provide the SPDX License " "Identifier." msgstr "" "Якою ліцензією захищено ваш проєкт? Надайте ідентифікатор ліцензії SPDX." #: src/reuse/init.py:40 msgid "To stop adding licenses, hit RETURN." msgstr "Щоб припинити додавання ліцензій, натисніть RETURN." #: src/reuse/init.py:78 msgid "Project already initialized" msgstr "Проєкт уже ініціалізовано" #: src/reuse/init.py:82 msgid "Initializing project for REUSE." msgstr "Ініціалізація проєкту для REUSE." #: src/reuse/init.py:87 msgid "What is the name of the project?" msgstr "Як називається проєкт?" #: src/reuse/init.py:93 msgid "What is the internet address of the project?" msgstr "Яка інтернет-адреса проєкту?" #: src/reuse/init.py:99 msgid "What is the name of the maintainer?" msgstr "Як звуть супроводжувача?" #: src/reuse/init.py:105 msgid "What is the e-mail address of the maintainer?" msgstr "Яка адреса електронної пошти супровідника?" #: src/reuse/init.py:111 msgid "All done! Initializing now." msgstr "Усе готово! Відбувається ініціалізація." #: src/reuse/init.py:119 msgid "Downloading {}" msgstr "Завантаження {}" #: src/reuse/init.py:124 msgid "{} already exists" msgstr "{} вже існує" #: src/reuse/init.py:127 msgid "Could not download {}" msgstr "Не вдалося завантажити {}" #: src/reuse/init.py:132 msgid "Creating .reuse/dep5" msgstr "Створення .reuse/dep5" #: src/reuse/init.py:155 msgid "Initialization complete." msgstr "Ініціалізація завершена." #: src/reuse/lint.py:27 msgid "prevents output" msgstr "запобігає виводу" #: src/reuse/lint.py:30 msgid "formats output as JSON" msgstr "форматує вивід як JSON" #: src/reuse/lint.py:36 msgid "formats output as plain text" msgstr "форматує вивід як звичайний текст" #: src/reuse/lint.py:52 msgid "BAD LICENSES" msgstr "ПОГАНІ ЛІЦЕНЗІЇ" #: src/reuse/lint.py:54 src/reuse/lint.py:83 msgid "'{}' found in:" msgstr "'{}' знайдено в:" #: src/reuse/lint.py:61 msgid "DEPRECATED LICENSES" msgstr "ЗАСТАРІЛІ ЛІЦЕНЗІЇ" #: src/reuse/lint.py:63 msgid "The following licenses are deprecated by SPDX:" msgstr "У SPDX застаріли такі ліцензії:" #: src/reuse/lint.py:71 msgid "LICENSES WITHOUT FILE EXTENSION" msgstr "ЛІЦЕНЗІЇ БЕЗ РОЗШИРЕННЯ ФАЙЛУ" #: src/reuse/lint.py:73 msgid "The following licenses have no file extension:" msgstr "Ці ліцензії не мають розширення файлу:" #: src/reuse/lint.py:81 msgid "MISSING LICENSES" msgstr "ВІДСУТНІ ЛІЦЕНЗІЇ" #: src/reuse/lint.py:90 msgid "UNUSED LICENSES" msgstr "НЕВИКОРИСТАНІ ЛІЦЕНЗІЇ" #: src/reuse/lint.py:91 msgid "The following licenses are not used:" msgstr "Не використовуються такі ліцензії:" #: src/reuse/lint.py:98 msgid "READ ERRORS" msgstr "ПОМИЛКИ ЧИТАННЯ" #: src/reuse/lint.py:99 msgid "Could not read:" msgstr "Не вдалося прочитати:" #: src/reuse/lint.py:120 msgid "MISSING COPYRIGHT AND LICENSING INFORMATION" msgstr "ВІДСУТНІ ВІДОМОСТІ ПРО АВТОРСЬКІ ПРАВА ТА ЛІЦЕНЗУВАННЯ" #: src/reuse/lint.py:126 msgid "The following files have no copyright and licensing information:" msgstr "Ці файли не містять відомостей про авторські права та ліцензії:" #: src/reuse/lint.py:137 msgid "The following files have no copyright information:" msgstr "Такі файли не містять відомостей про авторські права:" #: src/reuse/lint.py:146 msgid "The following files have no licensing information:" msgstr "Такі файли не мають відомостей про ліцензування:" #: src/reuse/lint.py:154 msgid "SUMMARY" msgstr "ПІДСУМОК" #: src/reuse/lint.py:159 msgid "Bad licenses:" msgstr "Погані ліцензії:" #: src/reuse/lint.py:160 msgid "Deprecated licenses:" msgstr "Застарілі ліцензії:" #: src/reuse/lint.py:161 msgid "Licenses without file extension:" msgstr "Ліцензії без розширення файлу:" #: src/reuse/lint.py:164 msgid "Missing licenses:" msgstr "Відсутні ліцензії:" #: src/reuse/lint.py:165 msgid "Unused licenses:" msgstr "Невикористані ліцензії:" #: src/reuse/lint.py:166 msgid "Used licenses:" msgstr "Використані ліцензії:" #: src/reuse/lint.py:167 msgid "Read errors:" msgstr "Помилки читання:" #: src/reuse/lint.py:169 msgid "files with copyright information:" msgstr "файли з відомостями про авторські права:" #: src/reuse/lint.py:173 msgid "files with license information:" msgstr "файли з відомостями про ліцензію:" #: src/reuse/lint.py:190 msgid "" "Congratulations! Your project is compliant with version {} of the REUSE " "Specification :-)" msgstr "Вітаємо! Ваш проєкт відповідає версії {} специфікації REUSE :-)" #: src/reuse/lint.py:197 msgid "" "Unfortunately, your project is not compliant with version {} of the REUSE " "Specification :-(" msgstr "На жаль, ваш проєкт не сумісний із версією {} специфікації REUSE :-(" #: src/reuse/project.py:77 msgid "" "project is not a VCS repository or required VCS software is not installed" msgstr "" "проект не є репозиторієм VCS або потрібне програмне забезпечення VCS не " "встановлено" #: src/reuse/project.py:184 #, python-brace-format msgid "'{path}' covered by .reuse/dep5" msgstr "'{path}' охоплюється .reuse/dep5" #: src/reuse/project.py:217 #, python-brace-format msgid "" "'{path}' holds an SPDX expression that cannot be parsed, skipping the file" msgstr "" "'{path}' містить вираз SPDX, який неможливо проаналізувати, пропуск файлу" #: src/reuse/project.py:226 #, 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." msgstr "" "Інформацію про авторське право та ліцензування для '{original_path}' можна " "знайти як у '{path}', так і у файлі DEP5, розташованому за адресою " "'{dep5_path}'. Інформація для цих двох джерел була агрегована. У майбутньому " "ця поведінка зміниться, і вам потрібно буде явно увімкнути агрегування. " "Перегляньте . Наразі вам не " "потрібно нічого робити. Запустіть програму з `--suppress-deprecation`, щоб " "сховати це попередження." #: src/reuse/project.py:313 msgid ".reuse/dep5 has syntax errors" msgstr ".reuse/dep5 має синтаксичні помилки" #: src/reuse/project.py:315 msgid ".reuse/dep5 could not be parsed as utf-8" msgstr "Не вдалося .reuse/dep5 було проаналізувати як utf-8" #: src/reuse/project.py:341 #, python-brace-format msgid "determining identifier of '{path}'" msgstr "визначення ідентифікатора '{path}'" #: src/reuse/project.py:349 #, python-brace-format msgid "{path} does not have a file extension" msgstr "{path} не має розширення файлу" #: src/reuse/project.py:359 #, 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:371 #, python-brace-format msgid "" "{identifier} is the SPDX License Identifier of both {path} and {other_path}" msgstr "" "{identifier} — це ідентифікатор ліцензії SPDX для {path} і {other_path}" #: src/reuse/report.py:263 #, python-brace-format msgid "Could not read '{path}'" msgstr "Не вдалося прочитати '{path}'" #: src/reuse/report.py:270 #, python-brace-format msgid "Unexpected error occurred while parsing '{path}'" msgstr "Під час аналізу '{path}' сталася неочікувана помилка" #: 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 "" "помилка: --creator-person=NAME або --creator-organization=NAME вимагається, " "якщо надається --add-license-concluded" #: 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.8/argparse.py:307 msgid "usage: " msgstr "використання: " #: /usr/lib/python3.8/argparse.py:858 msgid ".__call__() not defined" msgstr ".__call__() не визначено" #: /usr/lib/python3.8/argparse.py:1161 #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" #: /usr/lib/python3.8/argparse.py:1221 #, python-format msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" з режимом %r" #: /usr/lib/python3.8/argparse.py:1230 #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не вдалося відкрити '%(filename)s': %(error)s" #: /usr/lib/python3.8/argparse.py:1439 #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "не вдалося об'єднати дії - дві групи називаються %r" #: /usr/lib/python3.8/argparse.py:1477 msgid "'required' is an invalid argument for positionals" msgstr "'required' — неприпустимий аргумент для позиційних значень" #: /usr/lib/python3.8/argparse.py:1499 #, 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.8/argparse.py:1519 #, python-format msgid "dest= is required for options like %r" msgstr "dest= потрібен для таких опцій, як %r" #: /usr/lib/python3.8/argparse.py:1536 #, python-format msgid "invalid conflict_resolution value: %r" msgstr "недійсне значення conflict_resolution: %r" #: /usr/lib/python3.8/argparse.py:1554 #, 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.8/argparse.py:1620 msgid "mutually exclusive arguments must be optional" msgstr "взаємозаперечні аргументи повинні бути необов'язковими" #: /usr/lib/python3.8/argparse.py:1683 msgid "positional arguments" msgstr "позиційні аргументи" #: /usr/lib/python3.8/argparse.py:1684 msgid "optional arguments" msgstr "необов'язкові аргументи" #: /usr/lib/python3.8/argparse.py:1699 msgid "show this help message and exit" msgstr "показати це повідомлення та вийти" #: /usr/lib/python3.8/argparse.py:1730 msgid "cannot have multiple subparser arguments" msgstr "не може мати кілька аргументів підпарсера" #: /usr/lib/python3.8/argparse.py:1782 /usr/lib/python3.8/argparse.py:2289 #, python-format msgid "unrecognized arguments: %s" msgstr "нерозпізнані аргументи: %s" #: /usr/lib/python3.8/argparse.py:1879 #, python-format msgid "not allowed with argument %s" msgstr "не дозволено з аргументом %s" #: /usr/lib/python3.8/argparse.py:1925 /usr/lib/python3.8/argparse.py:1939 #, python-format msgid "ignored explicit argument %r" msgstr "нехтується явний аргумент %r" #: /usr/lib/python3.8/argparse.py:2046 #, python-format msgid "the following arguments are required: %s" msgstr "такі аргументи обов'язкові: %s" #: /usr/lib/python3.8/argparse.py:2061 #, python-format msgid "one of the arguments %s is required" msgstr "один з аргументів %s обов'язковий" #: /usr/lib/python3.8/argparse.py:2104 msgid "expected one argument" msgstr "очікується один аргумент" #: /usr/lib/python3.8/argparse.py:2105 msgid "expected at most one argument" msgstr "очікується щонайбільше один аргумент" #: /usr/lib/python3.8/argparse.py:2106 msgid "expected at least one argument" msgstr "очікується хоча б один аргумент" #: /usr/lib/python3.8/argparse.py:2110 #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "очікується %s аргумент" msgstr[1] "очікується %s аргументи" msgstr[2] "очікується %s аргументів" #: /usr/lib/python3.8/argparse.py:2168 #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" #: /usr/lib/python3.8/argparse.py:2232 #, python-format msgid "unexpected option string: %s" msgstr "неочікуваний рядок параметрів: %s" #: /usr/lib/python3.8/argparse.py:2429 #, python-format msgid "%r is not callable" msgstr "%r не можна викликати" #: /usr/lib/python3.8/argparse.py:2446 #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "недійсне значення %(type)s: %(value)r" #: /usr/lib/python3.8/argparse.py:2457 #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неприпустимий вибір: %(value)r (варто обрати з %(choices)s)" #: /usr/lib/python3.8/argparse.py:2533 #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" #~ msgid "options" #~ msgstr "параметри" #~ msgid "argument %(argument_name)s: %(message)s" #~ msgstr "аргумент %(argument_name)s: %(message)s" #~ msgid "conflicting subparser: %s" #~ msgstr "конфліктний субпарсер: %s" #~ msgid "conflicting subparser alias: %s" #~ msgstr "конфліктний псевдонім субпарсера: %s" #~ msgid "can't open '%s': %s" #~ msgstr "не вдалося відкрити '%s': %s" #~ msgid "could not find supported VCS" #~ msgstr "не вдалося знайти підтримуваний VCS" reuse-tool-2.1.0/poetry.lock000066400000000000000000003076751445545121300160320ustar00rootroot00000000000000[[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "astroid" version = "2.15.5" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.7.2" [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 = "babel" version = "2.12.1" description = "Internationalization utilities" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" category = "dev" optional = false python-versions = ">=3.6.0" [package.dependencies] soupsieve = ">1.2" [package.extras] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "binaryornot" version = "0.4.4" description = "Ultra-lightweight pure Python package to check if a file is binary or text." category = "main" optional = false python-versions = "*" [package.dependencies] chardet = ">=3.0.2" [[package]] name = "black" version = "23.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boolean-py" version = "4.0" description = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL." category = "main" optional = false python-versions = "*" [[package]] name = "bump2version" version = "1.0.1" description = "Version-bump your software with a single command!" category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "certifi" version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." category = "dev" optional = false python-versions = ">=3.6.1" [[package]] name = "chardet" version = "5.1.0" description = "Universal encoding detector for Python 3" category = "main" optional = false python-versions = ">=3.7" [[package]] name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false python-versions = ">=3.7.0" [[package]] name = "click" version = "8.1.3" description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" version = "0.4.6" 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)"] [[package]] name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] toml = ["tomli"] [[package]] name = "dill" version = "0.3.6" description = "serialize all of python" category = "dev" optional = false python-versions = ">=3.7" [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" version = "0.3.6" description = "Distribution utilities" category = "dev" optional = false python-versions = "*" [[package]] name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" [package.extras] test = ["pytest (>=6)"] [[package]] name = "filelock" version = "3.12.2" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.7" [package.extras] docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "furo" version = "2023.5.20" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" sphinx = ">=6.0,<8.0" sphinx-basic-ng = "*" [[package]] name = "gitdb" version = "4.0.10" description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" version = "3.1.31" description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" [[package]] name = "identify" version = "2.5.24" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.7" [package.extras] license = ["ukkonen"] [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "imagesize" version = "1.4.1" 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.*" [[package]] name = "importlib-metadata" version = "6.7.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" [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"] 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 (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.8.0" [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"] [[package]] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "license-expression" version = "30.1.1" 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" [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)"] testing = ["black", "isort", "pytest (>=6,!=7.0.0)", "pytest-xdist (>=2)", "twine"] [[package]] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" [[package]] name = "mypy" version = "1.4.0" description = "Optional static typing for Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] python2 = ["typed-ast (>=1.4.0,<2)"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false python-versions = ">=3.5" [[package]] name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" [package.dependencies] setuptools = "*" [[package]] name = "packaging" version = "23.1" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "pathspec" version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "pbr" version = "5.11.1" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" [[package]] name = "platformdirs" version = "3.7.0" 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" [package.extras] docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.7" [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false python-versions = ">=3.7" [package.extras] plugins = ["importlib-metadata"] [[package]] name = "pylint" version = "2.17.4" description = "python code static checker" category = "dev" optional = false python-versions = ">=3.7.2" [package.dependencies] astroid = ">=2.15.4,<=2.17.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\""}, ] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomlkit = ">=0.10.1" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] [[package]] name = "pytest" version = "7.3.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [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\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "python-debian" version = "0.1.49" description = "Debian package related modules" category = "main" optional = false python-versions = ">=3.5" [package.dependencies] chardet = "*" [[package]] name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" category = "dev" optional = false python-versions = "*" [[package]] name = "pyyaml" version = "6.0" 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.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "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 (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "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]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" category = "dev" optional = false python-versions = ">=3.6" [[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 = "*" [[package]] name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "sphinx" version = "7.0.1" description = "Python documentation generator" category = "dev" optional = false python-versions = ">=3.8" [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" packaging = ">=21.0" Pygments = ">=2.13" requests = ">=2.25.0" snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-autodoc-typehints" version = "1.23.2" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false python-versions = ">=3.8" [package.dependencies] sphinx = ">=7.0.1" [package.extras] docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)"] numpy = ["nptyping (>=2.5)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.6.3)"] type-comment = ["typed-ast (>=1.5.4)"] [[package]] name = "sphinx-basic-ng" version = "1.0.0b1" description = "A modern skeleton for Sphinx themes." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] sphinx = ">=4.0" [package.extras] docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] [[package]] name = "sphinxcontrib-apidoc" version = "0.3.0" description = "A Sphinx extension for running 'sphinx-apidoc' on each build" category = "dev" optional = false python-versions = "*" [package.dependencies] pbr = "*" Sphinx = ">=1.6.0" [[package]] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "dev" optional = false python-versions = ">=3.8" [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false python-versions = ">=3.8" [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" category = "dev" optional = false python-versions = ">=3.5" [package.extras] test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." category = "dev" optional = false python-versions = ">=3.5" [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "tomlkit" version = "0.11.8" description = "Style preserving TOML library" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "typing-extensions" version = "4.6.3" description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false python-versions = ">=3.7" [[package]] name = "urllib3" version = "2.0.3" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=3.7" [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"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" version = "20.23.1" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] distlib = ">=0.3.6,<1" filelock = ">=3.12,<4" platformdirs = ">=3.5.1,<4" [package.extras] docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "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.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] [[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.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = "^3.8" content-hash = "8b2ac4f1675c64e17085ff665baf650fe01543a60df7ad4886c928ceb52d4877" [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.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, ] babel = [ {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] 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.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, ] 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.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] cfgv = [ {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] chardet = [ {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, ] charset-normalizer = [ {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] 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.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, ] dill = [ {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, ] distlib = [ {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] 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.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] filelock = [ {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, ] furo = [ {file = "furo-2023.5.20-py3-none-any.whl", hash = "sha256:594a8436ddfe0c071f3a9e9a209c314a219d8341f3f1af33fdf7c69544fab9e6"}, {file = "furo-2023.5.20.tar.gz", hash = "sha256:40e09fa17c6f4b22419d122e933089226dcdb59747b5b6c79363089827dea16f"}, ] gitdb = [ {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] gitpython = [ {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, ] identify = [ {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] 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.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ] 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"}, ] 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-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.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3af348e0925a59213244f28c7c0c3a2c2088b4ba2fe9d6c8d4fbb0aba0b7d05"}, {file = "mypy-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0b2e0da7ff9dd8d2066d093d35a169305fc4e38db378281fce096768a3dbdbf"}, {file = "mypy-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210fe0f39ec5be45dd9d0de253cb79245f0a6f27631d62e0c9c7988be7152965"}, {file = "mypy-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f7a5971490fd4a5a436e143105a1f78fa8b3fe95b30fff2a77542b4f3227a01f"}, {file = "mypy-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:50f65f0e9985f1e50040e603baebab83efed9eb37e15a22a4246fa7cd660f981"}, {file = "mypy-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1b5c875fcf3e7217a3de7f708166f641ca154b589664c44a6fd6d9f17d9e7e"}, {file = "mypy-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4c734d947e761c7ceb1f09a98359dd5666460acbc39f7d0a6b6beec373c5840"}, {file = "mypy-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5984a8d13d35624e3b235a793c814433d810acba9eeefe665cdfed3d08bc3af"}, {file = "mypy-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0f98973e39e4a98709546a9afd82e1ffcc50c6ec9ce6f7870f33ebbf0bd4f26d"}, {file = "mypy-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:19d42b08c7532d736a7e0fb29525855e355fa51fd6aef4f9bbc80749ff64b1a2"}, {file = "mypy-1.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ba9a69172abaa73910643744d3848877d6aac4a20c41742027dcfd8d78f05d9"}, {file = "mypy-1.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34eed094c16cad0f6b0d889811592c7a9b7acf10d10a7356349e325d8704b4f"}, {file = "mypy-1.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:53c2a1fed81e05ded10a4557fe12bae05b9ecf9153f162c662a71d924d504135"}, {file = "mypy-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bba57b4d2328740749f676807fcf3036e9de723530781405cc5a5e41fc6e20de"}, {file = "mypy-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:653863c75f0dbb687d92eb0d4bd9fe7047d096987ecac93bb7b1bc336de48ebd"}, {file = "mypy-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7461469e163f87a087a5e7aa224102a30f037c11a096a0ceeb721cb0dce274c8"}, {file = "mypy-1.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf0ca95e4b8adeaf07815a78b4096b65adf64ea7871b39a2116c19497fcd0dd"}, {file = "mypy-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94a81b9354545123feb1a99b960faeff9e1fa204fce47e0042335b473d71530d"}, {file = "mypy-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:67242d5b28ed0fa88edd8f880aed24da481929467fdbca6487167cb5e3fd31ff"}, {file = "mypy-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f2b353eebef669529d9bd5ae3566905a685ae98b3af3aad7476d0d519714758"}, {file = "mypy-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62bf18d97c6b089f77f0067b4e321db089d8520cdeefc6ae3ec0f873621c22e5"}, {file = "mypy-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca33ab70a4aaa75bb01086a0b04f0ba8441e51e06fc57e28585176b08cad533b"}, {file = "mypy-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a0ee54c2cb0f957f8a6f41794d68f1a7e32b9968675ade5846f538504856d42"}, {file = "mypy-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6c34d43e3d54ad05024576aef28081d9d0580f6fa7f131255f54020eb12f5352"}, {file = "mypy-1.4.0-py3-none-any.whl", hash = "sha256:f051ca656be0c179c735a4c3193f307d34c92fdc4908d44fd4516fbe8b10567d"}, {file = "mypy-1.4.0.tar.gz", hash = "sha256:de1e7e68148a213036276d1f5303b3836ad9a774188961eb2684eddff593b042"}, ] 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.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] pathspec = [ {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] 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.7.0-py3-none-any.whl", hash = "sha256:cfd065ba43133ff103ab3bd10aecb095c2a0035fcd1f07217c9376900d94ba07"}, {file = "platformdirs-3.7.0.tar.gz", hash = "sha256:87fbf6473e87c078d536980ba970a472422e94f17b752cfad17024c18876d481"}, ] pluggy = [ {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] 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.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] pylint = [ {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, ] pytest = [ {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, ] 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"}, ] pytz = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] 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.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] smmap = [ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] 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.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] sphinx = [ {file = "Sphinx-7.0.1.tar.gz", hash = "sha256:61e025f788c5977d9412587e733733a289e2b9fdc2fef8868ddfbfc4ccfe881d"}, {file = "sphinx-7.0.1-py3-none-any.whl", hash = "sha256:60c5e04756c1709a98845ed27a2eed7a556af3993afb66e77fec48189f742616"}, ] sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.23.2-py3-none-any.whl", hash = "sha256:92d0074e48acf26551795e1fad3416709fa7f1d67b809ce76e4aa093e032ad90"}, {file = "sphinx_autodoc_typehints-1.23.2.tar.gz", hash = "sha256:dd8e999eb7d31643d42eb7d4673e0551c44af31a9e0fc07ddbc893b063d88658"}, ] sphinx-basic-ng = [ {file = "sphinx_basic_ng-1.0.0b1-py3-none-any.whl", hash = "sha256:ade597a3029c7865b24ad0eda88318766bcc2f9f4cef60df7e28126fde94db2a"}, {file = "sphinx_basic_ng-1.0.0b1.tar.gz", hash = "sha256:89374bd3ccd9452a301786781e28c8718e99960f2d4f411845ea75fc7bb5a9b0"}, ] 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.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, ] typing-extensions = [ {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, ] urllib3 = [ {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, ] virtualenv = [ {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, ] 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.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] reuse-tool-2.1.0/pyproject.toml000066400000000000000000000061651445545121300165400ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Alliander N.V. # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2023 DB Systel GmbH # # SPDX-License-Identifier: GPL-3.0-or-later [tool.poetry] name = "reuse" version = "2.1.0" description = "reuse is a tool for compliance with the REUSE recommendations." authors = [ "Free Software Foundation Europe ", ] maintainers = [ "Carmen Bianca Bakker ", "Max Mehl ", "Linus Sehn ", ] license = "Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND GPL-3.0-or-later" readme = "README.md" packages = [ { include = "reuse", from = "src" } ] include = [ { path = "src/reuse/locale/**/*.mo", format="wheel" }, { path = "tests", format = "sdist" }, { path = "po", format = "sdist" }, { path = "AUTHORS.rst", format = "sdist" }, { path = "README.md", format = "sdist" }, { path = "CHANGELOG.md", format = "sdist" }, { path = ".reuse", format = "sdist" }, { path = "LICENSES", format = "sdist" }, { path = "docs", format = "sdist" }, ] homepage = "https://reuse.software/" repository = "https://github.com/fsfe/reuse-tool" documentation = "https://reuse.readthedocs.org/" classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved", "License :: DFSG approved", "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication", "License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", ] [tool.poetry.dependencies] python = "^3.8" Jinja2 = "^3.0.0" binaryornot = "^0.4.4" "boolean.py" = ">=3.8" license-expression = ">=1.0" python-debian = "^0.1.38,!=0.1.45,!=0.1.46,!=0.1.47" [tool.poetry.group.test.dependencies] pytest = ">=6.0.0" pytest-cov = ">=2.10.0" [tool.poetry.group.docs.dependencies] Sphinx = ">=4.0.0" recommonmark = "^0.7.1" sphinx-autodoc-typehints = "^1.12.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" [tool.poetry.scripts] reuse = 'reuse._main:main' [tool.poetry.build] generate-setup-file = false script = "_build.py" [build-system] requires = ["poetry-core>=1.1.0"] build-backend = "poetry.core.masonry.api" [tool.black] line-length = 80 [tool.isort] multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true line_length = 80 [tool.pytest.ini_options] addopts = "--doctest-modules" [tool.mypy] files = [ "src/reuse/**.py", "tests/**.py", ] exclude = [ '^_build\.py$', '^conf\.py$', ] [[tool.mypy.overrides]] module = "reuse.*" disallow_untyped_defs = true disallow_incomplete_defs = true [[tool.mypy.overrides]] module = [ "binaryornot.check", "boolean.boolean", "license_expression", "pkg_resources", ] ignore_missing_imports = true reuse-tool-2.1.0/src/000077500000000000000000000000001445545121300144035ustar00rootroot00000000000000reuse-tool-2.1.0/src/reuse/000077500000000000000000000000001445545121300155265ustar00rootroot00000000000000reuse-tool-2.1.0/src/reuse/__init__.py000066400000000000000000000137631445545121300176510ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2021 Alliander N.V. # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """reuse is a tool for compliance with the REUSE recommendations. Although the API is documented, it is **NOT** guaranteed stable between minor or even patch releases. The semantic versioning of this program pertains exclusively to the reuse CLI command. If you want to use reuse as a Python library, you should pin reuse to an exact version. Having given the above disclaimer, the API has been relatively stable nevertheless, and we (the maintainers) do make some efforts to not needlessly change the public API. """ import gettext import logging import os import re from dataclasses import dataclass, field from enum import Enum, auto from importlib.metadata import PackageNotFoundError, version from typing import Any, Dict, NamedTuple, Optional, Set, Type from boolean.boolean import Expression try: __version__ = version("reuse") except PackageNotFoundError: # package is not installed __version__ = "2.1.0" __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" _LOGGER = logging.getLogger(__name__) _PACKAGE_PATH = os.path.dirname(__file__) _LOCALE_DIR = os.path.join(_PACKAGE_PATH, "locale") if gettext.find("reuse", localedir=_LOCALE_DIR): gettext.bindtextdomain("reuse", _LOCALE_DIR) gettext.textdomain("reuse") _LOGGER.debug("translations found at %s", _LOCALE_DIR) else: _LOGGER.debug("no translations found at %s", _LOCALE_DIR) _IGNORE_DIR_PATTERNS = [ re.compile(r"^\.git$"), re.compile(r"^\.hg$"), re.compile(r"^LICENSES$"), re.compile(r"^\.reuse$"), ] _IGNORE_MESON_PARENT_DIR_PATTERNS = [ re.compile(r"^subprojects$"), ] _IGNORE_FILE_PATTERNS = [ re.compile(r"^LICENSE"), re.compile(r"^COPYING"), # ".git" as file happens in submodules re.compile(r"^\.git$"), re.compile(r"^\.gitkeep$"), re.compile(r"^\.hgtags$"), re.compile(r".*\.license$"), # Workaround for https://github.com/fsfe/reuse-tool/issues/229 re.compile(r"^CAL-1.0(-Combined-Work-Exception)?(\..+)?$"), re.compile(r"^SHL-2.1(\..+)?$"), ] _IGNORE_SPDX_PATTERNS = [ # SPDX files from # https://spdx.github.io/spdx-spec/conformance/#44-standard-data-format-requirements re.compile(r".*\.spdx$"), re.compile(r".*\.spdx.(rdf|json|xml|ya?ml)$"), ] # Combine SPDX patterns into file patterns to ease default ignore usage _IGNORE_FILE_PATTERNS.extend(_IGNORE_SPDX_PATTERNS) class SourceType(Enum): """ An enumeration representing the types of sources for license information. """ #: A .license file containing license information. DOT_LICENSE = "dot-license" #: A file header containing license information. FILE_HEADER = "file-header" #: A .reuse/dep5 file containing license information. DEP5 = "dep5" # TODO: In Python 3.10+, add kw_only=True @dataclass(frozen=True) class ReuseInfo: """Simple dataclass holding licensing and copyright information""" spdx_expressions: Set[Expression] = field(default_factory=set) copyright_lines: Set[str] = field(default_factory=set) contributor_lines: Set[str] = field(default_factory=set) path: Optional[str] = None source_path: Optional[str] = None source_type: Optional[SourceType] = None def _check_nonexistent(self, **kwargs: Any) -> None: nonexistent_attributes = set(kwargs) - set(self.__dict__) if nonexistent_attributes: raise KeyError( f"The following attributes do not exist in" f" {self.__class__}: {', '.join(nonexistent_attributes)}" ) def copy(self, **kwargs: Any) -> "ReuseInfo": """Return a copy of ReuseInfo, replacing the values of attributes with the values from *kwargs*. """ self._check_nonexistent(**kwargs) new_kwargs = {} for key, value in self.__dict__.items(): new_kwargs[key] = kwargs.get(key, value) return self.__class__(**new_kwargs) # type: ignore def union(self, value: "ReuseInfo") -> "ReuseInfo": """Return a new instance of ReuseInfo where all Set attributes are equal to the union of the set in *self* and the set in *value*. All non-Set attributes are set to their values in *self*. >>> one = ReuseInfo(copyright_lines={"Jane Doe"}, source_path="foo.py") >>> two = ReuseInfo(copyright_lines={"John Doe"}, source_path="bar.py") >>> result = one.union(two) >>> print(sorted(result.copyright_lines)) ['Jane Doe', 'John Doe'] >>> print(result.source_path) foo.py """ new_kwargs = {} for key, attr_val in self.__dict__.items(): if isinstance(attr_val, set) and (other_val := getattr(value, key)): new_kwargs[key] = attr_val.union(other_val) else: new_kwargs[key] = attr_val return self.__class__(**new_kwargs) # type: ignore 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_info(self) -> bool: """Any field except *path*, *source_path* and *source_type* is non-empty. """ keys = { key for key in self.__dict__ if key not in ("path", "source_path", "source_type") } return any(self.__dict__[key] for key in keys) def __bool__(self) -> bool: return any(self.__dict__.values()) def __or__(self, value: "ReuseInfo") -> "ReuseInfo": return self.union(value) class ReuseException(Exception): """Base exception.""" class IdentifierNotFound(ReuseException): """Could not find SPDX identifier for license file.""" reuse-tool-2.1.0/src/reuse/__main__.py000066400000000000000000000003761445545121300176260ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Entry module for reuse.""" import sys if __name__ == "__main__": from ._main import main sys.exit(main()) reuse-tool-2.1.0/src/reuse/_format.py000066400000000000000000000025161445545121300175330ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2018 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Formatting functions primarily for the CLI.""" from textwrap import fill, indent from typing import Iterator WIDTH = 78 INDENT = 2 def fill_paragraph(text: str, width: int = WIDTH, indent_width: int = 0) -> str: """Wrap a single paragraph.""" return indent( fill(text.strip(), width=width - indent_width), indent_width * " " ) def fill_all(text: str, width: int = WIDTH, indent_width: int = 0) -> str: """Wrap all paragraphs.""" return "\n\n".join( fill_paragraph(paragraph, width=width, indent_width=indent_width) for paragraph in split_into_paragraphs(text) ) def split_into_paragraphs(text: str) -> Iterator[str]: """Yield all paragraphs in a text. A paragraph is a piece of text surrounded by empty lines. """ lines = text.splitlines() paragraph = "" for line in lines: if not line: if paragraph: yield paragraph paragraph = "" else: continue else: if paragraph: padding = " " else: padding = "" paragraph = f"{paragraph}{padding}{line}" if paragraph: yield paragraph reuse-tool-2.1.0/src/reuse/_licenses.py000066400000000000000000000041611445545121300200460ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2014 Ahmed H. Ismail # SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: GPL-3.0-or-later # # load_license_list was copied and altered from its original location # at . """A list with all SPDX licenses.""" import json import os from typing import Dict, List, Tuple _BASE_DIR = os.path.dirname(__file__) _RESOURCES_DIR = os.path.join(_BASE_DIR, "resources") _LICENSES = os.path.join(_RESOURCES_DIR, "licenses.json") _EXCEPTIONS = os.path.join(_RESOURCES_DIR, "exceptions.json") def _load_license_list(file_name: str) -> Tuple[List[int], Dict[str, Dict]]: """Return the licenses list version tuple and a mapping of licenses id->name loaded from a JSON file from https://github.com/spdx/license-list-data """ licenses_map = {} with open(file_name, "r", encoding="utf-8") as lics: licenses = json.load(lics) version = licenses["licenseListVersion"].split(".") for lic in licenses["licenses"]: identifier = lic["licenseId"] licenses_map[identifier] = lic return version, licenses_map def _load_exception_list(file_name: str) -> Tuple[List[int], Dict[str, Dict]]: """Return the exceptions list version tuple and a mapping of exceptions id->name loaded from a JSON file from https://github.com/spdx/license-list-data """ exceptions_map = {} with open(file_name, "r", encoding="utf-8") as excs: exceptions = json.load(excs) version = exceptions["licenseListVersion"].split(".") for exc in exceptions["exceptions"]: identifier = exc["licenseExceptionId"] exceptions_map[identifier] = exc return version, exceptions_map _, LICENSE_MAP = _load_license_list(_LICENSES) _, EXCEPTION_MAP = _load_exception_list(_EXCEPTIONS) ALL_MAP = {**LICENSE_MAP, **EXCEPTION_MAP} ALL_NON_DEPRECATED_MAP = { identifier: contents.copy() for identifier, contents in ALL_MAP.items() if not contents["isDeprecatedLicenseId"] } reuse-tool-2.1.0/src/reuse/_main.py000066400000000000000000000233761445545121300171760ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """Entry functions for reuse.""" import argparse import logging import sys import warnings from gettext import gettext as _ from typing import IO, Callable, List, Optional, Type, cast from . import ( __REUSE_version__, __version__, download, header, init, lint, spdx, supported_licenses, ) from ._format import INDENT, fill_all, fill_paragraph from ._util import PathType, setup_logging from .project import Project, create_project _LOGGER = logging.getLogger(__name__) _DESCRIPTION_LINES = [ _( "reuse is a tool for compliance with the REUSE" " recommendations. See for more" " information, and for the online" " documentation." ), _( "This version of reuse is compatible with version {} of the REUSE" " Specification." ).format(__REUSE_version__), _("Support the FSFE's work:"), ] _INDENTED_LINE = _( "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 ." ) _DESCRIPTION_TEXT = ( fill_all("\n\n".join(_DESCRIPTION_LINES)) + "\n\n" + fill_paragraph(_INDENTED_LINE, indent_width=INDENT) ) _EPILOG_TEXT = "" def parser() -> argparse.ArgumentParser: """Create the parser and return it.""" # pylint: disable=redefined-outer-name parser = argparse.ArgumentParser( formatter_class=argparse.RawTextHelpFormatter, description=_DESCRIPTION_TEXT, epilog=_EPILOG_TEXT, ) parser.add_argument( "--debug", action="store_true", help=_("enable debug statements") ) parser.add_argument( "--suppress-deprecation", action="store_true", help=_("hide deprecation warnings"), ) parser.add_argument( "--include-submodules", action="store_true", help=_("do not skip over Git submodules"), ) parser.add_argument( "--include-meson-subprojects", action="store_true", help=_("do not skip over Meson subprojects"), ) parser.add_argument( "--no-multiprocessing", action="store_true", help=_("do not use multiprocessing"), ) parser.add_argument( "--root", action="store", metavar="PATH", type=PathType("r", force_directory=True), help=_("define root of project"), ) parser.add_argument( "--version", action="store_true", help=_("show program's version number and exit"), ) parser.set_defaults(func=lambda *args: parser.print_help()) subparsers = parser.add_subparsers(title=_("subcommands")) add_command( subparsers, "annotate", header.add_arguments, header.run, help=_("add copyright and licensing into the header of files"), description=fill_all( _( "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 --explicit-license is" " specified, the header is placed in a .license file." ) ), ) add_command( subparsers, "addheader", header.add_arguments, header.run, help=_("deprecated in favor of annotate"), ) add_command( subparsers, "download", download.add_arguments, 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." ) ), ) add_command( subparsers, "init", init.add_arguments, init.run, help=_("initialize REUSE project"), ) add_command( subparsers, "lint", lint.add_arguments, lint.run, help=_("list all non-compliant files"), description=fill_all( _( "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?" ).format(reuse_version=__REUSE_version__) ), ) add_command( subparsers, "spdx", spdx.add_arguments, spdx.run, help=_("print the project's bill of materials in SPDX format"), ) add_command( subparsers, "supported-licenses", supported_licenses.add_arguments, supported_licenses.run, help=_("list all supported SPDX licenses"), aliases=["supported-licences"], ) return parser def add_command( # pylint: disable=too-many-arguments,redefined-builtin subparsers: argparse._SubParsersAction, name: str, add_arguments_func: Callable[[argparse.ArgumentParser], None], run_func: Callable[[argparse.Namespace, Project, IO[str]], int], formatter_class: Optional[Type[argparse.HelpFormatter]] = None, description: Optional[str] = None, help: Optional[str] = None, aliases: Optional[List[str]] = None, ) -> None: """Add a subparser for a command.""" if formatter_class is None: formatter_class = argparse.RawTextHelpFormatter subparser = subparsers.add_parser( name, formatter_class=formatter_class, description=description, help=help, aliases=aliases or [], ) add_arguments_func(subparser) subparser.set_defaults(func=run_func) subparser.set_defaults(parser=subparser) def main(args: Optional[List[str]] = None, out: IO[str] = sys.stdout) -> int: """Main entry function.""" if args is None: args = cast(List[str], sys.argv[1:]) main_parser = parser() parsed_args = main_parser.parse_args(args) setup_logging(level=logging.DEBUG if parsed_args.debug else logging.WARNING) # Show all warnings raised by ourselves. if not parsed_args.suppress_deprecation: warnings.filterwarnings("default", module="reuse") if parsed_args.version: out.write(f"reuse {__version__}\n") return 0 if parsed_args.root: project = Project(parsed_args.root) else: project = create_project() project.include_submodules = parsed_args.include_submodules project.include_meson_subprojects = parsed_args.include_meson_subprojects return parsed_args.func(parsed_args, project, out) if __name__ == "__main__": sys.exit(main()) reuse-tool-2.1.0/src/reuse/_util.py000066400000000000000000000444001445545121300172160ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2020 Tuomas Siipola # SPDX-FileCopyrightText: 2022 Nico Rikken # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # SPDX-FileCopyrightText: 2022 Pietro Albini # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Johannes Zarl-Zierl # # SPDX-License-Identifier: GPL-3.0-or-later """Misc. utilities for reuse.""" import logging import os import re import shutil import subprocess import sys from argparse import ArgumentTypeError from collections import Counter from difflib import SequenceMatcher from gettext import gettext as _ from hashlib import sha1 from itertools import chain from os import PathLike from pathlib import Path, PurePath from typing import IO, Any, BinaryIO, Dict, Iterator, List, Optional, Set, Union from boolean.boolean import Expression, ParseError from debian.copyright import Copyright from license_expression import ExpressionError, Licensing from . import ReuseInfo, SourceType from ._licenses import ALL_NON_DEPRECATED_MAP from .comment import _all_style_classes # TODO: When removing Python 3.8 support, use PathLike[str] StrPath = Union[str, PathLike] GIT_EXE = shutil.which("git") HG_EXE = shutil.which("hg") REUSE_IGNORE_START = "REUSE-IgnoreStart" REUSE_IGNORE_END = "REUSE-IgnoreEnd" SPDX_SNIPPET_INDICATOR = b"SPDX-SnippetBegin" _LOGGER = logging.getLogger(__name__) _LICENSING = Licensing() # REUSE-IgnoreStart _END_PATTERN = r"{}$".format( "".join( { r"(?:{})*".format(item) # pylint: disable=consider-using-f-string for item in chain( ( re.escape(style.MULTI_LINE.end) for style in _all_style_classes() if style.MULTI_LINE.end ), # These are special endings which do not belong to specific # comment styles, but which we want to nonetheless strip away # while parsing. ( ending for ending in [ # ex: r'"\s*/*>', r"'\s*/*>", # ex: [SPDX-License-Identifier: GPL-3.0-or-later] :: r"\]\s*::", ] ), ) } ) ) _LICENSE_IDENTIFIER_PATTERN = re.compile( r"^(.*?)SPDX-License-Identifier:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE ) _CONTRIBUTOR_PATTERN = re.compile( r"^(.*?)SPDX-FileContributor:[ \t]+(.*?)" + _END_PATTERN, re.MULTILINE ) # The keys match the relevant attributes of ReuseInfo. _SPDX_TAGS: Dict[str, re.Pattern] = { "spdx_expressions": _LICENSE_IDENTIFIER_PATTERN, "contributor_lines": _CONTRIBUTOR_PATTERN, } _COPYRIGHT_PATTERNS = [ re.compile( r"(?P(?PSPDX-(File|Snippet)CopyrightText:)\s+" r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" r"(?P.*?))" + _END_PATTERN ), re.compile( r"(?P(?PCopyright(\s?\([cC]\))?)\s+" r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" r"(?P.*?))" + _END_PATTERN ), re.compile( r"(?P(?P©)\s+" r"((?P\d{4} ?- ?\d{4}|\d{4}),?\s+)?" r"(?P.*?))" + _END_PATTERN ), ] _COPYRIGHT_STYLES = { "spdx": "SPDX-FileCopyrightText:", "spdx-c": "SPDX-FileCopyrightText: (C)", "spdx-symbol": "SPDX-FileCopyrightText: ©", "string": "Copyright", "string-c": "Copyright (C)", "string-symbol": "Copyright ©", "symbol": "©", } # Amount of bytes that we assume will be big enough to contain the entire # comment header (including SPDX tags), so that we don't need to read the # entire file. _HEADER_BYTES = 4096 def setup_logging(level: int = logging.WARNING) -> None: """Configure logging for reuse. You can only call this function once. """ # library_logger is the root logger for reuse. We configure logging solely # for reuse, not for any other libraries. library_logger = logging.getLogger("reuse") if not library_logger.hasHandlers(): library_logger.setLevel(level) handler = logging.StreamHandler() formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) library_logger.addHandler(handler) def execute_command( command: List[str], logger: logging.Logger, cwd: Optional[StrPath] = None, **kwargs: Any, ) -> subprocess.CompletedProcess: """Run the given command with subprocess.run. Forward kwargs. Silence output into a pipe unless kwargs override it. """ logger.debug("running '%s'", " ".join(command)) stdout: Union[None, int, IO[Any]] = kwargs.get("stdout", subprocess.PIPE) stderr: Union[None, int, IO[Any]] = kwargs.get("stderr", subprocess.PIPE) return subprocess.run( list(map(str, command)), stdout=stdout, stderr=stderr, check=False, cwd=str(cwd), **kwargs, ) def find_licenses_directory(root: StrPath) -> Path: """Find the licenses directory from CWD or *root*. In the following order: - LICENSES/ in *root*. - Current directory if its name is "LICENSES" - LICENSES/ in CWD. The returned LICENSES/ directory NEED NOT EXIST. It may still need to be created. """ cwd = Path.cwd() licenses_path = cwd / "LICENSES" if root: licenses_path = Path(root) / "LICENSES" elif cwd.name == "LICENSES": licenses_path = cwd return licenses_path def decoded_text_from_binary( binary_file: BinaryIO, size: Optional[int] = None ) -> str: """Given a binary file object, detect its encoding and return its contents as a decoded string. Do not throw any errors if the encoding contains errors: Just replace the false characters. If *size* is specified, only read so many bytes. """ if size is None: size = -1 rawdata = binary_file.read(size) result = rawdata.decode("utf-8", errors="replace") return result.replace("\r\n", "\n") def _determine_license_path(path: StrPath) -> Path: """Given a path FILE, return FILE.license if it exists, otherwise return FILE. """ license_path = Path(f"{path}.license") if not license_path.exists(): license_path = Path(path) return license_path def _determine_license_suffix_path(path: StrPath) -> Path: """Given a path FILE or FILE.license, return FILE.license.""" path = Path(path) if path.suffix == ".license": return path return Path(f"{path}.license") 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: """Parse copyright years and return list.""" if not year: ret = [] if re.match(r"\d{4}$", year): ret = [int(year)] if re.match(r"\d{4} ?- ?\d{4}$", year): ret = [int(year[:4]), int(year[-4:])] return ret def _contains_snippet(binary_file: BinaryIO) -> bool: """Check if a file seems to contain a SPDX snippet""" # Assumes that if SPDX_SNIPPET_INDICATOR (SPDX-SnippetBegin) is found in a # file, the file contains a snippet content = binary_file.read() if SPDX_SNIPPET_INDICATOR in content: return True return False def merge_copyright_lines(copyright_lines: Set[str]) -> Set[str]: """Parse all copyright lines and merge identical statements making years into a range. If a same statement uses multiple prefixes, use only the most frequent one. """ # pylint: disable=too-many-locals # TODO: Rewrite this function. It's a bit of a mess. copyright_in = [] for line in copyright_lines: for pattern in _COPYRIGHT_PATTERNS: match = pattern.search(line) if match is not None: copyright_in.append( { "statement": match.groupdict()["statement"], "year": _parse_copyright_year( match.groupdict()["year"] ), "prefix": match.groupdict()["prefix"], } ) copyright_out = set() for line_info in copyright_in: statement = str(line_info["statement"]) copyright_list = [ item for item in copyright_in if item["statement"] == statement ] # Get the style of the most common prefix prefix = 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 break # get year range if any years: List[str] = [] for copy in copyright_list: years += copy["year"] year: Optional[str] = None if min(years) == max(years): year = min(years) else: year = f"{min(years)} - {max(years)}" copyright_out.add(make_copyright_line(statement, year, style)) return copyright_out def extract_reuse_info(text: str) -> ReuseInfo: """Extract REUSE information from comments in a string. :raises ExpressionError: if an SPDX expression could not be parsed :raises ParseError: if an SPDX expression could not be parsed """ text = filter_ignore_block(text) spdx_tags: Dict[str, Set[str]] = {} for tag, pattern in _SPDX_TAGS.items(): spdx_tags[tag] = set(find_spdx_tag(text, pattern)) # License expressions and copyright matches are special cases. expressions = set() copyright_matches = set() for expression in spdx_tags.pop("spdx_expressions"): try: expressions.add(_LICENSING.parse(expression)) except (ExpressionError, ParseError): _LOGGER.error( _("Could not parse '{expression}'").format( expression=expression ) ) raise for line in text.splitlines(): for pattern in _COPYRIGHT_PATTERNS: match = pattern.search(line) if match is not None: copyright_matches.add(match.groupdict()["copyright"].strip()) break return ReuseInfo( spdx_expressions=expressions, copyright_lines=copyright_matches, **spdx_tags, # type: ignore ) 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. """ for prefix, value in pattern.findall(text): prefix, value = prefix.strip(), value.strip() # Some comment headers have ASCII art to "frame" the comment, like this: # # /***********************\ # |* This is a comment *| # \***********************/ # # To ensure we parse them correctly, if the line ends with the inverse # of the comment prefix, we strip that suffix. See #343 for a real # world example of a project doing this (LLVM). suffix = prefix[::-1] if suffix and value.endswith(suffix): value = value[: -len(suffix)] yield value.strip() def filter_ignore_block(text: str) -> str: """Filter out blocks beginning with REUSE_IGNORE_START and ending with REUSE_IGNORE_END to remove lines that should not be treated as copyright and licensing information. """ ignore_start = None ignore_end = None if REUSE_IGNORE_START in text: ignore_start = text.index(REUSE_IGNORE_START) if REUSE_IGNORE_END in text: ignore_end = text.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) if not ignore_start: return text if not ignore_end: return text[:ignore_start] if ignore_end > ignore_start: return text[:ignore_start] + filter_ignore_block(text[ignore_end:]) rest = text[ignore_start + len(REUSE_IGNORE_START) :] if REUSE_IGNORE_END in rest: ignore_end = rest.index(REUSE_IGNORE_END) + len(REUSE_IGNORE_END) return text[:ignore_start] + filter_ignore_block(rest[ignore_end:]) return text[:ignore_start] def contains_reuse_info(text: str) -> bool: """The text contains REUSE info.""" try: return bool(extract_reuse_info(text)) except (ExpressionError, ParseError): return False def make_copyright_line( statement: str, year: Optional[str] = None, copyright_style: str = "spdx" ) -> str: """Given a statement, prefix it with ``SPDX-FileCopyrightText:`` if it is not already prefixed with some manner of copyright tag. """ if "\n" in statement: raise RuntimeError(f"Unexpected newline in '{statement}'") copyright_prefix = _COPYRIGHT_STYLES.get(copyright_style) if copyright_prefix is None: raise RuntimeError( "Unexpected copyright style: Need 'spdx', 'spdx-c', " "'spdx-symbol', 'string', 'string-c', " "'string-symbol', or 'symbol'" ) for pattern in _COPYRIGHT_PATTERNS: match = pattern.search(statement) if match is not None: return statement if year is not None: return f"{copyright_prefix} {year} {statement}" return f"{copyright_prefix} {statement}" def _checksum(path: StrPath) -> str: path = Path(path) file_sha1 = sha1() with path.open("rb") as fp: for chunk in iter(lambda: fp.read(128 * file_sha1.block_size), b""): file_sha1.update(chunk) return file_sha1.hexdigest() class PathType: """Factory for creating Paths""" def __init__( self, mode: str = "r", force_file: bool = False, force_directory: bool = False, ): if mode in ("r", "r+", "w"): self._mode = mode else: raise ValueError(f"mode='{mode}' is not valid") self._force_file = force_file self._force_directory = force_directory if self._force_file and self._force_directory: raise ValueError( "'force_file' and 'force_directory' cannot both be True" ) def _check_read(self, path: Path) -> None: if path.exists() and os.access(path, os.R_OK): if self._force_file and not path.is_file(): raise ArgumentTypeError(_("'{}' is not a file").format(path)) if self._force_directory and not path.is_dir(): raise ArgumentTypeError( _("'{}' is not a directory").format(path) ) return raise ArgumentTypeError(_("can't open '{}'").format(path)) def _check_write(self, path: Path) -> None: if path.is_dir(): raise ArgumentTypeError( _("can't write to directory '{}'").format(path) ) if path.exists() and os.access(path, os.W_OK): return if not path.exists() and os.access(path.parent, os.W_OK): return raise ArgumentTypeError(_("can't write to '{}'").format(path)) def __call__(self, string: str) -> Path: path = Path(string) try: if self._mode in ("r", "r+"): self._check_read(path) if self._mode in ("w", "r+"): self._check_write(path) return path except OSError as error: raise ArgumentTypeError( _("can't read or write '{}'").format(path) ) from error def spdx_identifier(text: str) -> Expression: """argparse factory for creating SPDX expressions.""" try: return _LICENSING.parse(text) except (ExpressionError, ParseError) as error: raise ArgumentTypeError( _("'{}' is not a valid SPDX expression, aborting").format(text) ) from error def similar_spdx_identifiers(identifier: str) -> List[str]: """Given an incorrect SPDX identifier, return a list of similar ones.""" suggestions: List[str] = [] if identifier in ALL_NON_DEPRECATED_MAP: return suggestions for valid_identifier in ALL_NON_DEPRECATED_MAP: distance = SequenceMatcher( a=identifier.lower(), b=valid_identifier[: len(identifier)].lower() ).ratio() if distance > 0.75: suggestions.append(valid_identifier) suggestions = sorted(suggestions) return suggestions def print_incorrect_spdx_identifier( identifier: str, out: IO[str] = sys.stdout ) -> None: """Print out that *identifier* is not valid, and follow up with some suggestions. """ out.write( _("'{}' is not a valid SPDX License Identifier.").format(identifier) ) out.write("\n") suggestions = similar_spdx_identifiers(identifier) if suggestions: out.write("\n") out.write(_("Did you mean:")) out.write("\n") for suggestion in suggestions: out.write(f"* {suggestion}\n") out.write("\n") out.write( _( "See for a list of valid " "SPDX License Identifiers." ) ) def detect_line_endings(text: str) -> str: """Return one of '\n', '\r' or '\r\n' depending on the line endings used in *text*. Return os.linesep if there are no line endings. """ line_endings = ["\r\n", "\r", "\n"] for line_ending in line_endings: if line_ending in text: return line_ending return os.linesep # REUSE-IgnoreEnd reuse-tool-2.1.0/src/reuse/comment.py000066400000000000000000000572231445545121300175530ustar00rootroot00000000000000# 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: 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: 2023 Kevin Meagher # SPDX-FileCopyrightText: 2023 Mathias Dannesbo # # SPDX-License-Identifier: GPL-3.0-or-later """Module for parsing and creating comments. Just enough to deal with comment headers, in any case. """ import logging import operator from textwrap import dedent from typing import List, NamedTuple, Type _LOGGER = logging.getLogger(__name__) class CommentParseError(Exception): """An error occurred during the parsing of a comment.""" class CommentCreateError(Exception): """An error occurred during the creation of a comment.""" class MultiLineSegments(NamedTuple): """Components that make up a multi-line comment style, e.g. '/*', '*', and '*/'. """ start: str middle: str end: str class CommentStyle: """Base class for comment style.""" SHORTHAND = "" SINGLE_LINE = "" INDENT_AFTER_SINGLE = "" # (start, middle, end) # e.g., ("/*", "*", "*/") MULTI_LINE = MultiLineSegments("", "", "") INDENT_BEFORE_MIDDLE = "" INDENT_AFTER_MIDDLE = "" INDENT_BEFORE_END = "" SHEBANGS: List[str] = [] @classmethod def can_handle_single(cls) -> bool: """Whether the :class:`CommentStyle` can handle single-line comments.""" return bool(cls.SINGLE_LINE) @classmethod def can_handle_multi(cls) -> bool: """Whether the :class:`CommentStyle` can handle multi-line comments.""" return all((cls.MULTI_LINE.start, cls.MULTI_LINE.end)) @classmethod def create_comment(cls, text: str, force_multi: bool = False) -> str: """Comment all lines in *text*. Single-line comments are preferred over multi-line comments, unless *force_multi* is provided. :raises CommentCreateError: if *text* could not be commented. """ if force_multi or not cls.can_handle_single(): return cls._create_comment_multi(text) return cls._create_comment_single(text) @classmethod def _create_comment_single(cls, text: str) -> str: """Comment all lines in *text*, using single-line comments. :raises CommentCreateError: if *text* could not be commented. """ if not cls.can_handle_single(): raise CommentCreateError( f"{cls} cannot create single-line comments" ) result = [] for line in text.split("\n"): line_result = cls.SINGLE_LINE if line: line_result += cls.INDENT_AFTER_SINGLE + line result.append(line_result) return "\n".join(result) @classmethod def _create_comment_multi(cls, text: str) -> str: """Comment all lines in *text*, using multi-line comments. :raises CommentCreateError: if *text* could not be commented. """ if not cls.can_handle_multi(): raise CommentCreateError(f"{cls} cannot create multi-line comments") result = [] result.append(cls.MULTI_LINE.start) for line in text.split("\n"): if cls.MULTI_LINE.end in text: raise CommentCreateError( f"'{line}' contains a premature comment delimiter" ) line_result = "" if cls.MULTI_LINE.middle: line_result += cls.INDENT_BEFORE_MIDDLE + cls.MULTI_LINE.middle if line: line_result += cls.INDENT_AFTER_MIDDLE + line result.append(line_result) result.append(cls.INDENT_BEFORE_END + cls.MULTI_LINE.end) return "\n".join(result) @classmethod def parse_comment(cls, text: str) -> str: """Uncomment all lines in *text*. :raises CommentParseError: if *text* could not be parsed. """ try: return cls._parse_comment_single(text) except CommentParseError: return cls._parse_comment_multi(text) @classmethod def _parse_comment_single(cls, text: str) -> str: """Uncomment all lines in *text*, assuming they are commented by single-line comments. :raises CommentParseError: if *text* could not be parsed. """ if not cls.can_handle_single(): raise CommentParseError(f"{cls} cannot parse single-line comments") result_lines = [] for line in text.splitlines(): if not line.startswith(cls.SINGLE_LINE): raise CommentParseError( f"'{line}' does not start with a comment marker" ) line = line.lstrip(cls.SINGLE_LINE) result_lines.append(line) result = "\n".join(result_lines) return dedent(result) @classmethod def _remove_middle_marker(cls, line: str) -> str: if cls.MULTI_LINE.middle: possible_line = line.lstrip() prefix = cls.MULTI_LINE.middle if possible_line.startswith(prefix): line = possible_line.lstrip(prefix) # Note to future self: line.removeprefix would be preferable # here. if line.startswith(cls.INDENT_AFTER_MIDDLE): line = line.replace(cls.INDENT_AFTER_MIDDLE, "", 1) else: _LOGGER.debug( "'%s' does not contain a middle comment marker", line ) return line @classmethod def _parse_comment_multi(cls, text: str) -> str: """Uncomment all lines in *text*, assuming they are commented by multi-line comments. :raises CommentParseError: if *text* could not be parsed. """ if not cls.can_handle_multi(): raise CommentParseError(f"{cls} cannot parse multi-line comments") result_lines = [] try: first, *lines, last = text.splitlines() last_is_first = False except ValueError: first = text lines = [] last = "" # Set this later. last_is_first = True if not first.startswith(cls.MULTI_LINE.start): raise CommentParseError( f"'{first}' does not start with a comment marker" ) first = first.lstrip(cls.MULTI_LINE.start) first = first.lstrip() for line in lines: line = cls._remove_middle_marker(line) result_lines.append(line) if last_is_first: last = first first = "" if not last.endswith(cls.MULTI_LINE.end): raise CommentParseError( f"'{last}' does not end with a comment delimiter" ) last = last.rstrip(cls.MULTI_LINE.end) last = last.rstrip() last = cls._remove_middle_marker(last) result = "\n".join(result_lines) result = dedent(result) return "\n".join(item for item in (first, result, last) if item) @classmethod def comment_at_first_character(cls, text: str) -> str: """Return the comment block that starts at the first character of *text*. This is chiefly handy to get the header comment of a file, assuming that the header comment starts at the first character in the file. :raises CommentParseError: if *text* does not start with a parseable comment block. """ if not any((cls.can_handle_single(), cls.can_handle_multi())): raise CommentParseError(f"{cls} cannot parse comments") lines = text.splitlines() if cls.can_handle_single() and text.startswith(cls.SINGLE_LINE): end = 0 for i, line in enumerate(lines): if not line.startswith(cls.SINGLE_LINE): break end = i return "\n".join(lines[0 : end + 1]) if cls.can_handle_multi() and text.startswith(cls.MULTI_LINE.start): end = 0 for i, line in enumerate(lines): end = i if line.endswith(cls.MULTI_LINE.end): break else: raise CommentParseError("Comment block never delimits") return "\n".join(lines[0 : end + 1]) raise CommentParseError( "Could not find a parseable comment block at the first character" ) class AppleScriptCommentStyle(CommentStyle): """AppleScript comment style.""" SHORTHAND = "applescript" SINGLE_LINE = "--" INDENT_AFTER_SINGLE = " " MULTI_LINE = MultiLineSegments("(*", "", "*)") class AspxCommentStyle(CommentStyle): """ASPX comment style.""" SHORTHAND = "aspx" MULTI_LINE = MultiLineSegments("<%--", "", "--%>") class BatchFileCommentStyle(CommentStyle): """Windows batch file comment style.""" SHORTHAND = "bat" SINGLE_LINE = "REM" INDENT_AFTER_SINGLE = " " class BibTexCommentStyle(CommentStyle): """BibTex comment style.""" SHORTHAND = "bibtex" MULTI_LINE = MultiLineSegments("@Comment{", "", "}") class CCommentStyle(CommentStyle): """C comment style.""" SHORTHAND = "c" SINGLE_LINE = "//" INDENT_AFTER_SINGLE = " " MULTI_LINE = MultiLineSegments("/*", "*", "*/") INDENT_BEFORE_MIDDLE = " " INDENT_AFTER_MIDDLE = " " INDENT_BEFORE_END = " " SHEBANGS = [ "#!", # V-Lang " str: return text @classmethod def parse_comment(cls, text: str) -> str: return text @classmethod def comment_at_first_character(cls, text: str) -> str: return text class FortranCommentStyle(CommentStyle): """Fortran comment style.""" SHORTHAND = "f" SINGLE_LINE = "c" INDENT_AFTER_SINGLE = " " class FtlCommentStyle(CommentStyle): """FreeMarker Template Language comment style.""" SHORTHAND = "ftl" MULTI_LINE = MultiLineSegments("<#--", "", "-->") class HandlebarsCommentStyle(CommentStyle): """Handlebars comment style.""" SHORTHAND = "handlebars" MULTI_LINE = MultiLineSegments("{{!--", "", "--}}") class HaskellCommentStyle(CommentStyle): """Haskell comment style.""" SHORTHAND = "haskell" SINGLE_LINE = "--" INDENT_AFTER_SINGLE = " " class HtmlCommentStyle(CommentStyle): """HTML comment style.""" SHORTHAND = "html" MULTI_LINE = MultiLineSegments("") SHEBANGS = [" List[Type[CommentStyle]]: """Return a list of all defined style classes, excluding the base class.""" result = [] for key, value in globals().items(): if key.endswith("CommentStyle") and key != "CommentStyle": result.append(value) return sorted(result, key=operator.attrgetter("__name__")) _result = _all_style_classes() _result.remove(EmptyCommentStyle) _result.remove(UncommentableCommentStyle) #: A map of human-friendly names against style classes. NAME_STYLE_MAP = {style.SHORTHAND: style for style in _result} reuse-tool-2.1.0/src/reuse/download.py000066400000000000000000000122301445545121300177050ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2023 Nico Rikken # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for downloading license files from spdx/license-data-list.""" import errno import logging import sys import urllib.request from argparse import ArgumentParser, Namespace from gettext import gettext as _ from pathlib import Path from typing import IO from urllib.error import URLError from urllib.parse import urljoin from ._licenses import ALL_NON_DEPRECATED_MAP from ._util import ( PathType, StrPath, find_licenses_directory, print_incorrect_spdx_identifier, ) from .project import Project from .report import ProjectReport _LOGGER = logging.getLogger(__name__) # All raw text files are available as files underneath this path. _SPDX_REPOSITORY_BASE_URL = ( "https://raw.githubusercontent.com/spdx/license-list-data/master/text/" ) def download_license(spdx_identifier: str) -> str: """Download the license text from the SPDX repository. :param spdx_identifier: SPDX identifier of the license. :raises URLError: if the license could not be downloaded. :return: The license text. """ # This is fairly naive, but I can't see anything wrong with it. url = urljoin(_SPDX_REPOSITORY_BASE_URL, "".join((spdx_identifier, ".txt"))) _LOGGER.debug("downloading license from '%s'", url) # TODO: Cache result? with urllib.request.urlopen(url) as response: if response.getcode() == 200: return response.read().decode("utf-8") raise URLError("Status code was not 200") def _path_to_license_file(spdx_identifier: str, root: StrPath) -> Path: licenses_path = find_licenses_directory(root=root) return licenses_path / "".join((spdx_identifier, ".txt")) def put_license_in_file(spdx_identifier: str, destination: StrPath) -> None: """Download a license and put it in the destination file. This function exists solely for convenience. :param spdx_identifier: SPDX License Identifier of the license. :param destination: Where to put the license. :raises URLError: if the license could not be downloaded. :raises FileExistsError: if the license file already exists. """ header = "" destination = Path(destination) destination.parent.mkdir(exist_ok=True) if destination.exists(): raise FileExistsError(errno.EEXIST, "File exists", str(destination)) text = download_license(spdx_identifier) with destination.open("w", encoding="utf-8") as fp: fp.write(header) fp.write(text) def add_arguments(parser: ArgumentParser) -> None: """Add arguments to parser.""" parser.add_argument( "license", action="store", nargs="*", help=_("SPDX License Identifier of license"), ) parser.add_argument( "--all", action="store_true", help=_("download all missing licenses detected in the project"), ) parser.add_argument( "--output", "-o", dest="file", action="store", type=PathType("w") ) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """Download license and place it in the LICENSES/ directory.""" def _already_exists(path: StrPath) -> None: out.write( _("Error: {spdx_identifier} already exists.").format( spdx_identifier=path ) ) out.write("\n") def _could_not_download(identifier: str) -> None: out.write(_("Error: Failed to download license.")) out.write(" ") if identifier not in ALL_NON_DEPRECATED_MAP: print_incorrect_spdx_identifier(identifier, out=out) else: out.write(_("Is your internet connection working?")) out.write("\n") def _successfully_downloaded(destination: StrPath) -> None: out.write( _("Successfully downloaded {spdx_identifier}.").format( spdx_identifier=destination ) ) out.write("\n") if args.all: # TODO: This is fairly inefficient, but gets the job done. report = ProjectReport.generate(project) licenses = report.missing_licenses if args.file: _LOGGER.warning( _("--output has no effect when used together with --all") ) args.file = None elif not args.license: 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) try: put_license_in_file(lic, destination=destination) except URLError: _could_not_download(lic) return_code = 1 except FileExistsError as err: _already_exists(err.filename) return_code = 1 else: _successfully_downloaded(destination) return return_code reuse-tool-2.1.0/src/reuse/header.py000066400000000000000000000623521445545121300173400ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2019 Stefan Bakker # SPDX-FileCopyrightText: 2019 Kirill Elagin # SPDX-FileCopyrightText: 2020 Dmitry Bogatov # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2021 Alvar Penning # SPDX-FileCopyrightText: 2021 Alliander N.V. # SPDX-FileCopyrightText: 2021 Robin Vobruba # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Yaman Qalieh # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for manipulating the comment headers of files.""" import argparse import datetime import logging import os import re import sys from argparse import ArgumentParser, Namespace from gettext import gettext as _ from pathlib import Path from typing import ( IO, Iterable, NamedTuple, Optional, Sequence, Set, Tuple, Type, cast, ) from binaryornot.check import is_binary from boolean.boolean import ParseError from jinja2 import Environment, FileSystemLoader, PackageLoader, Template from jinja2.exceptions import TemplateNotFound from license_expression import ExpressionError from . import ReuseInfo from ._util import ( _COPYRIGHT_STYLES, PathType, StrPath, _determine_license_path, _determine_license_suffix_path, contains_reuse_info, detect_line_endings, extract_reuse_info, make_copyright_line, merge_copyright_lines, spdx_identifier, ) from .comment import ( EXTENSION_COMMENT_STYLE_MAP_LOWERCASE, FILENAME_COMMENT_STYLE_MAP_LOWERCASE, NAME_STYLE_MAP, CommentCreateError, CommentParseError, CommentStyle, EmptyCommentStyle, PythonCommentStyle, UncommentableCommentStyle, ) from .project import Project _LOGGER = logging.getLogger(__name__) _ENV = Environment(loader=PackageLoader("reuse", "templates"), trim_blocks=True) DEFAULT_TEMPLATE = _ENV.get_template("default_template.jinja2") _NEWLINE_PATTERN = re.compile(r"\n", re.MULTILINE) class _TextSections(NamedTuple): """Used to split up text in three parts.""" before: str middle: str after: str class MissingReuseInfo(Exception): """Some REUSE information is missing from the result.""" # TODO: Add a template here maybe. def _create_new_header( reuse_info: ReuseInfo, template: Optional[Template] = None, template_is_commented: bool = False, style: Optional[Type[CommentStyle]] = None, force_multi: bool = False, ) -> str: """Format a new header from scratch. :raises CommentCreateError: if a comment could not be created. :raises MissingReuseInfo: if the generated comment is missing SPDX information. """ if template is None: template = DEFAULT_TEMPLATE if style is None: style = cast(Type[CommentStyle], PythonCommentStyle) rendered = template.render( copyright_lines=sorted(reuse_info.copyright_lines), contributor_lines=sorted(reuse_info.contributor_lines), spdx_expressions=sorted(map(str, reuse_info.spdx_expressions)), ).strip("\n") if template_is_commented: result = rendered else: result = style.create_comment(rendered, force_multi=force_multi).strip( "\n" ) # Verify that the result contains all ReuseInfo. new_reuse_info = extract_reuse_info(result) if ( reuse_info.copyright_lines != new_reuse_info.copyright_lines and reuse_info.spdx_expressions != new_reuse_info.spdx_expressions ): _LOGGER.debug( _( "generated comment is missing copyright lines or license" " expressions" ) ) _LOGGER.debug(result) raise MissingReuseInfo() return result # pylint: disable=too-many-arguments def create_header( reuse_info: ReuseInfo, header: Optional[str] = None, template: Optional[Template] = None, template_is_commented: bool = False, style: Optional[Type[CommentStyle]] = None, force_multi: bool = False, merge_copyrights: bool = False, ) -> str: """Create a header containing *reuse_info*. *header* is an optional argument containing a header which should be modified to include *reuse_info*. If *header* is not given, a brand new header is created. *template*, *template_is_commented*, and *style* determine what the header will look like, and whether it will be commented or not. :raises CommentCreateError: if a comment could not be created. :raises MissingReuseInfo: if the generated comment is missing SPDX information. """ if template is None: template = DEFAULT_TEMPLATE if style is None: style = PythonCommentStyle new_header = "" if header: try: existing_spdx = extract_reuse_info(header) except (ExpressionError, ParseError) as err: raise CommentCreateError( "existing header contains an erroneous SPDX expression" ) from err if merge_copyrights: spdx_copyrights = merge_copyright_lines( reuse_info.copyright_lines.union(existing_spdx.copyright_lines), ) else: spdx_copyrights = reuse_info.copyright_lines.union( existing_spdx.copyright_lines ) # TODO: This behaviour does not match the docstring. reuse_info = existing_spdx | reuse_info reuse_info = reuse_info.copy(copyright_lines=spdx_copyrights) new_header += _create_new_header( reuse_info, template=template, template_is_commented=template_is_commented, style=style, force_multi=force_multi, ) return new_header def _indices_of_newlines(text: str) -> Sequence[int]: indices = [0] start = 0 while True: match = _NEWLINE_PATTERN.search(text, start) if match: start = match.span()[1] indices.append(start) else: break return indices def _find_first_spdx_comment( text: str, style: Optional[Type[CommentStyle]] = None ) -> _TextSections: """Find the first SPDX comment in the file. Return a tuple with everything preceding the comment, the comment itself, and everything following it. :raises MissingReuseInfo: if no REUSE info can be found in any comment """ if style is None: style = PythonCommentStyle indices = _indices_of_newlines(text) for index in indices: try: comment = style.comment_at_first_character(text[index:]) except CommentParseError: continue if contains_reuse_info(comment): return _TextSections( text[:index], comment + "\n", text[index + len(comment) + 1 :] ) raise MissingReuseInfo() def _extract_shebang(prefix: str, text: str) -> Tuple[str, str]: """Remove all lines that start with the shebang prefix from *text*. Return a tuple of (shebang, reduced_text). """ shebang_lines = [] for line in text.splitlines(): if line.startswith(prefix): shebang_lines.append(line) text = text.replace(line, "", 1) else: shebang = "\n".join(shebang_lines) break return (shebang, text) # pylint: disable=too-many-arguments def find_and_replace_header( text: str, reuse_info: ReuseInfo, template: Optional[Template] = None, template_is_commented: bool = False, style: Optional[Type[CommentStyle]] = None, force_multi: bool = False, merge_copyrights: bool = False, ) -> str: """Find the first SPDX comment block in *text*. That comment block is replaced by a new comment block containing *reuse_info*. It is formatted as according to *template*. The template is normally uncommented, but if it is already commented, *template_is_commented* should be :const:`True`. If both *style* and *template_is_commented* are provided, *style* is only used to find the header comment. If the comment block already contained some REUSE information, that information is merged into *reuse_info*. If no header exists, one is simply created. *text* is returned with a new header. :raises CommentCreateError: if a comment could not be created. :raises MissingReuseInfo: if the generated comment is missing SPDX information. """ if style is None: style = PythonCommentStyle try: before, header, after = _find_first_spdx_comment(text, style=style) except MissingReuseInfo: before, header, after = "", "", text # Workaround. EmptyCommentStyle should always be completely replaced. if style is EmptyCommentStyle: after = "" _LOGGER.debug(f"before = {repr(before)}") _LOGGER.debug(f"header = {repr(header)}") _LOGGER.debug(f"after = {repr(after)}") # Keep special first-line-of-file lines as the first line in the file, # or say, move our comments after it. if style.SHEBANGS: for shebang in style.SHEBANGS: # Extract shebang from header and put it in before. It's a bit # messy, but it ends up working. if header.startswith(shebang) and not before.strip(): before, header = _extract_shebang(shebang, header) elif after.startswith(shebang) and not any((before, header)): before, after = _extract_shebang(shebang, after) else: continue break header = create_header( reuse_info, header, template=template, template_is_commented=template_is_commented, style=style, force_multi=force_multi, merge_copyrights=merge_copyrights, ) new_text = f"{header}\n" if before.strip(): new_text = f"{before.rstrip()}\n\n{new_text}" if after.strip(): new_text = f"{new_text}\n{after.lstrip()}" return new_text # pylint: disable=too-many-arguments def add_new_header( text: str, reuse_info: ReuseInfo, template: Optional[Template] = None, template_is_commented: bool = False, style: Optional[Type[CommentStyle]] = None, force_multi: bool = False, merge_copyrights: bool = False, ) -> str: """Add a new header at the very top of *text*, similar to find_and_replace_header. But in this function, do not replace any headers or search for any existing REUSE information. :raises CommentCreateError: if a comment could not be created. """ if style is None: style = PythonCommentStyle shebang = "" if style.SHEBANGS: for shebang_prefix in style.SHEBANGS: if text.startswith(shebang_prefix): shebang, text = _extract_shebang(shebang_prefix, text) break header = create_header( reuse_info, None, template=template, template_is_commented=template_is_commented, style=style, force_multi=force_multi, merge_copyrights=merge_copyrights, ) new_text = f"{header}\n" if shebang.strip(): new_text = f"{shebang.rstrip()}\n\n{new_text}" if text.strip(): new_text = f"{new_text}\n{text.lstrip()}" return new_text def _get_comment_style(path: StrPath) -> Optional[Type[CommentStyle]]: """Return value of CommentStyle detected for *path* or None.""" path = Path(path) style = FILENAME_COMMENT_STYLE_MAP_LOWERCASE.get(path.name.lower()) if style is None: style = cast( Optional[Type[CommentStyle]], EXTENSION_COMMENT_STYLE_MAP_LOWERCASE.get(path.suffix.lower()), ) return style def _is_uncommentable(path: Path) -> bool: """Determines if *path* is uncommentable, e.g., the file is a binary or registered as an UncommentableCommentStyle. """ is_uncommentable = _get_comment_style(path) == UncommentableCommentStyle return is_uncommentable or is_binary(str(path)) def _verify_paths_line_handling( paths: Iterable[Path], parser: ArgumentParser, force_single: bool, force_multi: bool, ) -> None: """This function aborts the parser when *force_single* or *force_multi* is used, but the file type does not support that type of comment style. """ for path in paths: style = _get_comment_style(path) if style is None: continue if force_single and not style.can_handle_single(): parser.error( _( "'{path}' does not support single-line comments, please" " do not use --single-line" ).format(path=path) ) if force_multi and not style.can_handle_multi(): parser.error( _( "'{path}' does not support multi-line comments, please" " do not use --multi-line" ).format(path=path) ) def _verify_paths_comment_style( paths: Iterable[Path], parser: ArgumentParser ) -> None: unrecognised_files = [] for path in paths: style = _get_comment_style(path) not_uncommentable = not _is_uncommentable(path) # TODO: This check is duplicated. if style is None and not_uncommentable: unrecognised_files.append(path) if unrecognised_files: parser.error( "{}\n{}".format( _( "The following files do not have a recognised file" " extension. Please use --style, --force-dot-license or" " --skip-unrecognised:" ), "\n".join(str(path) for path in unrecognised_files), ) ) def _find_template(project: Project, name: str) -> Template: """Find a template given a name. :raises TemplateNotFound: if template could not be found. """ template_dir = project.root / ".reuse/templates" env = Environment( loader=FileSystemLoader(str(template_dir)), trim_blocks=True ) names = [name] if not name.endswith(".jinja2"): names.append(f"{name}.jinja2") if not name.endswith(".commented.jinja2"): names.append(f"{name}.commented.jinja2") for item in names: try: return env.get_template(item) except TemplateNotFound: pass raise TemplateNotFound(name) def _add_header_to_file( path: StrPath, reuse_info: ReuseInfo, template: Optional[Template], template_is_commented: bool, style: Optional[str], force_multi: bool = False, skip_existing: bool = False, merge_copyrights: bool = False, replace: bool = True, out: IO[str] = sys.stdout, ) -> int: """Helper function.""" # pylint: disable=too-many-arguments,too-many-locals result = 0 if style is not None: comment_style: Optional[Type[CommentStyle]] = NAME_STYLE_MAP.get(style) else: comment_style = _get_comment_style(path) if comment_style is None: out.write(_("Skipped unrecognised file {path}").format(path=path)) out.write("\n") return result with open(path, "r", encoding="utf-8", newline="") as fp: text = fp.read() # Ideally, this check is done elsewhere. But that would necessitate reading # the file contents before this function is called. if skip_existing and contains_reuse_info(text): out.write( _( "Skipped file '{path}' already containing REUSE information" ).format(path=path) ) out.write("\n") return result # Detect and remember line endings for later conversion. line_ending = detect_line_endings(text) # Normalise line endings. text = text.replace(line_ending, "\n") try: if replace: output = find_and_replace_header( text, reuse_info, template=template, template_is_commented=template_is_commented, style=comment_style, force_multi=force_multi, merge_copyrights=merge_copyrights, ) else: output = add_new_header( text, reuse_info, template=template, template_is_commented=template_is_commented, style=comment_style, force_multi=force_multi, merge_copyrights=merge_copyrights, ) except CommentCreateError: out.write( _("Error: Could not create comment for '{path}'").format(path=path) ) out.write("\n") result = 1 except MissingReuseInfo: out.write( _( "Error: Generated comment header for '{path}' is missing" " copyright lines or license expressions. The template is" " probably incorrect. Did not write new header." ).format(path=path) ) out.write("\n") result = 1 else: with open(path, "w", encoding="utf-8", newline=line_ending) as fp: fp.write(output) # TODO: This may need to be rephrased more elegantly. out.write(_("Successfully changed header of {path}").format(path=path)) out.write("\n") return result def _verify_write_access( paths: Iterable[StrPath], parser: ArgumentParser ) -> None: not_writeable = [ str(path) for path in paths if not os.access(path, os.W_OK) ] if not_writeable: parser.error( _("can't write to '{}'").format("', '".join(not_writeable)) ) def add_arguments(parser: ArgumentParser) -> None: """Add arguments to parser.""" parser.add_argument( "--copyright", "-c", action="append", type=str, help=_("copyright statement, repeatable"), ) parser.add_argument( "--license", "-l", action="append", type=spdx_identifier, help=_("SPDX Identifier, repeatable"), ) parser.add_argument( "--contributor", action="append", type=str, help=_("file contributor, repeatable"), ) parser.add_argument( "--year", "-y", action="append", type=str, help=_("year of copyright statement, optional"), ) parser.add_argument( "--style", "-s", action="store", type=str, choices=list(NAME_STYLE_MAP), help=_("comment style to use, optional"), ) parser.add_argument( "--copyright-style", action="store", choices=list(_COPYRIGHT_STYLES.keys()), help=_("copyright style to use, optional"), ) parser.add_argument( "--template", "-t", action="store", type=str, help=_("name of template to use, optional"), ) parser.add_argument( "--exclude-year", action="store_true", help=_("do not include year in statement"), ) parser.add_argument( "--merge-copyrights", action="store_true", help=_("merge copyright lines if copyright statements are identical"), ) parser.add_argument( "--single-line", action="store_true", help=_("force single-line comment style, optional"), ) parser.add_argument( "--multi-line", action="store_true", help=_("force multi-line comment style, optional"), ) parser.add_argument( "--explicit-license", action="store_true", help=argparse.SUPPRESS, ) parser.add_argument( "--force-dot-license", action="store_true", help=_("write a .license file instead of a header inside the file"), ) parser.add_argument( "--recursive", "-r", action="store_true", help=_( "add headers to all files under specified directories recursively" ), ) parser.add_argument( "--no-replace", action="store_true", help=_( "do not replace the first header in the file; just add a new one" ), ) parser.add_argument( "--skip-unrecognised", action="store_true", help=_("skip files with unrecognised comment styles"), ) parser.add_argument( "--skip-existing", action="store_true", help=_("skip files that already contain REUSE information"), ) parser.add_argument("path", action="store", nargs="+", type=PathType("r")) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """Add headers to files.""" # pylint: disable=too-many-branches,too-many-locals,too-many-statements if "addheader" in args.parser.prog.split(): _LOGGER.warning( _( "'reuse addheader' has been deprecated in favour of" " 'reuse annotate'" ) ) if not any((args.contributor, args.copyright, args.license)): args.parser.error( _("option --contributor, --copyright or --license is required") ) if args.exclude_year and args.year: args.parser.error( _("option --exclude-year and --year are mutually exclusive") ) if args.single_line and args.multi_line: args.parser.error( _("option --single-line and --multi-line are mutually exclusive") ) if args.style is not None and args.skip_unrecognised: _LOGGER.warning( _( "--skip-unrecognised has no effect when used together with" " --style" ) ) if args.explicit_license: _LOGGER.warning( _( "--explicit-license has been deprecated in favour of" " --force-dot-license" ) ) args.force_dot_license = True if args.recursive: paths: Set[Path] = set() all_files = [path.resolve() for path in project.all_files()] for path in args.path: if path.is_file(): paths.add(path) else: paths |= { child for child in all_files if path.resolve() in child.parents } else: paths = args.path paths = {_determine_license_path(path) for path in paths} if not args.force_dot_license: _verify_write_access(paths, args.parser) # Verify line handling and comment styles before proceeding if args.style is None and not args.force_dot_license: _verify_paths_line_handling( paths, args.parser, force_single=args.single_line, force_multi=args.multi_line, ) if not args.skip_unrecognised: _verify_paths_comment_style(paths, args.parser) template: Optional[Template] = None commented = False if args.template: try: template = cast(Template, _find_template(project, args.template)) except TemplateNotFound: args.parser.error( _("template {template} could not be found").format( template=args.template ) ) # This code is never reached, but mypy is not aware that # parser.error quits the program. raise if ".commented" in Path(cast(str, template.name)).suffixes: commented = True year = None if not args.exclude_year: if args.year and len(args.year) > 1: year = f"{min(args.year)} - {max(args.year)}" elif args.year: year = args.year.pop() else: year = str(datetime.date.today().year) 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_lines = ( { make_copyright_line( item, year=year, copyright_style=copyright_style ) for item in args.copyright } if args.copyright is not None else set() ) contributors = ( set(args.contributor) if args.contributor is not None else set() ) reuse_info = ReuseInfo( spdx_expressions=expressions, copyright_lines=copyright_lines, contributor_lines=contributors, ) result = 0 for path in paths: uncommentable = _is_uncommentable(path) if uncommentable or args.force_dot_license: new_path = _determine_license_suffix_path(path) if uncommentable: _LOGGER.info( _( "'{path}' is a binary, therefore using '{new_path}'" " for the header" ).format(path=path, new_path=new_path) ) path = Path(new_path) path.touch() result += _add_header_to_file( path=path, reuse_info=reuse_info, template=template, template_is_commented=commented, style=args.style, force_multi=args.multi_line, skip_existing=args.skip_existing, merge_copyrights=args.merge_copyrights, replace=not args.no_replace, out=out, ) return min(result, 1) reuse-tool-2.1.0/src/reuse/init.py000066400000000000000000000100741445545121300170450ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """Functions for REUSE-ifying a project.""" 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 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." ) 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: 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(_("Downloading {}").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") 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 reuse-tool-2.1.0/src/reuse/lint.py000066400000000000000000000203511445545121300170470ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """All linting happens here. The linting here is nothing more than reading the reports and printing some conclusions. """ import json import sys from argparse import ArgumentParser, Namespace from gettext import gettext as _ from io import StringIO from pathlib import Path from typing import IO, Any from . import __REUSE_version__ from .project import Project from .report import ProjectReport def add_arguments(parser: ArgumentParser) -> None: """Add arguments to parser.""" mutex_group = parser.add_mutually_exclusive_group() mutex_group.add_argument( "-q", "--quiet", action="store_true", help=_("prevents output") ) mutex_group.add_argument( "-j", "--json", action="store_true", help=_("formats output as JSON") ) mutex_group.add_argument( "-p", "--plain", action="store_true", help=_("formats output as plain text"), ) # pylint: disable=too-many-branches, too-many-statements def format_plain(report: ProjectReport) -> str: """Formats data dictionary as plaintext string to be printed to sys.stdout :param report: ProjectReport data :return: String (in plaintext) that can be output to sys.stdout """ output = StringIO() if not report.is_compliant: # Bad licenses if report.bad_licenses: output.write("# " + _("BAD LICENSES") + "\n\n") for lic, files in sorted(report.bad_licenses.items()): output.write(_("'{}' found in:").format(lic) + "\n") for file in sorted(files): output.write(f"* {file}\n") output.write("\n\n") # Deprecated licenses if report.deprecated_licenses: output.write("# " + _("DEPRECATED LICENSES") + "\n\n") output.write( _("The following licenses are deprecated by SPDX:") + "\n" ) for lic in sorted(report.deprecated_licenses): output.write(f"* {lic}\n") output.write("\n\n") # Licenses without extension if report.licenses_without_extension: output.write("# " + _("LICENSES WITHOUT FILE EXTENSION") + "\n\n") output.write( _("The following licenses have no file extension:") + "\n" ) for lic in sorted(report.licenses_without_extension): output.write(f"* {lic}\n") output.write("\n\n") # Missing licenses if report.missing_licenses: output.write("# " + _("MISSING LICENSES") + "\n\n") for lic, files in sorted(report.missing_licenses.items()): output.write(_("'{}' found in:").format(lic) + "\n") for file in sorted(files): output.write(f"* {file}\n") output.write("\n\n") # Unused licenses if report.unused_licenses: output.write("# " + _("UNUSED LICENSES") + "\n\n") output.write(_("The following licenses are not used:") + "\n") for lic in sorted(report.unused_licenses): output.write(f"* {lic}\n") output.write("\n\n") # Read errors if report.read_errors: output.write("# " + _("READ ERRORS") + "\n\n") output.write(_("Could not read:") + "\n") for path in sorted(report.read_errors): output.write(f"* {path}\n") output.write("\n\n") # Missing copyright and licensing information files_without_both = report.files_without_copyright.intersection( report.files_without_licenses ) files_without_copyright_excl = ( report.files_without_copyright - files_without_both ) files_without_licenses_excl = ( report.files_without_licenses - files_without_both ) files_without_either = files_without_copyright_excl.union( files_without_licenses_excl ) if files_without_either: header = ( "# " + _("MISSING COPYRIGHT AND LICENSING INFORMATION") + "\n\n" ) output.write(header) if files_without_both: output.write( _( "The following files have no copyright and licensing " "information:" ) ) output.write("\n") for file in sorted(files_without_both): output.write(f"* {file}\n") output.write("\n") if files_without_copyright_excl: output.write( _("The following files have no copyright information:") ) output.write("\n") for file in sorted(files_without_copyright_excl): output.write(f"* {file}\n") output.write("\n") if files_without_licenses_excl: output.write( _("The following files have no licensing information:") ) output.write("\n") for file in sorted(files_without_licenses_excl): output.write(f"* {file}\n") output.write("\n") output.write("\n") output.write("# " + _("SUMMARY")) output.write("\n\n") total_files = len(report.file_reports) summary_contents = { _("Bad licenses:"): ", ".join(report.bad_licenses), _("Deprecated licenses:"): ", ".join(report.deprecated_licenses), _("Licenses without file extension:"): ", ".join( report.licenses_without_extension ), _("Missing licenses:"): ", ".join(report.missing_licenses), _("Unused licenses:"): ", ".join(report.unused_licenses), _("Used licenses:"): ", ".join(report.used_licenses), _("Read errors:"): str(len(report.read_errors)), _( "files with copyright information:" ): f"{total_files - len(report.files_without_copyright)}" f" / {total_files}", _( "files with license information:" ): f"{total_files - len(report.files_without_licenses)}" f" / {total_files}", } # Replace empty values with 0. summary_contents = { key: value if value else "0" for key, value in summary_contents.items() } for key, value in summary_contents.items(): output.write(f"* {key} {value}\n") output.write("\n") if report.is_compliant: output.write( _( "Congratulations! Your project is compliant with version" " {} of the REUSE Specification :-)" ).format(__REUSE_version__) ) else: output.write( _( "Unfortunately, your project is not compliant with version " "{} of the REUSE Specification :-(" ).format(__REUSE_version__) ) output.write("\n") return output.getvalue() def format_json(report: ProjectReport) -> str: """Formats data dictionary as JSON string ready to be printed to sys.stdout :param report: Dictionary containing formatted ProjectReport data :return: String (representing JSON) that can be output to sys.stdout """ def custom_serializer(obj: Any) -> Any: """Custom serializer for the dictionary output of ProjectReport :param obj: Object to be serialized """ if isinstance(obj, Path): return str(obj) if isinstance(obj, set): return list(obj) raise TypeError( f"Object of type {obj.__class__.__name__} is not JSON serializable" ) return json.dumps( report.to_dict_lint(), indent=2, # Serialize sets to lists default=custom_serializer, ) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """List all non-compliant files.""" report = ProjectReport.generate( project, do_checksum=False, multiprocessing=not args.no_multiprocessing ) if args.quiet: pass elif args.json: out.write(format_json(report)) else: out.write(format_plain(report)) return 0 if report.is_compliant else 1 reuse-tool-2.1.0/src/reuse/project.py000066400000000000000000000360251445545121300175540ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2023 DB Systel GmbH # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """Module that contains the central Project class.""" import contextlib import glob import logging import os import warnings from gettext import gettext as _ from pathlib import Path from typing import Dict, Iterator, List, Optional, Union, cast from boolean.boolean import ParseError from debian.copyright import Copyright from debian.copyright import Error as DebianError from license_expression import ExpressionError from . import ( _IGNORE_DIR_PATTERNS, _IGNORE_FILE_PATTERNS, _IGNORE_MESON_PARENT_DIR_PATTERNS, IdentifierNotFound, ReuseInfo, SourceType, ) from ._licenses import EXCEPTION_MAP, LICENSE_MAP from ._util import ( _HEADER_BYTES, GIT_EXE, HG_EXE, StrPath, _contains_snippet, _copyright_from_dep5, _determine_license_path, decoded_text_from_binary, extract_reuse_info, ) from .vcs import ( VCSStrategy, VCSStrategyGit, VCSStrategyHg, VCSStrategyNone, find_root, ) _LOGGER = logging.getLogger(__name__) class Project: """Simple object that holds the project's root, which is necessary for many interactions. """ def __init__( self, root: StrPath, include_submodules: bool = False, include_meson_subprojects: bool = False, ): self._root = Path(root) if not self._root.is_dir(): raise NotADirectoryError(f"{self._root} is no valid path") if GIT_EXE and VCSStrategyGit.in_repo(self._root): self.vcs_strategy: VCSStrategy = VCSStrategyGit(self) elif HG_EXE and VCSStrategyHg.in_repo(self._root): self.vcs_strategy = VCSStrategyHg(self) else: _LOGGER.info( _( "project is not a VCS repository or required VCS software" " is not installed" ) ) self.vcs_strategy = VCSStrategyNone(self) self.licenses_without_extension: Dict[str, Path] = {} self.license_map = LICENSE_MAP.copy() # TODO: Is this correct? self.license_map.update(EXCEPTION_MAP) self.licenses = self._licenses() # Use '0' as None, because None is a valid value... self._copyright_val: Optional[Union[int, Copyright]] = 0 self.include_submodules = include_submodules meson_build_path = self._root / "meson.build" uses_meson = meson_build_path.is_file() self.include_meson_subprojects = ( include_meson_subprojects and uses_meson ) def all_files(self, directory: Optional[StrPath] = None) -> Iterator[Path]: """Yield all files in *directory* and its subdirectories. The files that are not yielded are: - Files ignored by VCS (e.g., see .gitignore) - Files/directories matching IGNORE_*_PATTERNS. """ if directory is None: directory = self.root directory = Path(directory) for root_str, dirs, files in os.walk(directory): root = Path(root_str) _LOGGER.debug("currently walking in '%s'", root) # Don't walk ignored directories for dir_ in list(dirs): the_dir = root / dir_ if self._is_path_ignored(the_dir): _LOGGER.debug("ignoring '%s'", the_dir) dirs.remove(dir_) elif the_dir.is_symlink(): _LOGGER.debug("skipping symlink '%s'", the_dir) dirs.remove(dir_) elif ( the_dir / ".git" ).is_file() and not self.include_submodules: _LOGGER.info( "ignoring '%s' because it is a submodule", the_dir ) dirs.remove(dir_) # Filter files. for file_ in files: the_file = root / file_ if self._is_path_ignored(the_file): _LOGGER.debug("ignoring '%s'", the_file) continue if the_file.is_symlink(): _LOGGER.debug("skipping symlink '%s'", the_file) continue # Suppressing this error because I simply don't want to deal # with that here. with contextlib.suppress(OSError): if the_file.stat().st_size == 0: _LOGGER.debug("skipping 0-sized file '%s'", the_file) continue _LOGGER.debug("yielding '%s'", the_file) yield the_file 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. 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. """ original_path = path path = _determine_license_path(path) _LOGGER.debug(f"searching '{path}' for REUSE information") # This means that only one 'source' of licensing/copyright information # is captured in ReuseInfo dep5_result = ReuseInfo() file_result = ReuseInfo() result = [] # Search the .reuse/dep5 file for REUSE information. if self._copyright: dep5_result = _copyright_from_dep5( self.relative_from_root(path), self._copyright ) if dep5_result.contains_copyright_or_licensing(): _LOGGER.info( _("'{path}' covered by .reuse/dep5").format(path=path) ) # Search the file for REUSE information. with path.open("rb") as fp: try: # Completely read the file once to search for possible snippets if _contains_snippet(fp): _LOGGER.debug(f"'{path}' seems to contain a SPDX Snippet") read_limit = None else: read_limit = _HEADER_BYTES # Reset read position fp.seek(0) # Scan the file for REUSE info, possible limiting the read # length file_result = extract_reuse_info( decoded_text_from_binary(fp, size=read_limit) ) if file_result.contains_copyright_or_licensing(): if path.suffix == ".license": source_type = SourceType.DOT_LICENSE else: source_type = SourceType.FILE_HEADER 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, ) 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 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. """ path = Path(path) try: return path.relative_to(self.root) except ValueError: return Path(os.path.relpath(path, start=self.root)) def _is_path_ignored(self, path: Path) -> bool: """Is *path* ignored by some mechanism?""" name = path.name parent_parts = path.parent.parts parent_dir = parent_parts[-1] if len(parent_parts) > 0 else "" if path.is_file(): for pattern in _IGNORE_FILE_PATTERNS: if pattern.match(name): return True elif path.is_dir(): for pattern in _IGNORE_DIR_PATTERNS: if pattern.match(name): return True if not self.include_meson_subprojects: for pattern in _IGNORE_MESON_PARENT_DIR_PATTERNS: if pattern.match(parent_dir): return True if self.vcs_strategy.is_ignored(path): return True return False def _identifier_of_license(self, path: Path) -> str: """Figure out the SPDX License identifier of a license given its path. The name of the path (minus its extension) should be a valid SPDX License Identifier. """ if not path.suffix: raise IdentifierNotFound(f"{path} has no file extension") if path.stem in self.license_map: return path.stem if path.stem.startswith("LicenseRef-"): return path.stem raise IdentifierNotFound( f"Could not find SPDX License Identifier for {path}" ) @property def root(self) -> Path: """Path to the root of the project.""" return self._root @property def _copyright(self) -> Optional[Copyright]: if self._copyright_val == 0: copyright_path = self.root / ".reuse/dep5" try: with copyright_path.open(encoding="utf-8") as fp: self._copyright_val = Copyright(fp) except OSError: _LOGGER.debug("no .reuse/dep5 file, or could not read it") except DebianError: _LOGGER.exception(_(".reuse/dep5 has syntax errors")) except UnicodeError: _LOGGER.exception(_(".reuse/dep5 could not be parsed as utf-8")) # This check is a bit redundant, but otherwise I'd have to repeat # this line under each exception. if not self._copyright_val: self._copyright_val = None return cast(Optional[Copyright], self._copyright_val) def _licenses(self) -> Dict[str, Path]: """Return a dictionary of all licenses in the project, with their SPDX identifiers as names and paths as values. """ license_files: Dict[str, Path] = {} directory = str(self.root / "LICENSES/**") for path_str in glob.iglob(directory, recursive=True): path = Path(path_str) # For some reason, LICENSES/** is resolved even though it # doesn't exist. I have no idea why. Deal with that here. if not Path(path).exists() or Path(path).is_dir(): continue if Path(path).suffix == ".license": continue path = self.relative_from_root(path) _LOGGER.debug( _("determining identifier of '{path}'").format(path=path) ) try: identifier = self._identifier_of_license(path) except IdentifierNotFound: if path.name in self.license_map: _LOGGER.info( _("{path} does not have a file extension").format( path=path ) ) identifier = path.name self.licenses_without_extension[identifier] = path else: identifier = path.stem _LOGGER.warning( _( "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." ).format(path=path, identifier=identifier) ) if identifier in license_files: _LOGGER.critical( _( "{identifier} is the SPDX License Identifier of both" " {path} and {other_path}" ).format( identifier=identifier, path=path, other_path=license_files[identifier], ) ) raise RuntimeError(f"Multiple licenses resolve to {identifier}") # Add the identifiers license_files[identifier] = path if ( identifier.startswith("LicenseRef-") and "Unknown" not in identifier ): self.license_map[identifier] = { "reference": str(path), "isDeprecatedLicenseId": False, "detailsUrl": None, "referenceNumber": None, "name": identifier, "licenseId": identifier, "seeAlso": [], "isOsiApproved": None, } return license_files def create_project() -> Project: """Create a project object. Try to find the project root from CWD, otherwise treat CWD as root. """ root = find_root() if root is None: root = Path.cwd() return Project(root) reuse-tool-2.1.0/src/reuse/py.typed000066400000000000000000000001721445545121300172250ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later reuse-tool-2.1.0/src/reuse/report.py000066400000000000000000000451671445545121300174300ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Pietro Albini # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """Module that contains reports about files and projects for linting.""" import datetime import logging import multiprocessing as mp import random from gettext import gettext as _ from hashlib import md5 from io import StringIO from os import cpu_count from pathlib import Path, PurePath from typing import Any, Dict, Iterable, List, NamedTuple, Optional, Set, cast from uuid import uuid4 from . import __REUSE_version__, __version__ from ._util import _LICENSING, StrPath, _checksum from .project import Project, ReuseInfo _LOGGER = logging.getLogger(__name__) LINT_VERSION = "1.0" class _MultiprocessingContainer: """Container that remembers some data in order to generate a FileReport.""" def __init__( self, project: Project, do_checksum: bool, add_license_concluded: bool ): self.project = project self.do_checksum = do_checksum self.add_license_concluded = add_license_concluded def __call__(self, file_: StrPath) -> "_MultiprocessingResult": # pylint: disable=broad-except try: return _MultiprocessingResult( file_, FileReport.generate( self.project, file_, do_checksum=self.do_checksum, add_license_concluded=self.add_license_concluded, ), None, ) except Exception as exc: return _MultiprocessingResult(file_, None, exc) class _MultiprocessingResult(NamedTuple): """Result of :class:`MultiprocessingContainer`.""" path: StrPath report: Optional["FileReport"] error: Optional[Exception] class ProjectReport: # pylint: disable=too-many-instance-attributes """Object that holds linting report about the project.""" def __init__(self, do_checksum: bool = True): self.path: StrPath = "" self.licenses: Dict[str, Path] = {} self.missing_licenses: Dict[str, Set[Path]] = {} self.bad_licenses: Dict[str, Set[Path]] = {} self.deprecated_licenses: Set[str] = set() self.read_errors: Set[Path] = set() self.file_reports: Set[FileReport] = set() self.licenses_without_extension: Dict[str, Path] = {} self.do_checksum = do_checksum self._unused_licenses: Optional[Set[str]] = None self._used_licenses: Optional[Set[str]] = None self._files_without_licenses: Optional[Set[Path]] = None self._files_without_copyright: Optional[Set[Path]] = None self._is_compliant: Optional[bool] = None def to_dict_lint(self) -> Dict[str, Any]: """Collects and formats data relevant to linting from report and returns it as a dictionary. :return: Dictionary containing data from the ProjectReport object """ # Setup report data container data: Dict[str, Any] = { "non_compliant": { "missing_licenses": self.missing_licenses, "unused_licenses": [str(file) for file in self.unused_licenses], "deprecated_licenses": [ str(file) for file in self.deprecated_licenses ], "bad_licenses": self.bad_licenses, "licenses_without_extension": self.licenses_without_extension, "missing_copyright_info": [ str(file) for file in self.files_without_copyright ], "missing_licensing_info": [ str(file) for file in self.files_without_licenses ], "read_errors": [str(file) for file in self.read_errors], }, "files": [], "summary": { "used_licenses": [], }, } # Populate 'files' for file_report in self.file_reports: data["files"].append(file_report.to_dict_lint()) # Populate 'summary' number_of_files = len(self.file_reports) data["summary"] = { "used_licenses": list(self.used_licenses), "files_total": number_of_files, "files_with_copyright_info": number_of_files - len(self.files_without_copyright), "files_with_licensing_info": number_of_files - len(self.files_without_licenses), "compliant": self.is_compliant, } # Add the top three keys unsorted_data = { "lint_version": LINT_VERSION, "reuse_spec_version": __REUSE_version__, "reuse_tool_version": __version__, **data, } # Sort dictionary keys while keeping the top three keys at the beginning sorted_keys = sorted(list(unsorted_data.keys())) sorted_keys.remove("lint_version") sorted_keys.remove("reuse_spec_version") sorted_keys.remove("reuse_tool_version") sorted_keys = [ "lint_version", "reuse_spec_version", "reuse_tool_version", ] + sorted_keys sorted_data = {key: unsorted_data[key] for key in sorted_keys} return sorted_data def bill_of_materials( self, creator_person: Optional[str] = None, creator_organization: Optional[str] = None, ) -> str: """Generate a bill of materials from the project. See https://spdx.org/specifications. """ out = StringIO() # Write mandatory tags out.write("SPDXVersion: SPDX-2.1\n") out.write("DataLicense: CC0-1.0\n") out.write("SPDXID: SPDXRef-DOCUMENT\n") out.write(f"DocumentName: {Path(self.path).resolve().name}\n") # TODO: Generate UUID from git revision maybe # TODO: Fix the URL out.write( f"DocumentNamespace: http://spdx.org/spdxdocs/spdx-v2.1-{uuid4()}\n" ) # Author out.write(f"Creator: Person: {format_creator(creator_person)}\n") out.write( f"Creator: Organization: {format_creator(creator_organization)}\n" ) out.write(f"Creator: Tool: reuse-{__version__}\n") now = datetime.datetime.utcnow() now = now.replace(microsecond=0) out.write(f"Created: {now.isoformat()}Z\n") out.write( "CreatorComment: This document was created automatically" " using available reuse information consistent with" " REUSE.\n" ) reports = sorted(self.file_reports, key=lambda x: x.name) for report in reports: out.write( "Relationship: SPDXRef-DOCUMENT describes" f" {report.spdx_id}\n" ) for report in reports: out.write("\n") out.write(f"FileName: {report.name}\n") out.write(f"SPDXID: {report.spdx_id}\n") out.write(f"FileChecksum: SHA1: {report.chk_sum}\n") out.write(f"LicenseConcluded: {report.license_concluded}\n") for lic in sorted(report.licenses_in_file): out.write(f"LicenseInfoInFile: {lic}\n") if report.copyright: out.write( "FileCopyrightText:" f" {report.copyright}\n" ) else: out.write("FileCopyrightText: NONE\n") # Licenses for lic, path in sorted(self.licenses.items()): if lic.startswith("LicenseRef-"): out.write("\n") out.write(f"LicenseID: {lic}\n") out.write("LicenseName: NOASSERTION\n") with (Path(self.path) / path).open(encoding="utf-8") as fp: out.write(f"ExtractedText: {fp.read()}\n") return out.getvalue() @classmethod def generate( cls, project: Project, do_checksum: bool = True, multiprocessing: bool = cpu_count() > 1, # type: ignore add_license_concluded: bool = False, ) -> "ProjectReport": """Generate a ProjectReport from a Project.""" project_report = cls(do_checksum=do_checksum) project_report.path = project.root project_report.licenses = project.licenses project_report.licenses_without_extension = ( project.licenses_without_extension ) container = _MultiprocessingContainer( project, do_checksum, add_license_concluded ) if multiprocessing: with mp.Pool() as pool: results: Iterable[_MultiprocessingResult] = pool.map( container, project.all_files() ) pool.join() else: results = map(container, project.all_files()) for result in results: if result.error: if isinstance(result.error, (OSError, UnicodeError)): _LOGGER.error( _("Could not read '{path}'").format(path=result.path), exc_info=result.error, ) project_report.read_errors.add(Path(result.path)) continue _LOGGER.error( _( "Unexpected error occurred while parsing '{path}'" ).format(path=result.path), exc_info=result.error, ) project_report.read_errors.add(Path(result.path)) continue file_report = cast(FileReport, result.report) # File report. project_report.file_reports.add(file_report) # Missing licenses. for missing_license in file_report.missing_licenses: project_report.missing_licenses.setdefault( missing_license, set() ).add(file_report.path) # Bad licenses for bad_license in file_report.bad_licenses: project_report.bad_licenses.setdefault(bad_license, set()).add( file_report.path ) # More bad licenses, and also deprecated licenses for name, path in project.licenses.items(): if name not in project.license_map: project_report.bad_licenses.setdefault(name, set()).add(path) elif project.license_map[name]["isDeprecatedLicenseId"]: project_report.deprecated_licenses.add(name) return project_report @property def used_licenses(self) -> Set[str]: """Set of license identifiers that are found in file reports.""" if self._used_licenses is not None: return self._used_licenses self._used_licenses = { lic for file_report in self.file_reports for lic in file_report.licenses_in_file } return self._used_licenses @property def unused_licenses(self) -> Set[str]: """Set of license identifiers that are not found in any file report.""" if self._unused_licenses is not None: return self._unused_licenses # First collect licenses that are suspected to be unused. suspected_unused_licenses = { lic for lic in self.licenses if lic not in self.used_licenses } # Remove false positives. self._unused_licenses = { lic for lic in suspected_unused_licenses if f"{lic}+" not in self.used_licenses } return self._unused_licenses @property def files_without_licenses(self) -> Set[Path]: """Set of paths that have no license information.""" if self._files_without_licenses is not None: return self._files_without_licenses self._files_without_licenses = { file_report.path for file_report in self.file_reports if not file_report.licenses_in_file } return self._files_without_licenses @property def files_without_copyright(self) -> Set[Path]: """Set of paths that have no copyright information.""" if self._files_without_copyright is not None: return self._files_without_copyright self._files_without_copyright = { file_report.path for file_report in self.file_reports if not file_report.copyright } return self._files_without_copyright @property def is_compliant(self) -> bool: """Whether the report is compliant with the REUSE Spec.""" if self._is_compliant is not None: return self._is_compliant self._is_compliant = not any( ( self.missing_licenses, self.unused_licenses, self.bad_licenses, self.deprecated_licenses, self.licenses_without_extension, self.files_without_copyright, self.files_without_licenses, self.read_errors, ) ) return self._is_compliant class FileReport: # pylint: disable=too-many-instance-attributes """Object that holds a linting report about a single file.""" def __init__(self, name: str, path: StrPath, do_checksum: bool = True): self.name = name self.path = Path(path) self.do_checksum = do_checksum self.reuse_infos: List[ReuseInfo] = [] self.spdx_id: Optional[str] = None self.chk_sum: Optional[str] = None self.licenses_in_file: List[str] = [] self.license_concluded: str = "" self.copyright: str = "" self.bad_licenses: Set[str] = set() self.missing_licenses: Set[str] = set() def to_dict_lint(self) -> Dict[str, Any]: """Turn the report into a json-like dictionary with exclusively information relevant for linting. """ return { # This gets rid of the './' prefix. In Python 3.9, use # str.removeprefix. "path": PurePath(self.name).as_posix(), "copyrights": [ { "value": line, "source": reuse_info.source_path, "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 ], "spdx_expressions": [ { "value": str(expression), "source": reuse_info.source_path, "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 ], } @classmethod def generate( cls, project: Project, path: StrPath, do_checksum: bool = True, add_license_concluded: bool = False, ) -> "FileReport": """Generate a FileReport from a path in a Project.""" path = Path(path) if not path.is_file(): raise OSError(f"{path} is not a file") relative = project.relative_from_root(path) report = cls(f"./{relative}", path, do_checksum=do_checksum) # Checksum and ID if report.do_checksum: report.chk_sum = _checksum(path) else: # This path avoids a lot of heavy computation, which is handy for # scenarios where you only need a unique hash, not a consistent # hash. report.chk_sum = f"{random.getrandbits(160):040x}" spdx_id = md5() spdx_id.update(report.name.encode("utf-8")) spdx_id.update(report.chk_sum.encode("utf-8")) report.spdx_id = f"SPDXRef-{spdx_id.hexdigest()}" reuse_infos = project.reuse_info_of(path) for reuse_info in reuse_infos: for expression in reuse_info.spdx_expressions: for identifier in _LICENSING.license_keys(expression): # A license expression akin to Apache-1.0+ should register # correctly if LICENSES/Apache-1.0.txt exists. identifiers = {identifier} if identifier.endswith("+"): identifiers.add(identifier[:-1]) # Bad license if not identifiers.intersection(project.license_map): report.bad_licenses.add(identifier) # Missing license if not identifiers.intersection(project.licenses): report.missing_licenses.add(identifier) # Add license to report. report.licenses_in_file.append(identifier) if not add_license_concluded: report.license_concluded = "NOASSERTION" elif not any(reuse_info.spdx_expressions for reuse_info in reuse_infos): report.license_concluded = "NONE" else: # Merge all the license expressions together, wrapping them in # parentheses to make sure an expression doesn't spill into another # one. The extra parentheses will be removed by the roundtrip # through parse() -> simplify() -> render(). report.license_concluded = ( _LICENSING.parse( " AND ".join( f"({expression})" for reuse_info in reuse_infos for expression in reuse_info.spdx_expressions ), ) .simplify() .render() ) # Copyright text report.copyright = "\n".join( sorted( line for reuse_info in reuse_infos for line in reuse_info.copyright_lines ) ) # Source of licensing and copyright info report.reuse_infos = reuse_infos return report def __hash__(self) -> int: if self.chk_sum is not None: return hash(self.name + self.chk_sum) return super().__hash__() def format_creator(creator: Optional[str]) -> str: """Render the creator field based on the provided flag""" if creator is None: return "Anonymous ()" if "(" in creator and creator.endswith(")"): # The creator field already contains an email address return creator return creator + " ()" reuse-tool-2.1.0/src/reuse/resources/000077500000000000000000000000001445545121300175405ustar00rootroot00000000000000reuse-tool-2.1.0/src/reuse/resources/exceptions.json000066400000000000000000000552061445545121300226240ustar00rootroot00000000000000{ "licenseListVersion": "3.21", "exceptions": [ { "reference": "./389-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./389-exception.html", "referenceNumber": 48, "name": "389 Directory Server Exception", "licenseExceptionId": "389-exception", "seeAlso": [ "http://directory.fedoraproject.org/wiki/GPL_Exception_License_Text", "https://web.archive.org/web/20080828121337/http://directory.fedoraproject.org/wiki/GPL_Exception_License_Text" ] }, { "reference": "./Asterisk-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Asterisk-exception.html", "referenceNumber": 33, "name": "Asterisk exception", "licenseExceptionId": "Asterisk-exception", "seeAlso": [ "https://github.com/asterisk/libpri/blob/7f91151e6bd10957c746c031c1f4a030e8146e9a/pri.c#L22", "https://github.com/asterisk/libss7/blob/03e81bcd0d28ff25d4c77c78351ddadc82ff5c3f/ss7.c#L24" ] }, { "reference": "./Autoconf-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-2.0.html", "referenceNumber": 42, "name": "Autoconf exception 2.0", "licenseExceptionId": "Autoconf-exception-2.0", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html", "http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.gz" ] }, { "reference": "./Autoconf-exception-3.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-3.0.html", "referenceNumber": 41, "name": "Autoconf exception 3.0", "licenseExceptionId": "Autoconf-exception-3.0", "seeAlso": [ "http://www.gnu.org/licenses/autoconf-exception-3.0.html" ] }, { "reference": "./Autoconf-exception-generic.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-generic.html", "referenceNumber": 4, "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" ] }, { "reference": "./Autoconf-exception-macro.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Autoconf-exception-macro.html", "referenceNumber": 19, "name": "Autoconf macro exception", "licenseExceptionId": "Autoconf-exception-macro", "seeAlso": [ "https://github.com/freedesktop/xorg-macros/blob/39f07f7db58ebbf3dcb64a2bf9098ed5cf3d1223/xorg-macros.m4.in", "https://www.gnu.org/software/autoconf-archive/ax_pthread.html", "https://launchpad.net/ubuntu/precise/+source/xmltooling/+copyright" ] }, { "reference": "./Bison-exception-2.2.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bison-exception-2.2.html", "referenceNumber": 11, "name": "Bison exception 2.2", "licenseExceptionId": "Bison-exception-2.2", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ] }, { "reference": "./Bootloader-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Bootloader-exception.html", "referenceNumber": 50, "name": "Bootloader Distribution Exception", "licenseExceptionId": "Bootloader-exception", "seeAlso": [ "https://github.com/pyinstaller/pyinstaller/blob/develop/COPYING.txt" ] }, { "reference": "./Classpath-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Classpath-exception-2.0.html", "referenceNumber": 36, "name": "Classpath exception 2.0", "licenseExceptionId": "Classpath-exception-2.0", "seeAlso": [ "http://www.gnu.org/software/classpath/license.html", "https://fedoraproject.org/wiki/Licensing/GPL_Classpath_Exception" ] }, { "reference": "./CLISP-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./CLISP-exception-2.0.html", "referenceNumber": 9, "name": "CLISP exception 2.0", "licenseExceptionId": "CLISP-exception-2.0", "seeAlso": [ "http://sourceforge.net/p/clisp/clisp/ci/default/tree/COPYRIGHT" ] }, { "reference": "./cryptsetup-OpenSSL-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./cryptsetup-OpenSSL-exception.html", "referenceNumber": 39, "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" ] }, { "reference": "./DigiRule-FOSS-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./DigiRule-FOSS-exception.html", "referenceNumber": 20, "name": "DigiRule FOSS License Exception", "licenseExceptionId": "DigiRule-FOSS-exception", "seeAlso": [ "http://www.digirulesolutions.com/drupal/foss" ] }, { "reference": "./eCos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./eCos-exception-2.0.html", "referenceNumber": 38, "name": "eCos exception 2.0", "licenseExceptionId": "eCos-exception-2.0", "seeAlso": [ "http://ecos.sourceware.org/license-overview.html" ] }, { "reference": "./Fawkes-Runtime-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Fawkes-Runtime-exception.html", "referenceNumber": 8, "name": "Fawkes Runtime Exception", "licenseExceptionId": "Fawkes-Runtime-exception", "seeAlso": [ "http://www.fawkesrobotics.org/about/license/" ] }, { "reference": "./FLTK-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./FLTK-exception.html", "referenceNumber": 18, "name": "FLTK exception", "licenseExceptionId": "FLTK-exception", "seeAlso": [ "http://www.fltk.org/COPYING.php" ] }, { "reference": "./Font-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Font-exception-2.0.html", "referenceNumber": 7, "name": "Font exception 2.0", "licenseExceptionId": "Font-exception-2.0", "seeAlso": [ "http://www.gnu.org/licenses/gpl-faq.html#FontException" ] }, { "reference": "./freertos-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./freertos-exception-2.0.html", "referenceNumber": 47, "name": "FreeRTOS Exception 2.0", "licenseExceptionId": "freertos-exception-2.0", "seeAlso": [ "https://web.archive.org/web/20060809182744/http://www.freertos.org/a00114.html" ] }, { "reference": "./GCC-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-2.0.html", "referenceNumber": 54, "name": "GCC Runtime Library exception 2.0", "licenseExceptionId": "GCC-exception-2.0", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" ] }, { "reference": "./GCC-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GCC-exception-3.1.html", "referenceNumber": 27, "name": "GCC Runtime Library exception 3.1", "licenseExceptionId": "GCC-exception-3.1", "seeAlso": [ "http://www.gnu.org/licenses/gcc-exception-3.1.html" ] }, { "reference": "./GNAT-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GNAT-exception.html", "referenceNumber": 13, "name": "GNAT exception", "licenseExceptionId": "GNAT-exception", "seeAlso": [ "https://github.com/AdaCore/florist/blob/master/libsrc/posix-configurable_file_limits.adb" ] }, { "reference": "./gnu-javamail-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./gnu-javamail-exception.html", "referenceNumber": 34, "name": "GNU JavaMail exception", "licenseExceptionId": "gnu-javamail-exception", "seeAlso": [ "http://www.gnu.org/software/classpathx/javamail/javamail.html" ] }, { "reference": "./GPL-3.0-interface-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-interface-exception.html", "referenceNumber": 21, "name": "GPL-3.0 Interface Exception", "licenseExceptionId": "GPL-3.0-interface-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#LinkingOverControlledInterface" ] }, { "reference": "./GPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-exception.html", "referenceNumber": 1, "name": "GPL-3.0 Linking Exception", "licenseExceptionId": "GPL-3.0-linking-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs" ] }, { "reference": "./GPL-3.0-linking-source-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-3.0-linking-source-exception.html", "referenceNumber": 37, "name": "GPL-3.0 Linking Exception (with Corresponding Source)", "licenseExceptionId": "GPL-3.0-linking-source-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.en.html#GPLIncompatibleLibs", "https://github.com/mirror/wget/blob/master/src/http.c#L20" ] }, { "reference": "./GPL-CC-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GPL-CC-1.0.html", "referenceNumber": 52, "name": "GPL Cooperation Commitment 1.0", "licenseExceptionId": "GPL-CC-1.0", "seeAlso": [ "https://github.com/gplcc/gplcc/blob/master/Project/COMMITMENT", "https://gplcc.github.io/gplcc/Project/README-PROJECT.html" ] }, { "reference": "./GStreamer-exception-2005.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2005.html", "referenceNumber": 35, "name": "GStreamer Exception (2005)", "licenseExceptionId": "GStreamer-exception-2005", "seeAlso": [ "https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/licensing.html?gi-language\u003dc#licensing-of-applications-using-gstreamer" ] }, { "reference": "./GStreamer-exception-2008.json", "isDeprecatedLicenseId": false, "detailsUrl": "./GStreamer-exception-2008.html", "referenceNumber": 30, "name": "GStreamer Exception (2008)", "licenseExceptionId": "GStreamer-exception-2008", "seeAlso": [ "https://gstreamer.freedesktop.org/documentation/frequently-asked-questions/licensing.html?gi-language\u003dc#licensing-of-applications-using-gstreamer" ] }, { "reference": "./i2p-gpl-java-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./i2p-gpl-java-exception.html", "referenceNumber": 40, "name": "i2p GPL+Java Exception", "licenseExceptionId": "i2p-gpl-java-exception", "seeAlso": [ "http://geti2p.net/en/get-involved/develop/licenses#java_exception" ] }, { "reference": "./KiCad-libraries-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./KiCad-libraries-exception.html", "referenceNumber": 28, "name": "KiCad Libraries Exception", "licenseExceptionId": "KiCad-libraries-exception", "seeAlso": [ "https://www.kicad.org/libraries/license/" ] }, { "reference": "./LGPL-3.0-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LGPL-3.0-linking-exception.html", "referenceNumber": 2, "name": "LGPL-3.0 Linking Exception", "licenseExceptionId": "LGPL-3.0-linking-exception", "seeAlso": [ "https://raw.githubusercontent.com/go-xmlpath/xmlpath/v2/LICENSE", "https://github.com/goamz/goamz/blob/master/LICENSE", "https://github.com/juju/errors/blob/master/LICENSE" ] }, { "reference": "./libpri-OpenH323-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./libpri-OpenH323-exception.html", "referenceNumber": 32, "name": "libpri OpenH323 exception", "licenseExceptionId": "libpri-OpenH323-exception", "seeAlso": [ "https://github.com/asterisk/libpri/blob/1.6.0/README#L19-L22" ] }, { "reference": "./Libtool-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Libtool-exception.html", "referenceNumber": 17, "name": "Libtool Exception", "licenseExceptionId": "Libtool-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/libtool.git/tree/m4/libtool.m4" ] }, { "reference": "./Linux-syscall-note.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Linux-syscall-note.html", "referenceNumber": 49, "name": "Linux Syscall Note", "licenseExceptionId": "Linux-syscall-note", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/COPYING" ] }, { "reference": "./LLGPL.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLGPL.html", "referenceNumber": 3, "name": "LLGPL Preamble", "licenseExceptionId": "LLGPL", "seeAlso": [ "http://opensource.franz.com/preamble.html" ] }, { "reference": "./LLVM-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LLVM-exception.html", "referenceNumber": 14, "name": "LLVM Exception", "licenseExceptionId": "LLVM-exception", "seeAlso": [ "http://llvm.org/foundation/relicensing/LICENSE.txt" ] }, { "reference": "./LZMA-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./LZMA-exception.html", "referenceNumber": 55, "name": "LZMA exception", "licenseExceptionId": "LZMA-exception", "seeAlso": [ "http://nsis.sourceforge.net/Docs/AppendixI.html#I.6" ] }, { "reference": "./mif-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./mif-exception.html", "referenceNumber": 53, "name": "Macros and Inline Functions Exception", "licenseExceptionId": "mif-exception", "seeAlso": [ "http://www.scs.stanford.edu/histar/src/lib/cppsup/exception", "http://dev.bertos.org/doxygen/", "https://www.threadingbuildingblocks.org/licensing" ] }, { "reference": "./Nokia-Qt-exception-1.1.json", "isDeprecatedLicenseId": true, "detailsUrl": "./Nokia-Qt-exception-1.1.html", "referenceNumber": 31, "name": "Nokia Qt LGPL exception 1.1", "licenseExceptionId": "Nokia-Qt-exception-1.1", "seeAlso": [ "https://www.keepassx.org/dev/projects/keepassx/repository/revisions/b8dfb9cc4d5133e0f09cd7533d15a4f1c19a40f2/entry/LICENSE.NOKIA-LGPL-EXCEPTION" ] }, { "reference": "./OCaml-LGPL-linking-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCaml-LGPL-linking-exception.html", "referenceNumber": 29, "name": "OCaml LGPL Linking Exception", "licenseExceptionId": "OCaml-LGPL-linking-exception", "seeAlso": [ "https://caml.inria.fr/ocaml/license.en.html" ] }, { "reference": "./OCCT-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OCCT-exception-1.0.html", "referenceNumber": 15, "name": "Open CASCADE Exception 1.0", "licenseExceptionId": "OCCT-exception-1.0", "seeAlso": [ "http://www.opencascade.com/content/licensing" ] }, { "reference": "./OpenJDK-assembly-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./OpenJDK-assembly-exception-1.0.html", "referenceNumber": 24, "name": "OpenJDK Assembly exception 1.0", "licenseExceptionId": "OpenJDK-assembly-exception-1.0", "seeAlso": [ "http://openjdk.java.net/legal/assembly-exception.html" ] }, { "reference": "./openvpn-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./openvpn-openssl-exception.html", "referenceNumber": 43, "name": "OpenVPN OpenSSL Exception", "licenseExceptionId": "openvpn-openssl-exception", "seeAlso": [ "http://openvpn.net/index.php/license.html" ] }, { "reference": "./PS-or-PDF-font-exception-20170817.json", "isDeprecatedLicenseId": false, "detailsUrl": "./PS-or-PDF-font-exception-20170817.html", "referenceNumber": 45, "name": "PS/PDF font exception (2017-08-17)", "licenseExceptionId": "PS-or-PDF-font-exception-20170817", "seeAlso": [ "https://github.com/ArtifexSoftware/urw-base35-fonts/blob/65962e27febc3883a17e651cdb23e783668c996f/LICENSE" ] }, { "reference": "./QPL-1.0-INRIA-2004-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./QPL-1.0-INRIA-2004-exception.html", "referenceNumber": 44, "name": "INRIA QPL 1.0 2004 variant exception", "licenseExceptionId": "QPL-1.0-INRIA-2004-exception", "seeAlso": [ "https://git.frama-c.com/pub/frama-c/-/blob/master/licenses/Q_MODIFIED_LICENSE", "https://github.com/maranget/hevea/blob/master/LICENSE" ] }, { "reference": "./Qt-GPL-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-GPL-exception-1.0.html", "referenceNumber": 10, "name": "Qt GPL exception 1.0", "licenseExceptionId": "Qt-GPL-exception-1.0", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LICENSE.GPL3-EXCEPT" ] }, { "reference": "./Qt-LGPL-exception-1.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qt-LGPL-exception-1.1.html", "referenceNumber": 16, "name": "Qt LGPL exception 1.1", "licenseExceptionId": "Qt-LGPL-exception-1.1", "seeAlso": [ "http://code.qt.io/cgit/qt/qtbase.git/tree/LGPL_EXCEPTION.txt" ] }, { "reference": "./Qwt-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Qwt-exception-1.0.html", "referenceNumber": 51, "name": "Qwt exception 1.0", "licenseExceptionId": "Qwt-exception-1.0", "seeAlso": [ "http://qwt.sourceforge.net/qwtlicense.html" ] }, { "reference": "./SHL-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.0.html", "referenceNumber": 26, "name": "Solderpad Hardware License v2.0", "licenseExceptionId": "SHL-2.0", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.0/" ] }, { "reference": "./SHL-2.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SHL-2.1.html", "referenceNumber": 23, "name": "Solderpad Hardware License v2.1", "licenseExceptionId": "SHL-2.1", "seeAlso": [ "https://solderpad.org/licenses/SHL-2.1/" ] }, { "reference": "./SWI-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./SWI-exception.html", "referenceNumber": 22, "name": "SWI exception", "licenseExceptionId": "SWI-exception", "seeAlso": [ "https://github.com/SWI-Prolog/packages-clpqr/blob/bfa80b9270274f0800120d5b8e6fef42ac2dc6a5/clpqr/class.pl" ] }, { "reference": "./Swift-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Swift-exception.html", "referenceNumber": 46, "name": "Swift Exception", "licenseExceptionId": "Swift-exception", "seeAlso": [ "https://swift.org/LICENSE.txt", "https://github.com/apple/swift-package-manager/blob/7ab2275f447a5eb37497ed63a9340f8a6d1e488b/LICENSE.txt#L205" ] }, { "reference": "./u-boot-exception-2.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./u-boot-exception-2.0.html", "referenceNumber": 5, "name": "U-Boot exception 2.0", "licenseExceptionId": "u-boot-exception-2.0", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003dLicenses/Exceptions" ] }, { "reference": "./Universal-FOSS-exception-1.0.json", "isDeprecatedLicenseId": false, "detailsUrl": "./Universal-FOSS-exception-1.0.html", "referenceNumber": 12, "name": "Universal FOSS Exception, Version 1.0", "licenseExceptionId": "Universal-FOSS-exception-1.0", "seeAlso": [ "https://oss.oracle.com/licenses/universal-foss-exception/" ] }, { "reference": "./vsftpd-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./vsftpd-openssl-exception.html", "referenceNumber": 56, "name": "vsftpd OpenSSL exception", "licenseExceptionId": "vsftpd-openssl-exception", "seeAlso": [ "https://git.stg.centos.org/source-git/vsftpd/blob/f727873674d9c9cd7afcae6677aa782eb54c8362/f/LICENSE", "https://launchpad.net/debian/squeeze/+source/vsftpd/+copyright", "https://github.com/richardcochran/vsftpd/blob/master/COPYING" ] }, { "reference": "./WxWindows-exception-3.1.json", "isDeprecatedLicenseId": false, "detailsUrl": "./WxWindows-exception-3.1.html", "referenceNumber": 25, "name": "WxWindows Library Exception 3.1", "licenseExceptionId": "WxWindows-exception-3.1", "seeAlso": [ "http://www.opensource.org/licenses/WXwindows" ] }, { "reference": "./x11vnc-openssl-exception.json", "isDeprecatedLicenseId": false, "detailsUrl": "./x11vnc-openssl-exception.html", "referenceNumber": 6, "name": "x11vnc OpenSSL Exception", "licenseExceptionId": "x11vnc-openssl-exception", "seeAlso": [ "https://github.com/LibVNC/x11vnc/blob/master/src/8to24.c#L22" ] } ], "releaseDate": "2023-06-18" }reuse-tool-2.1.0/src/reuse/resources/exceptions.json.license000066400000000000000000000001441445545121300242340ustar00rootroot00000000000000# SPDX-FileCopyrightText: Linux Foundation and its Contributors # # SPDX-License-Identifier: CC0-1.0reuse-tool-2.1.0/src/reuse/resources/licenses.json000066400000000000000000007533271445545121300222610ustar00rootroot00000000000000{ "licenseListVersion": "3.21", "licenses": [ { "reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", "referenceNumber": 534, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": [ "http://landley.net/toybox/license.html", "https://opensource.org/licenses/0BSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", "referenceNumber": 152, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": [ "https://opensource.org/licenses/attribution" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", "referenceNumber": 225, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Abstyles" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AdaCore-doc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AdaCore-doc.json", "referenceNumber": 396, "name": "AdaCore Doc License", "licenseId": "AdaCore-doc", "seeAlso": [ "https://github.com/AdaCore/xmlada/blob/master/docs/index.rst", "https://github.com/AdaCore/gnatcoll-core/blob/master/docs/index.rst", "https://github.com/AdaCore/gnatcoll-db/blob/master/docs/index.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", "referenceNumber": 106, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobeLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", "referenceNumber": 92, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", "referenceNumber": 73, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", "referenceNumber": 463, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.1.txt", "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", "referenceNumber": 306, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-1.2.txt", "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", "referenceNumber": 154, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": [ "http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", "referenceNumber": 305, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": [ "http://opensource.linux-mirror.org/licenses/afl-2.1.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", "referenceNumber": 502, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": [ "http://www.rosenlaw.com/AFL3.0.htm", "https://opensource.org/licenses/afl-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", "referenceNumber": 111, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Afmparse" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", "referenceNumber": 256, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", "referenceNumber": 389, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "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": 35, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": [ "http://www.affero.org/oagpl.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", "referenceNumber": 232, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", "referenceNumber": 34, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 217, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", "referenceNumber": 63, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": [ "http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", "referenceNumber": 386, "name": "AMD\u0027s plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", "referenceNumber": 147, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_MIT_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", "referenceNumber": 90, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", "referenceNumber": 448, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", "referenceNumber": 201, "name": "ANTLR Software Rights Notice with license fallback", "licenseId": "ANTLR-PD-fallback", "seeAlso": [ "http://www.antlr2.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", "referenceNumber": 434, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": [ "http://www.apache.org/licenses/LICENSE-1.0" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", "referenceNumber": 524, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": [ "http://apache.org/licenses/LICENSE-1.1", "https://opensource.org/licenses/Apache-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", "referenceNumber": 264, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": [ "https://www.apache.org/licenses/LICENSE-2.0", "https://opensource.org/licenses/Apache-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", "referenceNumber": 184, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", "referenceNumber": 410, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": [ "https://opensource.org/licenses/APL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/App-s2p.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/App-s2p.json", "referenceNumber": 150, "name": "App::s2p License", "licenseId": "App-s2p", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/App-s2p" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", "referenceNumber": 177, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", "referenceNumber": 536, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": [ "http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", "referenceNumber": 479, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": [ "http://www.samurajdata.se/opensource/mirror/licenses/apsl.php" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", "referenceNumber": 183, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": [ "http://www.opensource.apple.com/license/apsl/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Arphic-1999.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", "referenceNumber": 78, "name": "Arphic Public License", "licenseId": "Arphic-1999", "seeAlso": [ "http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", "referenceNumber": 282, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", "referenceNumber": 210, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": [ "https://opensource.org/licenses/Artistic-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", "referenceNumber": 550, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": [ "http://dev.perl.org/licenses/artistic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", "referenceNumber": 148, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": [ "http://www.perlfoundation.org/artistic_license_2_0", "https://www.perlfoundation.org/artistic-license-20.html", "https://opensource.org/licenses/artistic-license-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 277, "name": "ASWF Digital Assets License version 1.0", "licenseId": "ASWF-Digital-Assets-1.0", "seeAlso": [ "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.0.txt" ], "isOsiApproved": false }, { "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": 266, "name": "ASWF Digital Assets License 1.1", "licenseId": "ASWF-Digital-Assets-1.1", "seeAlso": [ "https://github.com/AcademySoftwareFoundation/foundation/blob/main/digital_assets/aswf_digital_assets_license_v1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Baekmuk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", "referenceNumber": 76, "name": "Baekmuk License", "licenseId": "Baekmuk", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:Baekmuk?rd\u003dLicensing/Baekmuk" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", "referenceNumber": 4, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Bahyph" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", "referenceNumber": 401, "name": "Barr License", "licenseId": "Barr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Barr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", "referenceNumber": 487, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Beerware", "https://people.freebsd.org/~phk/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bitstream-Charter.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Charter.json", "referenceNumber": 175, "name": "Bitstream Charter Font License", "licenseId": "Bitstream-Charter", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Charter#License_Text", "https://raw.githubusercontent.com/blackhole89/notekit/master/data/fonts/Charter%20license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Bitstream-Vera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", "referenceNumber": 505, "name": "Bitstream Vera Font License", "licenseId": "Bitstream-Vera", "seeAlso": [ "https://web.archive.org/web/20080207013128/http://www.gnome.org/fonts/", "https://docubrain.com/sites/default/files/licenses/bitstream-vera.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", "referenceNumber": 500, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": [ "http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1\u003d1.1\u0026r2\u003d1.1.1.1\u0026diff_format\u003ds" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", "referenceNumber": 77, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": [ "http://directory.fsf.org/wiki/License:BitTorrentOSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", "referenceNumber": 444, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": [ "https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln\u003d4-9", "https://sqlite.org/src/artifact/df5091916dbb40e6" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", "referenceNumber": 428, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": [ "https://blueoakcouncil.org/license/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Boehm-GC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Boehm-GC.json", "referenceNumber": 314, "name": "Boehm-Demers-Weiser GC License", "licenseId": "Boehm-GC", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT#Another_Minimal_variant_(found_in_libatomic_ops)", "https://github.com/uim/libgcroots/blob/master/COPYING", "https://github.com/ivmai/libatomic_ops/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", "referenceNumber": 327, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Borceux" ], "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": 131, "name": "Brian Gladman 3-Clause License", "licenseId": "Brian-Gladman-3-Clause", "seeAlso": [ "https://github.com/SWI-Prolog/packages-clib/blob/master/sha1/brg_endian.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", "referenceNumber": 200, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": [ "https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision\u003d326823" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", "referenceNumber": 269, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-2-Clause" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", "referenceNumber": 22, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", "referenceNumber": 365, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": [ "http://www.netbsd.org/about/redistribution.html#default" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", "referenceNumber": 494, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": [ "https://opensource.org/licenses/BSDplusPatent" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", "referenceNumber": 552, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": [ "http://www.freebsd.org/copyright/freebsd-license.html", "https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh", "https://github.com/protegeproject/protege/blob/master/license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", "referenceNumber": 320, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": [ "https://opensource.org/licenses/BSD-3-Clause", "https://www.eclipse.org/org/documents/edl-v10.php" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", "referenceNumber": 195, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", "referenceNumber": 233, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": [ "http://labs.metacarta.com/license-explanation.html#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", "referenceNumber": 45, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/LBNLBSD" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", "referenceNumber": 202, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:BSD#Modification_Variant" ], "isOsiApproved": false }, { "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": 341, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": [ "https://gitlab.syncad.com/hive/dhive/-/blob/master/LICENSE", "https://github.com/greymass/swift-eosio/blob/master/LICENSE" ], "isOsiApproved": false }, { "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": 331, "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" ], "isOsiApproved": false }, { "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": 442, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": [ "https://java.net/projects/javaeetutorial/pages/BerkeleyLicense" ], "isOsiApproved": false }, { "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": 79, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": [ "https://jogamp.org/git/?p\u003dgluegen.git;a\u003dblob_plain;f\u003dLICENSE.txt" ], "isOsiApproved": false }, { "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": 483, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": [ "https://www.open-mpi.org/community/license.php", "http://www.netlib.org/lapack/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", "referenceNumber": 471, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": [ "http://directory.fsf.org/wiki/License:BSD_4Clause" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", "referenceNumber": 41, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": [ "https://metadata.ftp-master.debian.org/changelogs//main/a/arpwatch/arpwatch_2.1a15-7_copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", "referenceNumber": 160, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": [ "http://www.freebsd.org/copyright/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4.3RENO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3RENO.json", "referenceNumber": 130, "name": "BSD 4.3 RENO License", "licenseId": "BSD-4.3RENO", "seeAlso": [ "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dlibiberty/strcasecmp.c;h\u003d131d81c2ce7881fa48c363dc5bf5fb302c61ce0b;hb\u003dHEAD" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-4.3TAHOE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4.3TAHOE.json", "referenceNumber": 507, "name": "BSD 4.3 TAHOE License", "licenseId": "BSD-4.3TAHOE", "seeAlso": [ "https://github.com/389ds/389-ds-base/blob/main/ldap/include/sysexits-compat.h#L15", "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n1788" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Advertising-Acknowledgement.json", "referenceNumber": 367, "name": "BSD Advertising Acknowledgement License", "licenseId": "BSD-Advertising-Acknowledgement", "seeAlso": [ "https://github.com/python-excel/xlrd/blob/master/LICENSE#L33" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Attribution-HPND-disclaimer.json", "referenceNumber": 280, "name": "BSD with Attribution and HPND disclaimer", "licenseId": "BSD-Attribution-HPND-disclaimer", "seeAlso": [ "https://github.com/cyrusimap/cyrus-sasl/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", "referenceNumber": 126, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/BSD_Protection_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", "referenceNumber": 397, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": [ "https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", "referenceNumber": 467, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": [ "http://www.boost.org/LICENSE_1_0.txt", "https://opensource.org/licenses/BSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", "referenceNumber": 255, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": [ "https://mariadb.com/bsl11/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", "referenceNumber": 245, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": [ "https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", "referenceNumber": 392, "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" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", "referenceNumber": 191, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Computational-Use-of-Data-Agreement/blob/master/C-UDA-1.0.md", "https://cdla.dev/computational-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", "referenceNumber": 551, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "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": 316, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": [ "http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", "referenceNumber": 178, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": [ "http://www.lemis.com/grog/UNIX/ancient-source-all.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", "referenceNumber": 253, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": [ "https://opensource.org/licenses/CATOSL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", "referenceNumber": 205, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by/1.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", "referenceNumber": 61, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by/2.0/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", "referenceNumber": 171, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/legalcode" ], "isOsiApproved": false }, { "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": 128, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": [ "https://creativecommons.org/licenses/by/2.5/au/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", "referenceNumber": 433, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/legalcode" ], "isOsiApproved": false }, { "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": 7, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/at/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": 317, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 141, "name": "Creative Commons Attribution 3.0 IGO", "licenseId": "CC-BY-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/igo/legalcode" ], "isOsiApproved": false }, { "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": 193, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/nl/legalcode" ], "isOsiApproved": false }, { "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": 156, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": [ "https://creativecommons.org/licenses/by/3.0/us/legalcode" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", "referenceNumber": 499, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 292, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 143, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 457, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 216, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 196, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 248, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 368, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode" ], "isOsiApproved": false }, { "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": 462, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode" ], "isOsiApproved": false }, { "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": 464, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode" ], "isOsiApproved": false }, { "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": 478, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode" ], "isOsiApproved": false }, { "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": 384, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 211, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode" ], "isOsiApproved": false }, { "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": 466, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode" ], "isOsiApproved": false }, { "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": 132, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode" ], "isOsiApproved": false }, { "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": 420, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode" ], "isOsiApproved": false }, { "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": 452, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", "licenseId": "CC-BY-NC-SA-2.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/de/legalcode" ], "isOsiApproved": false }, { "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": 29, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode" ], "isOsiApproved": false }, { "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": 460, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "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": 8, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode" ], "isOsiApproved": false }, { "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": 271, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode" ], "isOsiApproved": false }, { "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": 504, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 14, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/3.0/igo/legalcode" ], "isOsiApproved": false }, { "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": 338, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode" ], "isOsiApproved": false }, { "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": 115, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 116, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 13, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/2.5/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 31, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 322, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 44, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-nd/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": false }, { "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": 71, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/1.0/legalcode" ], "isOsiApproved": false }, { "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": 252, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/legalcode" ], "isOsiApproved": false }, { "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": 72, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.0/uk/legalcode" ], "isOsiApproved": false }, { "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": 54, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode" ], "isOsiApproved": false }, { "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": 378, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/2.5/legalcode" ], "isOsiApproved": false }, { "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": 139, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/legalcode" ], "isOsiApproved": false }, { "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": 189, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/at/legalcode" ], "isOsiApproved": false }, { "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": 385, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/de/legalcode" ], "isOsiApproved": false }, { "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": 213, "name": "Creative Commons Attribution-ShareAlike 3.0 IGO", "licenseId": "CC-BY-SA-3.0-IGO", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/3.0/igo/legalcode" ], "isOsiApproved": false }, { "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": 342, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": [ "https://creativecommons.org/licenses/by-sa/4.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", "referenceNumber": 240, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": [ "https://creativecommons.org/licenses/publicdomain/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", "referenceNumber": 279, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": [ "https://creativecommons.org/publicdomain/zero/1.0/legalcode" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", "referenceNumber": 187, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": [ "https://opensource.org/licenses/cddl1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", "referenceNumber": 352, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": [ "http://glassfish.java.net/public/CDDL+GPL_1_1.html", "https://javaee.github.io/glassfish/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", "referenceNumber": 12, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": [ "http://www.opensource.apple.com/cdl/", "https://fedoraproject.org/wiki/Licensing/Common_Documentation_License", "https://www.gnu.org/licenses/license-list.html#ACDL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", "referenceNumber": 238, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": [ "https://cdla.io/permissive-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", "referenceNumber": 270, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": [ "https://cdla.dev/permissive-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", "referenceNumber": 535, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": [ "https://cdla.io/sharing-1-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", "referenceNumber": 376, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", "referenceNumber": 522, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", "referenceNumber": 149, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", "referenceNumber": 226, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", "referenceNumber": 308, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", "referenceNumber": 129, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": [ "http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", "referenceNumber": 348, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", "referenceNumber": 473, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": [ "https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2" ], "isOsiApproved": false }, { "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": 439, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "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": 497, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "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": 493, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": [ "https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CFITSIO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CFITSIO.json", "referenceNumber": 395, "name": "CFITSIO License", "licenseId": "CFITSIO", "seeAlso": [ "https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/f_user/node9.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/checkmk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/checkmk.json", "referenceNumber": 475, "name": "Checkmk License", "licenseId": "checkmk", "seeAlso": [ "https://github.com/libcheck/check/blob/master/checkmk/checkmk.in" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", "referenceNumber": 412, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": [ "http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", "http://www.ncftp.com/ncftp/doc/LICENSE.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Clips.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Clips.json", "referenceNumber": 28, "name": "Clips License", "licenseId": "Clips", "seeAlso": [ "https://github.com/DrItanium/maya/blob/master/LICENSE.CLIPS" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CMU-Mach.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CMU-Mach.json", "referenceNumber": 355, "name": "CMU Mach License", "licenseId": "CMU-Mach", "seeAlso": [ "https://www.cs.cmu.edu/~410/licenses.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", "referenceNumber": 491, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": [ "http://www.jython.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", "referenceNumber": 120, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": [ "https://opensource.org/licenses/CNRI-Python" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", "referenceNumber": 404, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": [ "http://www.python.org/download/releases/1.6.1/download_win/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", "referenceNumber": 203, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": [ "https://coil.apotheon.org/plaintext/01.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", "referenceNumber": 347, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": [ "https://github.com/CommunitySpecification/1.0/blob/master/1._Community_Specification_License-v1.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", "referenceNumber": 351, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": [ "http://research.cs.wisc.edu/condor/license.html#condor", "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 258, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0" ], "isOsiApproved": false }, { "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": 265, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": [ "https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Cornell-Lossless-JPEG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cornell-Lossless-JPEG.json", "referenceNumber": 375, "name": "Cornell Lossless JPEG License", "licenseId": "Cornell-Lossless-JPEG", "seeAlso": [ "https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_lossless_jpeg.cpp#16", "https://www.mssl.ucl.ac.uk/~mcrw/src/20050920/proto.h", "https://gitlab.freedesktop.org/libopenraw/libopenraw/blob/master/lib/ljpegdecompressor.cpp#L32" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", "referenceNumber": 411, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPAL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", "referenceNumber": 488, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", "referenceNumber": 381, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": [ "http://www.codeproject.com/info/cpol10.aspx" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", "referenceNumber": 260, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Crossword" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", "referenceNumber": 105, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd\u003dLicensing/CrystalStacker" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", "referenceNumber": 108, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": [ "https://opensource.org/licenses/CUA-OPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", "referenceNumber": 182, "name": "Cube License", "licenseId": "Cube", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Cube" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", "referenceNumber": 332, "name": "curl License", "licenseId": "curl", "seeAlso": [ "https://github.com/bagder/curl/blob/master/COPYING" ], "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": 337, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": [ "http://www.dipp.nrw.de/d-fsl/lizenzen/", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", "referenceNumber": 302, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/diffmark" ], "isOsiApproved": false }, { "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": 93, "name": "Data licence Germany – attribution – version 2.0", "licenseId": "DL-DE-BY-2.0", "seeAlso": [ "https://www.govdata.de/dl-de/by-2-0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", "referenceNumber": 262, "name": "DOC License", "licenseId": "DOC", "seeAlso": [ "http://www.cs.wustl.edu/~schmidt/ACE-copying.html", "https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", "referenceNumber": 95, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Dotseqn" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", "referenceNumber": 325, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": [ "https://github.com/Neo23x0/sigma/blob/master/LICENSE.Detection.Rules.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", "referenceNumber": 379, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/DSDP" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/dtoa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dtoa.json", "referenceNumber": 144, "name": "David M. Gay dtoa License", "licenseId": "dtoa", "seeAlso": [ "https://github.com/SWI-Prolog/swipl-devel/blob/master/src/os/dtoa.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", "referenceNumber": 289, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/dvipdfm" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", "referenceNumber": 242, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": [ "https://opensource.org/licenses/ECL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", "referenceNumber": 246, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": [ "https://opensource.org/licenses/ECL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", "referenceNumber": 40, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": [ "https://www.gnu.org/licenses/ecos-license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", "referenceNumber": 485, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": [ "http://www.eiffel-nice.org/license/forum.txt", "https://opensource.org/licenses/EFL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", "referenceNumber": 437, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": [ "http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", "https://opensource.org/licenses/EFL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", "referenceNumber": 170, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": [ "http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Elastic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", "referenceNumber": 547, "name": "Elastic License 2.0", "licenseId": "Elastic-2.0", "seeAlso": [ "https://www.elastic.co/licensing/elastic-license", "https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", "referenceNumber": 89, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": [ "https://opensource.org/licenses/Entessa" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", "referenceNumber": 508, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": [ "https://epics.anl.gov/license/open.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", "referenceNumber": 388, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": [ "http://www.eclipse.org/legal/epl-v10.html", "https://opensource.org/licenses/EPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", "referenceNumber": 114, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": [ "https://www.eclipse.org/legal/epl-2.0", "https://www.opensource.org/licenses/EPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", "referenceNumber": 228, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": [ "http://www.erlang.org/EPLICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", "referenceNumber": 273, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": [ "https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", "referenceNumber": 30, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": [ "http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", "https://opensource.org/licenses/EUDatagrid" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", "referenceNumber": 361, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": [ "http://ec.europa.eu/idabc/en/document/7330.html", "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id\u003d31096" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", "referenceNumber": 109, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": [ "https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", "https://opensource.org/licenses/EUPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", "referenceNumber": 166, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": [ "https://joinup.ec.europa.eu/page/eupl-text-11-12", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt", "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri\u003dCELEX:32017D0863", "https://opensource.org/licenses/EUPL-1.2" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", "referenceNumber": 49, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Eurosym" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", "referenceNumber": 436, "name": "Fair License", "licenseId": "Fair", "seeAlso": [ "http://fairlicense.org/", "https://opensource.org/licenses/Fair" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", "referenceNumber": 159, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FDK-AAC", "https://directory.fsf.org/wiki/License:Fdk" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", "referenceNumber": 207, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": [ "https://opensource.org/licenses/Frameworx-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", "referenceNumber": 168, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": [ "https://www.freebsd.org/copyright/freebsd-doc-license/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", "referenceNumber": 533, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": [ "http://freeimage.sourceforge.net/freeimage-license.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", "referenceNumber": 340, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": [ "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", "referenceNumber": 393, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", "referenceNumber": 528, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FSFULLRWD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", "referenceNumber": 512, "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", "licenseId": "FSFULLRWD", "seeAlso": [ "https://lists.gnu.org/archive/html/autoconf/2012-04/msg00061.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", "referenceNumber": 209, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": [ "http://freetype.fis.uniroma2.it/FTL.TXT", "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT", "http://gitlab.freedesktop.org/freetype/freetype/-/raw/master/docs/FTL.TXT" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", "referenceNumber": 294, "name": "GD License", "licenseId": "GD", "seeAlso": [ "https://libgd.github.io/manuals/2.3.0/files/license-txt.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", "referenceNumber": 59, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 521, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "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": 275, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "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": 124, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "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": 391, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", "referenceNumber": 11, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 197, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", "referenceNumber": 188, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 194, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "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": 313, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "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": 427, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "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": 285, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", "referenceNumber": 244, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 349, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", "referenceNumber": 435, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 37, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "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": 406, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "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": 249, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "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": 523, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", "referenceNumber": 283, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 336, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": [ "https://www.gnu.org/licenses/fdl-1.3.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", "referenceNumber": 329, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": [ "http://liballeg.org/license.html#allegro-4-the-giftware-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", "referenceNumber": 461, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": [ "http://www.geuz.org/gl2ps/COPYING.GL2PS" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", "referenceNumber": 353, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": [ "http://www.users.on.net/~triforce/glidexp/COPYING.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", "referenceNumber": 530, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Glulxe" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", "referenceNumber": 318, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": [ "https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", "referenceNumber": 455, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Gnuplot" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", "referenceNumber": 212, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", "referenceNumber": 219, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", "referenceNumber": 235, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "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": 85, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", "referenceNumber": 1, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", "referenceNumber": 509, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", "referenceNumber": 438, "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://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 17, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 296, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": [ "http://ac-archive.sourceforge.net/doc/copyright.html" ], "isOsiApproved": false }, { "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": 68, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": [ "http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id\u003d193d7c7054ba7197b0789e14965b739162319b5e#n141" ], "isOsiApproved": false }, { "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": 261, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": [ "https://www.gnu.org/software/classpath/license.html" ], "isOsiApproved": false }, { "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": 87, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": [ "https://www.gnu.org/licenses/gpl-faq.html#FontException" ], "isOsiApproved": false }, { "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": 468, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": [ "https://gcc.gnu.org/git/?p\u003dgcc.git;a\u003dblob;f\u003dgcc/libgcc1.c;h\u003d762f5143fc6eed57b6797c82710f3538aa52b40b;hb\u003dcb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", "referenceNumber": 55, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", "referenceNumber": 146, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", "referenceNumber": 174, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 425, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 484, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": [ "https://www.gnu.org/licenses/autoconf-exception-3.0.html" ], "isOsiApproved": false }, { "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": 446, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": [ "https://www.gnu.org/licenses/gcc-exception-3.1.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Graphics-Gems.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Graphics-Gems.json", "referenceNumber": 315, "name": "Graphics Gems License", "licenseId": "Graphics-Gems", "seeAlso": [ "https://github.com/erich666/GraphicsGems/blob/master/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", "referenceNumber": 556, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": [ "http://www.cs.fsu.edu/~engelen/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", "referenceNumber": 135, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", "referenceNumber": 5, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": [ "https://firstdonoharm.dev/version/2/1/license.html", "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HP-1986.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HP-1986.json", "referenceNumber": 98, "name": "Hewlett-Packard 1986 License", "licenseId": "HP-1986", "seeAlso": [ "https://sourceware.org/git/?p\u003dnewlib-cygwin.git;a\u003dblob;f\u003dnewlib/libc/machine/hppa/memchr.S;h\u003d1cca3e5e8867aa4bffef1f75a5c1bba25c0c441e;hb\u003dHEAD#l2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", "referenceNumber": 172, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": [ "https://opensource.org/licenses/HPND" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/HPND-export-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-export-US.json", "referenceNumber": 272, "name": "HPND with US Government export control warning", "licenseId": "HPND-export-US", "seeAlso": [ "https://www.kermitproject.org/ck90.html#source" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-Markus-Kuhn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-Markus-Kuhn.json", "referenceNumber": 118, "name": "Historical Permission Notice and Disclaimer - Markus Kuhn variant", "licenseId": "HPND-Markus-Kuhn", "seeAlso": [ "https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c", "https://sourceware.org/git/?p\u003dbinutils-gdb.git;a\u003dblob;f\u003dreadline/readline/support/wcwidth.c;h\u003d0f5ec995796f4813abbcf4972aec0378ab74722a;hb\u003dHEAD#l55" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", "referenceNumber": 424, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h\u003dv4.19" ], "isOsiApproved": false }, { "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": 103, "name": "HPND sell variant with MIT disclaimer", "licenseId": "HPND-sell-variant-MIT-disclaimer", "seeAlso": [ "https://github.com/sigmavirus24/x11-ssh-askpass/blob/master/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", "referenceNumber": 538, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": [ "https://github.com/htacg/tidy-html5/blob/next/README/LICENSE.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", "referenceNumber": 96, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": [ "http://git.denx.de/?p\u003du-boot.git;a\u003dblob;f\u003darch/powerpc/cpu/ppc4xx/miiphy.c;h\u003d297155fdafa064b955e53e9832de93bfb0cfb85b;hb\u003d9fab4bf4cc077c21e43941866f3f2c196f28670d" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", "referenceNumber": 254, "name": "ICU License", "licenseId": "ICU", "seeAlso": [ "http://source.icu-project.org/repos/icu/icu/trunk/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IEC-Code-Components-EULA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IEC-Code-Components-EULA.json", "referenceNumber": 546, "name": "IEC Code Components End-user licence agreement", "licenseId": "IEC-Code-Components-EULA", "seeAlso": [ "https://www.iec.ch/webstore/custserv/pdf/CC-EULA.pdf", "https://www.iec.ch/CCv1", "https://www.iec.ch/copyright" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", "referenceNumber": 110, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": [ "http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev\u003d1.2" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IJG-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG-short.json", "referenceNumber": 373, "name": "Independent JPEG Group License - short", "licenseId": "IJG-short", "seeAlso": [ "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/ljpg/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", "referenceNumber": 287, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": [ "http://www.imagemagick.org/script/license.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", "referenceNumber": 430, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": [ "http://legacy.imatix.com/html/sfl/sfl4.htm#license" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", "referenceNumber": 477, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": [ "http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", "referenceNumber": 366, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": [ "http://www.info-zip.org/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Inner-Net-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Inner-Net-2.0.json", "referenceNumber": 241, "name": "Inner Net License v2.0", "licenseId": "Inner-Net-2.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Inner_Net_License", "https://sourceware.org/git/?p\u003dglibc.git;a\u003dblob;f\u003dLICENSES;h\u003d530893b1dc9ea00755603c68fb36bd4fc38a7be8;hb\u003dHEAD#l207" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", "referenceNumber": 486, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": [ "https://opensource.org/licenses/Intel" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", "referenceNumber": 65, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", "referenceNumber": 553, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": [ "https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", "referenceNumber": 383, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": [ "https://opensource.org/licenses/IPA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", "referenceNumber": 220, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": [ "https://opensource.org/licenses/IPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", "referenceNumber": 263, "name": "ISC License", "licenseId": "ISC", "seeAlso": [ "https://www.isc.org/licenses/", "https://www.isc.org/downloads/software-support-policy/isc-license/", "https://opensource.org/licenses/ISC" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Jam.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Jam.json", "referenceNumber": 445, "name": "Jam License", "licenseId": "Jam", "seeAlso": [ "https://www.boost.org/doc/libs/1_35_0/doc/html/jam.html", "https://web.archive.org/web/20160330173339/https://swarm.workshop.perforce.com/files/guest/perforce_software/jam/src/README" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", "referenceNumber": 537, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": [ "http://www.ece.uvic.ca/~mdadams/jasper/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JPL-image.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPL-image.json", "referenceNumber": 81, "name": "JPL Image Use Policy", "licenseId": "JPL-image", "seeAlso": [ "https://www.jpl.nasa.gov/jpl-image-use-policy" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", "referenceNumber": 50, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": [ "https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", "referenceNumber": 543, "name": "JSON License", "licenseId": "JSON", "seeAlso": [ "http://www.json.org/license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Kazlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Kazlib.json", "referenceNumber": 229, "name": "Kazlib License", "licenseId": "Kazlib", "seeAlso": [ "http://git.savannah.gnu.org/cgit/kazlib.git/tree/except.c?id\u003d0062df360c2d17d57f6af19b0e444c51feb99036" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Knuth-CTAN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", "referenceNumber": 222, "name": "Knuth CTAN License", "licenseId": "Knuth-CTAN", "seeAlso": [ "https://ctan.org/license/knuth" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", "referenceNumber": 176, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": [ "http://artlibre.org/licence/lal/licence-art-libre-12/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", "referenceNumber": 515, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": [ "https://artlibre.org/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", "referenceNumber": 303, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Latex2e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Latex2e-translated-notice.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e-translated-notice.json", "referenceNumber": 26, "name": "Latex2e with translated notice permission", "licenseId": "Latex2e-translated-notice", "seeAlso": [ "https://git.savannah.gnu.org/cgit/indent.git/tree/doc/indent.texi?id\u003da74c6b4ee49397cf330b333da1042bffa60ed14f#n74" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", "referenceNumber": 206, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Leptonica" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", "referenceNumber": 470, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", "referenceNumber": 82, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", "referenceNumber": 19, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "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": 350, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", "referenceNumber": 554, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", "referenceNumber": 198, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", "referenceNumber": 359, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 66, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": [ "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", "referenceNumber": 298, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", "referenceNumber": 231, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", "referenceNumber": 10, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 293, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": [ "https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", "referenceNumber": 56, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": [ "http://www-igm.univ-mlv.fr/~unitex/lgpllr.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", "referenceNumber": 21, "name": "libpng License", "licenseId": "Libpng", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", "referenceNumber": 453, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": [ "http://www.libpng.org/pub/png/src/libpng-LICENSE.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", "referenceNumber": 501, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": [ "https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", "referenceNumber": 227, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/libtiff" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/libutil-David-Nugent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", "referenceNumber": 531, "name": "libutil David Nugent License", "licenseId": "libutil-David-Nugent", "seeAlso": [ "http://web.mit.edu/freebsd/head/lib/libutil/login_ok.3", "https://cgit.freedesktop.org/libbsd/tree/man/setproctitle.3bsd" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", "referenceNumber": 48, "name": "Licence Libre du Québec – Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": [ "https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", "http://opensource.org/licenses/LiLiQ-P-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", "referenceNumber": 418, "name": "Licence Libre du Québec – Réciprocité version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-R-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", "referenceNumber": 286, "name": "Licence Libre du Québec – Réciprocité forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": [ "https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-Rplus-1.1" ], "isOsiApproved": true }, { "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": 409, "name": "Linux man-pages - 1 paragraph", "licenseId": "Linux-man-pages-1-para", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/getcpu.2#n4" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", "referenceNumber": 469, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": [ "https://www.kernel.org/doc/man-pages/licenses.html" ], "isOsiApproved": false }, { "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": 167, "name": "Linux man-pages Copyleft - 2 paragraphs", "licenseId": "Linux-man-pages-copyleft-2-para", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/move_pages.2#n5", "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/migrate_pages.2#n8" ], "isOsiApproved": false }, { "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": 400, "name": "Linux man-pages Copyleft Variant", "licenseId": "Linux-man-pages-copyleft-var", "seeAlso": [ "https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man2/set_mempolicy.2#n5" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", "referenceNumber": 25, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": [ "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LOOP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LOOP.json", "referenceNumber": 357, "name": "Common Lisp LOOP License", "licenseId": "LOOP", "seeAlso": [ "https://gitlab.com/embeddable-common-lisp/ecl/-/blob/develop/src/lsp/loop.lsp", "http://git.savannah.gnu.org/cgit/gcl.git/tree/gcl/lsp/gcl_loop.lsp?h\u003dVersion_2_6_13pre", "https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/src/code/loop.lisp", "https://github.com/cl-adams/adams/blob/master/LICENSE.md", "https://github.com/blakemcbride/eclipse-lisp/blob/master/lisp/loop.lisp", "https://gitlab.common-lisp.net/cmucl/cmucl/-/blob/master/src/code/loop.lisp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", "referenceNumber": 102, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": [ "https://opensource.org/licenses/LPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", "referenceNumber": 0, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": [ "http://plan9.bell-labs.com/plan9/license.html", "https://opensource.org/licenses/LPL-1.02" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", "referenceNumber": 541, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-0.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", "referenceNumber": 99, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-1.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", "referenceNumber": 429, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-2.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", "referenceNumber": 516, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3a.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", "referenceNumber": 237, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": [ "http://www.latex-project.org/lppl/lppl-1-3c.txt", "https://opensource.org/licenses/LPPL-1.3c" ], "isOsiApproved": true }, { "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": 431, "name": "LZMA SDK License (versions 9.11 to 9.20)", "licenseId": "LZMA-SDK-9.11-to-9.20", "seeAlso": [ "https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", "referenceNumber": 449, "name": "LZMA SDK License (versions 9.22 and beyond)", "licenseId": "LZMA-SDK-9.22", "seeAlso": [ "https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", "referenceNumber": 123, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MakeIndex" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Martin-Birgmeier.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Martin-Birgmeier.json", "referenceNumber": 380, "name": "Martin Birgmeier License", "licenseId": "Martin-Birgmeier", "seeAlso": [ "https://github.com/Perl/perl5/blob/blead/util.c#L6136" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/metamail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/metamail.json", "referenceNumber": 474, "name": "metamail License", "licenseId": "metamail", "seeAlso": [ "https://github.com/Dual-Life/mime-base64/blob/master/Base64.xs#L12" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Minpack.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Minpack.json", "referenceNumber": 300, "name": "Minpack License", "licenseId": "Minpack", "seeAlso": [ "http://www.netlib.org/minpack/disclaimer", "https://gitlab.com/libeigen/eigen/-/blob/master/COPYING.MINPACK" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", "referenceNumber": 443, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": [ "https://opensource.org/licenses/MirOS" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", "referenceNumber": 223, "name": "MIT License", "licenseId": "MIT", "seeAlso": [ "https://opensource.org/licenses/MIT" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", "referenceNumber": 369, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": [ "https://github.com/aws/mit-0", "https://romanrm.net/mit-zero", "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", "referenceNumber": 382, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", "referenceNumber": 24, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT?rd\u003dLicensing/MIT#CMU_Style", "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", "referenceNumber": 465, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#enna" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", "referenceNumber": 234, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT#feh" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Festival.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Festival.json", "referenceNumber": 423, "name": "MIT Festival Variant", "licenseId": "MIT-Festival", "seeAlso": [ "https://github.com/festvox/flite/blob/master/COPYING", "https://github.com/festvox/speech_tools/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", "referenceNumber": 548, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:MIT#Modern_Variants", "https://ptolemy.berkeley.edu/copyright.htm", "https://pirlwww.lpl.arizona.edu/resources/guide/software/PerlTk/Tixlic.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", "referenceNumber": 46, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": [ "https://gitlab.freedesktop.org/xorg/app/iceauth/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xvinfo/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xsetroot/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xauth/-/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MIT-Wu.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Wu.json", "referenceNumber": 421, "name": "MIT Tom Wu Variant", "licenseId": "MIT-Wu", "seeAlso": [ "https://github.com/chromium/octane/blob/master/crypto.js" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", "referenceNumber": 145, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MITNFA" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", "referenceNumber": 358, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": [ "https://opensource.org/licenses/Motosoto" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/mpi-permissive.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", "referenceNumber": 295, "name": "mpi Permissive License", "licenseId": "mpi-permissive", "seeAlso": [ "https://sources.debian.org/src/openmpi/4.1.0-10/ompi/debuggers/msgq_interface.h/?hl\u003d19#L19" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", "referenceNumber": 281, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/MIT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", "referenceNumber": 94, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.0.html", "https://opensource.org/licenses/MPL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", "referenceNumber": 192, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/MPL-1.1.html", "https://opensource.org/licenses/MPL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", "referenceNumber": 236, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": [ "https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 67, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": [ "https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/mplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mplus.json", "referenceNumber": 157, "name": "mplus Font License", "licenseId": "mplus", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:Mplus?rd\u003dLicensing/mplus" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MS-LPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", "referenceNumber": 181, "name": "Microsoft Limited Public License", "licenseId": "MS-LPL", "seeAlso": [ "https://www.openhub.net/licenses/mslpl", "https://github.com/gabegundy/atlserver/blob/master/License.txt", "https://en.wikipedia.org/wiki/Shared_Source_Initiative#Microsoft_Limited_Public_License_(Ms-LPL)" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", "referenceNumber": 345, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-PL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", "referenceNumber": 23, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": [ "http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-RL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", "referenceNumber": 80, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", "referenceNumber": 290, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL/", "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", "referenceNumber": 490, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": [ "https://license.coscl.org.cn/MulanPSL2/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", "referenceNumber": 247, "name": "Multics License", "licenseId": "Multics", "seeAlso": [ "https://opensource.org/licenses/Multics" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", "referenceNumber": 480, "name": "Mup License", "licenseId": "Mup", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Mup" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", "referenceNumber": 39, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": [ "https://enterprise.dejacode.com/licenses/public/naist-2003/#license-text", "https://github.com/nodejs/node/blob/4a19cc8947b1bba2b2d27816ec3d0edf9b28e503/LICENSE#L343" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", "referenceNumber": 360, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": [ "http://ti.arc.nasa.gov/opensource/nosa/", "https://opensource.org/licenses/NASA-1.3" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", "referenceNumber": 339, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": [ "https://opensource.org/licenses/Naumen" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", "referenceNumber": 517, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d37b4b3f6cc4bf34e1d3dec61e69914b9819d8894" ], "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": 113, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", "referenceNumber": 199, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": [ "http://otm.illinois.edu/uiuc_openSource", "https://opensource.org/licenses/NCSA" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Net-SNMP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", "referenceNumber": 74, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": [ "http://net-snmp.sourceforge.net/about/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", "referenceNumber": 321, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": [ "http://www.unidata.ucar.edu/software/netcdf/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", "referenceNumber": 539, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Newsletr" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", "referenceNumber": 301, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": [ "https://opensource.org/licenses/NGPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NICTA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", "referenceNumber": 545, "name": "NICTA Public Software License, Version 1.0", "licenseId": "NICTA-1.0", "seeAlso": [ "https://opensource.apple.com/source/mDNSResponder/mDNSResponder-320.10/mDNSPosix/nss_ReadMe.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", "referenceNumber": 346, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": [ "https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt", "https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", "referenceNumber": 319, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": [ "https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE", "https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NIST-Software.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-Software.json", "referenceNumber": 413, "name": "NIST Software License", "licenseId": "NIST-Software", "seeAlso": [ "https://github.com/open-quantum-safe/liboqs/blob/40b01fdbb270f8614fde30e65d30e9da18c02393/src/common/rand/rand_nist.c#L1-L15" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", "referenceNumber": 525, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": [ "http://data.norge.no/nlod/en/1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", "referenceNumber": 52, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": [ "http://data.norge.no/nlod/en/2.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", "referenceNumber": 529, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/NLPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", "referenceNumber": 88, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": [ "https://opensource.org/licenses/nokia" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", "referenceNumber": 417, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": [ "http://bits.netizen.com.au/licenses/NOSL/nosl.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", "referenceNumber": 398, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Noweb" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", "referenceNumber": 53, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", "referenceNumber": 51, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": [ "http://www.mozilla.org/MPL/NPL/1.1/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", "referenceNumber": 555, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": [ "https://opensource.org/licenses/NOSL3.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", "referenceNumber": 458, "name": "NRL License", "licenseId": "NRL", "seeAlso": [ "http://web.mit.edu/network/isakmp/nrllicense.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", "referenceNumber": 2, "name": "NTP License", "licenseId": "NTP", "seeAlso": [ "https://opensource.org/licenses/NTP" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", "referenceNumber": 476, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": [ "https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", "referenceNumber": 456, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Nunit" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", "referenceNumber": 542, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": [ "https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md", "https://cdla.dev/open-use-of-data-agreement-v1-0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", "referenceNumber": 309, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": [ "http://www.opencascade.com/content/occt-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", "referenceNumber": 370, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": [ "http://www.oclc.org/research/activities/software/license/v2final.htm", "https://opensource.org/licenses/OCLC-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", "referenceNumber": 356, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": [ "http://www.opendatacommons.org/licenses/odbl/1.0/", "https://opendatacommons.org/licenses/odbl/1-0/" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", "referenceNumber": 64, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": [ "https://opendatacommons.org/licenses/by/1.0/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFFIS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFFIS.json", "referenceNumber": 104, "name": "OFFIS License", "licenseId": "OFFIS", "seeAlso": [ "https://sourceforge.net/p/xmedcon/code/ci/master/tree/libs/dicom/README" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", "referenceNumber": 419, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false, "isFsfLibre": true }, { "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": 354, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", "referenceNumber": 250, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL10_web" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", "referenceNumber": 3, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 117, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", "referenceNumber": 518, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": [ "http://scripts.sil.org/cms/scripts/page.php?item_id\u003dOFL_web", "https://opensource.org/licenses/OFL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", "referenceNumber": 15, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": [ "https://www.ogc.org/ogc/software/1.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", "referenceNumber": 284, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": [ "https://data.gov.tw/license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", "referenceNumber": 214, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": [ "https://open.canada.ca/en/open-government-licence-canada" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", "referenceNumber": 165, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", "referenceNumber": 304, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", "referenceNumber": 415, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": [ "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", "referenceNumber": 133, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": [ "http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", "https://opensource.org/licenses/OGTSL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", "referenceNumber": 208, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d806557a5ad59804ef3a44d5abfbe91d706b0791f" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", "referenceNumber": 100, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d42b0383c50c299977b5893ee695cf4e486fb0dc7" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", "referenceNumber": 328, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003de5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", "referenceNumber": 333, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dc9f95c2f3f2ffb5e0ae55fe7388af75547660941" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", "referenceNumber": 519, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcbf50f4e1185a21abd4c0a54d3f4341fe28f36ea" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", "referenceNumber": 324, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db6d68acd14e51ca3aab4428bf26522aa74873f0e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", "referenceNumber": 402, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003db0d176738e96a0d3b9f85cb51e140a86f21be715" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", "referenceNumber": 163, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d470b0c18ec67621c85881b2733057fecf4a1acc3" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", "referenceNumber": 451, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d4bc786f34b50aa301be6f5600f58a980070f481e" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", "referenceNumber": 140, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003ddf2cc1e21eb7c160695f5b7cffd6296c151ba188" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", "referenceNumber": 33, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dd32cf54a32d581ab475d23c810b0a7fbaf8d63c3" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", "referenceNumber": 447, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003dcd1284c4a91a8a380d904eee68d1583f989ed386" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", "referenceNumber": 549, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d6852b9d90022e8593c98205413380536b1b5a7cf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", "referenceNumber": 297, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d1cae062821881f41b73012ba816434897abf4205" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", "referenceNumber": 134, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": [ "http://www.openldap.org/devel/gitweb.cgi?p\u003dopenldap.git;a\u003dblob;f\u003dLICENSE;hb\u003d47c2415c1df81556eeb39be6cad458ef87c534a2" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", "referenceNumber": 540, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": [ "http://www.openldap.org/software/release/license.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OLFL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLFL-1.3.json", "referenceNumber": 482, "name": "Open Logistics Foundation License Version 1.3", "licenseId": "OLFL-1.3", "seeAlso": [ "https://openlogisticsfoundation.org/licenses/", "https://opensource.org/license/olfl-1-3/" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", "referenceNumber": 155, "name": "Open Market License", "licenseId": "OML", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Open_Market_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenPBS-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenPBS-2.3.json", "referenceNumber": 377, "name": "OpenPBS v2.3 Software License", "licenseId": "OpenPBS-2.3", "seeAlso": [ "https://github.com/adaptivecomputing/torque/blob/master/PBS_License.txt", "https://www.mcs.anl.gov/research/projects/openpbs/PBS_License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", "referenceNumber": 276, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": [ "http://www.openssl.org/source/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", "referenceNumber": 510, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": [ "http://old.koalateam.com/jackaroo/OPL_1_0.TXT", "https://fedoraproject.org/wiki/Licensing/Open_Public_License" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/OPL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-UK-3.0.json", "referenceNumber": 257, "name": "United Kingdom Open Parliament Licence v3.0", "licenseId": "OPL-UK-3.0", "seeAlso": [ "https://www.parliament.uk/site-information/copyright-parliament/open-parliament-licence/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", "referenceNumber": 514, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": [ "http://opencontent.org/openpub/", "https://www.debian.org/opl", "https://www.ctan.org/license/opl" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", "referenceNumber": 274, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": [ "http://www.osetfoundation.org/public-license", "https://opensource.org/licenses/OPL-2.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", "referenceNumber": 371, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": [ "https://opensource.org/licenses/OSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", "referenceNumber": 310, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/OSL1.1" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", "referenceNumber": 405, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": [ "http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", "referenceNumber": 251, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": [ "http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", "https://opensource.org/licenses/OSL-2.1" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", "referenceNumber": 20, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": [ "https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", "https://opensource.org/licenses/OSL-3.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", "referenceNumber": 69, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": [ "https://paritylicense.com/versions/6.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", "referenceNumber": 323, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": [ "https://paritylicense.com/versions/7.0.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", "referenceNumber": 42, "name": "Open Data Commons Public Domain Dedication \u0026 License 1.0", "licenseId": "PDDL-1.0", "seeAlso": [ "http://opendatacommons.org/licenses/pddl/1.0/", "https://opendatacommons.org/licenses/pddl/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", "referenceNumber": 450, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": [ "http://www.php.net/license/3_0.txt", "https://opensource.org/licenses/PHP-3.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", "referenceNumber": 58, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": [ "http://www.php.net/license/3_01.txt" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", "referenceNumber": 97, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License" ], "isOsiApproved": false }, { "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": 112, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/noncommercial/1.0.0" ], "isOsiApproved": false }, { "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": 161, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": [ "https://polyformproject.org/licenses/small-business/1.0.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", "referenceNumber": 527, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": [ "http://www.postgresql.org/about/licence", "https://opensource.org/licenses/PostgreSQL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", "referenceNumber": 86, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", "referenceNumber": 190, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psfrag" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", "referenceNumber": 27, "name": "psutils License", "licenseId": "psutils", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/psutils" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", "referenceNumber": 459, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": [ "https://opensource.org/licenses/Python-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Python-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", "referenceNumber": 307, "name": "Python License 2.0.1", "licenseId": "Python-2.0.1", "seeAlso": [ "https://www.python.org/download/releases/2.0.1/license/", "https://docs.python.org/3/license.html", "https://github.com/python/cpython/blob/main/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", "referenceNumber": 158, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Qhull" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", "referenceNumber": 472, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": [ "http://doc.qt.nokia.com/3.3/license.html", "https://opensource.org/licenses/QPL-1.0", "https://doc.qt.io/archives/3.3/license.html" ], "isOsiApproved": true, "isFsfLibre": true }, { "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": 62, "name": "Q Public License 1.0 - INRIA 2004 variant", "licenseId": "QPL-1.0-INRIA-2004", "seeAlso": [ "https://github.com/maranget/hevea/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", "referenceNumber": 224, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Rdisc_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", "referenceNumber": 422, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": [ "http://ecos.sourceware.org/old-license.html" ], "isOsiApproved": false, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", "referenceNumber": 16, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": [ "https://opensource.org/licenses/RPL-1.1" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", "referenceNumber": 136, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": [ "https://opensource.org/licenses/RPL-1.5" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", "referenceNumber": 230, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": [ "https://helixcommunity.org/content/rpsl", "https://opensource.org/licenses/RPSL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", "referenceNumber": 506, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": [ "http://www.faqs.org/rfcs/rfc1321.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", "referenceNumber": 169, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": [ "http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", "https://opensource.org/licenses/RSCPL" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", "referenceNumber": 60, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": [ "http://www.ruby-lang.org/en/LICENSE.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SAX-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", "referenceNumber": 390, "name": "Sax Public Domain Notice", "licenseId": "SAX-PD", "seeAlso": [ "http://www.saxproject.org/copying.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", "referenceNumber": 372, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Saxpath_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", "referenceNumber": 173, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": [ "http://research.scea.com/scea_shared_source_license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SchemeReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", "referenceNumber": 38, "name": "Scheme Language Report License", "licenseId": "SchemeReport", "seeAlso": [], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", "referenceNumber": 18, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": [ "http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", "referenceNumber": 344, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": [ "https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", "referenceNumber": 122, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", "referenceNumber": 330, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", "referenceNumber": 278, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": [ "http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SGP4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGP4.json", "referenceNumber": 520, "name": "SGP4 Permission Notice", "licenseId": "SGP4", "seeAlso": [ "https://celestrak.org/publications/AIAA/2006-6753/faq.php" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", "referenceNumber": 511, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.5/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", "referenceNumber": 492, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": [ "https://solderpad.org/licenses/SHL-0.51/" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", "referenceNumber": 387, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": [ "https://opensource.org/licenses/SimPL-2.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", "referenceNumber": 186, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": [ "http://www.openoffice.org/licenses/sissl_license.html", "https://opensource.org/licenses/SISSL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", "referenceNumber": 267, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": [ "http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", "referenceNumber": 162, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": [ "https://opensource.org/licenses/Sleepycat" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", "referenceNumber": 243, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": [ "https://www.smlnj.org/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", "referenceNumber": 399, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": [ "https://github.com/dcblake/SMP/blob/master/Documentation/License.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", "referenceNumber": 334, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SNIA_Public_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/snprintf.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/snprintf.json", "referenceNumber": 142, "name": "snprintf License", "licenseId": "snprintf", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/bsd-snprintf.c#L2" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", "referenceNumber": 311, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", "referenceNumber": 394, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License", "https://metacpan.org/release/KNOK/File-MMagic-1.30/source/COPYING#L28" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", "referenceNumber": 164, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": [ "http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", "referenceNumber": 441, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": [ "https://opensource.org/licenses/SPL-1.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", "referenceNumber": 481, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", "referenceNumber": 151, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": [ "https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", "referenceNumber": 218, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": [ "https://www.mongodb.com/licensing/server-side-public-license" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", "referenceNumber": 299, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": [ "https://www.smlnj.org/license.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", "referenceNumber": 363, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": [ "http://www.sugarcrm.com/crm/SPL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SunPro.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SunPro.json", "referenceNumber": 495, "name": "SunPro License", "licenseId": "SunPro", "seeAlso": [ "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_acosh.c", "https://github.com/freebsd/freebsd-src/blob/main/lib/msun/src/e_lgammal.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", "referenceNumber": 180, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/SWL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Symlinks.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Symlinks.json", "referenceNumber": 259, "name": "Symlinks License", "licenseId": "Symlinks", "seeAlso": [ "https://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg11494.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", "referenceNumber": 496, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": [ "https://www.tapr.org/OHL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", "referenceNumber": 125, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": [ "http://www.tcl.tk/software/tcltk/license.html", "https://fedoraproject.org/wiki/Licensing/TCL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", "referenceNumber": 84, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": [ "http://rc.quest.com/topics/openssh/license.php#tcpwrappers" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TermReadKey.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TermReadKey.json", "referenceNumber": 489, "name": "TermReadKey License", "licenseId": "TermReadKey", "seeAlso": [ "https://github.com/jonathanstowe/TermReadKey/blob/master/README#L9-L10" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", "referenceNumber": 36, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": [ "http://svnkit.com/license.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", "referenceNumber": 416, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TORQUEv1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", "referenceNumber": 426, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TOSL" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TPDL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPDL.json", "referenceNumber": 432, "name": "Time::ParseDate License", "licenseId": "TPDL", "seeAlso": [ "https://metacpan.org/pod/Time::ParseDate#LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TPL-1.0.json", "referenceNumber": 221, "name": "THOR Public License 1.0", "licenseId": "TPL-1.0", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing:ThorPublicLicense" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TTWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TTWL.json", "referenceNumber": 403, "name": "Text-Tabs+Wrap License", "licenseId": "TTWL", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/TTWL", "https://github.com/ap/Text-Tabs/blob/master/lib.modern/Text/Tabs.pm#L148" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", "referenceNumber": 91, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": [ "https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", "referenceNumber": 326, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": [ "https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UCAR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCAR.json", "referenceNumber": 454, "name": "UCAR License", "licenseId": "UCAR", "seeAlso": [ "https://github.com/Unidata/UDUNITS-2/blob/master/COPYRIGHT" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", "referenceNumber": 414, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": [ "https://opensource.org/licenses/UCL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", "referenceNumber": 291, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": [ "https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", "referenceNumber": 544, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": [ "https://www.unicode.org/license.txt", "http://web.archive.org/web/20160823201924/http://www.unicode.org/copyright.html#License", "http://www.unicode.org/copyright.html" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", "referenceNumber": 268, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": [ "http://web.archive.org/web/20140704074106/http://www.unicode.org/copyright.html", "http://www.unicode.org/copyright.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/UnixCrypt.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UnixCrypt.json", "referenceNumber": 47, "name": "UnixCrypt License", "licenseId": "UnixCrypt", "seeAlso": [ "https://foss.heptapod.net/python-libs/passlib/-/blob/branch/stable/LICENSE#L70", "https://opensource.apple.com/source/JBoss/JBoss-737/jboss-all/jetty/src/main/org/mortbay/util/UnixCrypt.java.auto.html", "https://archive.eclipse.org/jetty/8.0.1.v20110908/xref/org/eclipse/jetty/http/security/UnixCrypt.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", "referenceNumber": 137, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": [ "https://unlicense.org/" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", "referenceNumber": 204, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": [ "https://opensource.org/licenses/UPL" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", "referenceNumber": 526, "name": "Vim License", "licenseId": "Vim", "seeAlso": [ "http://vimdoc.sourceforge.net/htmldoc/uganda.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", "referenceNumber": 6, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/VOSTROM" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", "referenceNumber": 153, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": [ "https://opensource.org/licenses/VSL-1.0" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", "referenceNumber": 335, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": [ "http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", "https://opensource.org/licenses/W3C" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", "referenceNumber": 408, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": [ "http://www.w3.org/Consortium/Legal/copyright-software-19980720.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", "referenceNumber": 9, "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" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/w3m.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/w3m.json", "referenceNumber": 32, "name": "w3m License", "licenseId": "w3m", "seeAlso": [ "https://github.com/tats/w3m/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", "referenceNumber": 185, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": [ "https://opensource.org/licenses/Watcom-1.0" ], "isOsiApproved": true, "isFsfLibre": false }, { "reference": "https://spdx.org/licenses/Widget-Workshop.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Widget-Workshop.json", "referenceNumber": 364, "name": "Widget Workshop License", "licenseId": "Widget-Workshop", "seeAlso": [ "https://github.com/novnc/noVNC/blob/master/core/crypto/des.js#L24" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", "referenceNumber": 440, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Wsuipa" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", "referenceNumber": 513, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": [ "http://www.wtfpl.net/about/", "http://sam.zoy.org/wtfpl/COPYING" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", "referenceNumber": 57, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": [ "https://opensource.org/licenses/WXwindows" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", "referenceNumber": 503, "name": "X11 License", "licenseId": "X11", "seeAlso": [ "http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", "referenceNumber": 288, "name": "X11 License Distribution Modification Variant", "licenseId": "X11-distribute-modifications-variant", "seeAlso": [ "https://github.com/mirror/ncurses/blob/master/COPYING" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xdebug-1.03.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xdebug-1.03.json", "referenceNumber": 127, "name": "Xdebug License v 1.03", "licenseId": "Xdebug-1.03", "seeAlso": [ "https://github.com/xdebug/xdebug/blob/master/LICENSE" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", "referenceNumber": 179, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xerox" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xfig.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xfig.json", "referenceNumber": 239, "name": "Xfig License", "licenseId": "Xfig", "seeAlso": [ "https://github.com/Distrotech/transfig/blob/master/transfig/transfig.c", "https://fedoraproject.org/wiki/Licensing:MIT#Xfig_Variant", "https://sourceforge.net/p/mcj/xfig/ci/master/tree/src/Makefile.am" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", "referenceNumber": 138, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": [ "http://www.xfree86.org/current/LICENSE4.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", "referenceNumber": 312, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Xinetd_License" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/xlock.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xlock.json", "referenceNumber": 343, "name": "xlock License", "licenseId": "xlock", "seeAlso": [ "https://fossies.org/linux/tiff/contrib/ras/ras2tif.c" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", "referenceNumber": 119, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": [ "https://opensource.org/licenses/Xnet" ], "isOsiApproved": true }, { "reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", "referenceNumber": 407, "name": "XPP License", "licenseId": "xpp", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/xpp" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", "referenceNumber": 43, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/XSkat_License" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", "referenceNumber": 75, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.0.html" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", "referenceNumber": 215, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": [ "http://www.zimbra.com/license/yahoo_public_license_1.1.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", "referenceNumber": 532, "name": "Zed License", "licenseId": "Zed", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/Zed" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", "referenceNumber": 374, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": [ "https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", "referenceNumber": 107, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": [ "http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html" ], "isOsiApproved": false, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", "referenceNumber": 121, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": [ "http://www.zimbra.com/legal/zimbra-public-license-1-4" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", "referenceNumber": 70, "name": "zlib License", "licenseId": "Zlib", "seeAlso": [ "http://www.zlib.net/zlib_license.html", "https://opensource.org/licenses/Zlib" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", "referenceNumber": 362, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": [ "https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", "referenceNumber": 498, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-1.1" ], "isOsiApproved": false }, { "reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", "referenceNumber": 83, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": [ "http://old.zope.org/Resources/License/ZPL-2.0", "https://opensource.org/licenses/ZPL-2.0" ], "isOsiApproved": true, "isFsfLibre": true }, { "reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", "referenceNumber": 101, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": [ "http://old.zope.org/Resources/ZPL/" ], "isOsiApproved": true, "isFsfLibre": true } ], "releaseDate": "2023-06-18" }reuse-tool-2.1.0/src/reuse/resources/licenses.json.license000066400000000000000000000001441445545121300236600ustar00rootroot00000000000000# SPDX-FileCopyrightText: Linux Foundation and its Contributors # # SPDX-License-Identifier: CC0-1.0reuse-tool-2.1.0/src/reuse/spdx.py000066400000000000000000000060741445545121300170650ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Pietro Albini # # SPDX-License-Identifier: GPL-3.0-or-later """Compilation of the SPDX Document.""" import contextlib import logging import sys from argparse import ArgumentParser, Namespace from gettext import gettext as _ from typing import IO from . import _IGNORE_SPDX_PATTERNS from ._util import PathType from .project import Project from .report import ProjectReport _LOGGER = logging.getLogger(__name__) def add_arguments(parser: ArgumentParser) -> None: """Add arguments to the parser.""" parser.add_argument( "--output", "-o", dest="file", action="store", type=PathType("w") ) parser.add_argument( "--add-license-concluded", action="store_true", help=_( "populate the LicenseConcluded field; note that reuse cannot " "guarantee the field is accurate" ), ) parser.add_argument( "--creator-person", metavar="NAME", help=_("name of the person signing off on the SPDX report"), ) parser.add_argument( "--creator-organization", metavar="NAME", help=_("name of the organization signing off on the SPDX report"), ) def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """Print the project's bill of materials.""" # The SPDX spec mandates that a creator must be specified when a license # conclusion is made, so here we enforce that. More context: # https://github.com/fsfe/reuse-tool/issues/586#issuecomment-1310425706 if ( args.add_license_concluded and args.creator_person is None and args.creator_organization is None ): args.parser.error( _( "error: --creator-person=NAME or --creator-organization=NAME" " required when --add-license-concluded is provided" ), ) with contextlib.ExitStack() as stack: if args.file: out = stack.enter_context(args.file.open("w", encoding="utf-8")) if not any( pattern.match(args.file.name) for pattern in _IGNORE_SPDX_PATTERNS ): # pylint: disable=line-too-long _LOGGER.warning( _( "'{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" ).format(path=out.name) ) report = ProjectReport.generate( project, multiprocessing=not args.no_multiprocessing, add_license_concluded=args.add_license_concluded, ) out.write( report.bill_of_materials( creator_person=args.creator_person, creator_organization=args.creator_organization, ) ) return 0 reuse-tool-2.1.0/src/reuse/supported_licenses.py000066400000000000000000000020201445545121300220040ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """supported-licenses command handler""" import sys from argparse import ArgumentParser, Namespace from typing import IO from ._licenses import _LICENSES, _load_license_list from .project import Project # pylint: disable=unused-argument def add_arguments(parser: ArgumentParser) -> None: """Add arguments to the parser.""" # pylint: disable=unused-argument def run(args: Namespace, project: Project, out: IO[str] = sys.stdout) -> int: """Print the supported SPDX licenses list""" licenses = _load_license_list(_LICENSES)[1] for license_id, license_info in licenses.items(): license_name = license_info["name"] license_reference = license_info["reference"] out.write( f"{license_id: <40}\t{license_name: <80}\t" f"{license_reference: <50}\n" ) return 0 reuse-tool-2.1.0/src/reuse/templates/000077500000000000000000000000001445545121300175245ustar00rootroot00000000000000reuse-tool-2.1.0/src/reuse/templates/default_template.jinja2000066400000000000000000000004311445545121300241400ustar00rootroot00000000000000{% 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 %} reuse-tool-2.1.0/src/reuse/templates/default_template.jinja2.license000066400000000000000000000001671445545121300255670ustar00rootroot00000000000000SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. SPDX-License-Identifier: CC0-1.0 reuse-tool-2.1.0/src/reuse/vcs.py000066400000000000000000000152001445545121300166710ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2020 John Mulligan # # SPDX-License-Identifier: GPL-3.0-or-later """This module deals with version control systems.""" from __future__ import annotations import logging import os from abc import ABC, abstractmethod from pathlib import Path from typing import TYPE_CHECKING, Optional, Set from ._util import GIT_EXE, HG_EXE, StrPath, execute_command if TYPE_CHECKING: from .project import Project _LOGGER = logging.getLogger(__name__) class VCSStrategy(ABC): """Strategy pattern for version control systems.""" @abstractmethod def __init__(self, project: Project): self.project = project @abstractmethod def is_ignored(self, path: StrPath) -> bool: """Is *path* ignored by the VCS?""" @classmethod @abstractmethod def in_repo(cls, directory: StrPath) -> bool: """Is *directory* inside of the VCS repository? :raises NotADirectoryError: if directory is not a directory. """ @classmethod @abstractmethod def find_root(cls, cwd: Optional[StrPath] = None) -> Optional[Path]: """Try to find the root of the project from *cwd*. If none is found, return None. :raises NotADirectoryError: if directory is not a directory. """ class VCSStrategyNone(VCSStrategy): """Strategy that is used when there is no VCS.""" def __init__(self, project: Project): # pylint: disable=useless-super-delegation super().__init__(project) def is_ignored(self, path: StrPath) -> bool: return False @classmethod def in_repo(cls, directory: StrPath) -> bool: return False @classmethod def find_root(cls, cwd: Optional[StrPath] = None) -> Optional[Path]: return None class VCSStrategyGit(VCSStrategy): """Strategy that is used for Git.""" def __init__(self, project: Project): super().__init__(project) if not GIT_EXE: raise FileNotFoundError("Could not find binary for Git") self._all_ignored_files = self._find_all_ignored_files() def _find_all_ignored_files(self) -> Set[Path]: """Return a set of all files ignored by git. If a whole directory is ignored, don't return all files inside of it. """ command = [ str(GIT_EXE), "ls-files", "--exclude-standard", "--ignored", "--others", "--directory", # TODO: This flag is unexpected. I reported it as a bug in Git. # This flag---counter-intuitively---lists untracked directories # that contain ignored files. "--no-empty-directory", # Separate output with \0 instead of \n. "-z", ] result = execute_command(command, _LOGGER, cwd=self.project.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} def is_ignored(self, path: StrPath) -> bool: path = self.project.relative_from_root(path) return path in self._all_ignored_files @classmethod def in_repo(cls, directory: StrPath) -> bool: if directory is None: directory = Path.cwd() if not Path(directory).is_dir(): raise NotADirectoryError() command = [str(GIT_EXE), "status"] result = execute_command(command, _LOGGER, cwd=directory) return not result.returncode @classmethod def find_root(cls, cwd: Optional[StrPath] = None) -> Optional[Path]: if cwd is None: cwd = Path.cwd() if not Path(cwd).is_dir(): raise NotADirectoryError() command = [str(GIT_EXE), "rev-parse", "--show-toplevel"] result = execute_command(command, _LOGGER, cwd=cwd) if not result.returncode: path = result.stdout.decode("utf-8")[:-1] return Path(os.path.relpath(path, cwd)) return None class VCSStrategyHg(VCSStrategy): """Strategy that is used for Mercurial.""" def __init__(self, project: Project): super().__init__(project) if not HG_EXE: raise FileNotFoundError("Could not find binary for Mercurial") self._all_ignored_files = self._find_all_ignored_files() def _find_all_ignored_files(self) -> Set[Path]: """Return a set of all files ignored by mercurial. If a whole directory is ignored, don't return all files inside of it. """ command = [ str(HG_EXE), "status", "--ignored", # terse is marked 'experimental' in the hg help but is documented # in the man page. It collapses the output of a dir containing only # ignored files to the ignored name like the git command does. # TODO: Re-enable this flag in the future. # "--terse=i", "--no-status", "--print0", ] result = execute_command(command, _LOGGER, cwd=self.project.root) all_files = result.stdout.decode("utf-8").split("\0") return {Path(file_) for file_ in all_files} def is_ignored(self, path: StrPath) -> bool: path = self.project.relative_from_root(path) return path in self._all_ignored_files @classmethod def in_repo(cls, directory: StrPath) -> bool: if directory is None: directory = Path.cwd() if not Path(directory).is_dir(): raise NotADirectoryError() command = [str(HG_EXE), "root"] result = execute_command(command, _LOGGER, cwd=directory) return not result.returncode @classmethod def find_root(cls, cwd: Optional[StrPath] = None) -> Optional[Path]: if cwd is None: cwd = Path.cwd() if not Path(cwd).is_dir(): raise NotADirectoryError() command = [str(HG_EXE), "root"] result = execute_command(command, _LOGGER, cwd=cwd) if not result.returncode: path = result.stdout.decode("utf-8")[:-1] return Path(os.path.relpath(path, cwd)) return None def find_root(cwd: Optional[StrPath] = None) -> Optional[Path]: """Try to find the root of the project from *cwd*. If none is found, return None. :raises NotADirectoryError: if directory is not a directory. """ if GIT_EXE: root = VCSStrategyGit.find_root(cwd=cwd) if root: return root if HG_EXE: root = VCSStrategyHg.find_root(cwd=cwd) if root: return root return None reuse-tool-2.1.0/tests/000077500000000000000000000000001445545121300147565ustar00rootroot00000000000000reuse-tool-2.1.0/tests/conftest.py000066400000000000000000000256111445545121300171620ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Carmen Bianca Bakker # # SPDX-License-Identifier: GPL-3.0-or-later """Global fixtures and configuration.""" # pylint: disable=redefined-outer-name import datetime import logging import multiprocessing as mp import os import shutil import subprocess import sys from inspect import cleandoc from io import StringIO from pathlib import Path from typing import Generator from unittest.mock import create_autospec import pytest from debian.copyright import Copyright from jinja2 import Environment os.environ["LC_ALL"] = "C" # A trick that tries to import the installed version of reuse. If that doesn't # work, import from the src directory. If that also doesn't work (for some # reason), then an ImportError is raised. try: # pylint: disable=unused-import import reuse except ImportError: sys.path.append(os.path.join(Path(__file__).parent.parent, "src")) finally: from reuse._util import GIT_EXE, HG_EXE, setup_logging CWD = Path.cwd() TESTS_DIRECTORY = Path(__file__).parent.resolve() RESOURCES_DIRECTORY = TESTS_DIRECTORY / "resources" # REUSE-IgnoreStart def pytest_addoption(parser): """Allows specification of additional commandline options to parse""" parser.addoption("--loglevel", action="store", default="DEBUG") def pytest_configure(config): """Called after command line options have been parsed and all plugins and initial conftest files been loaded. """ loglevel = config.getoption("loglevel") setup_logging(level=logging.getLevelName(loglevel)) def pytest_runtest_setup(item): """Called before running a test.""" # pylint: disable=unused-argument # Make sure to restore CWD os.chdir(CWD) @pytest.fixture() def git_exe() -> str: """Run the test with git.""" if not GIT_EXE: pytest.skip("cannot run this test without git") return str(GIT_EXE) @pytest.fixture() def hg_exe() -> str: """Run the test with mercurial (hg).""" if not HG_EXE: pytest.skip("cannot run this test without mercurial") return str(HG_EXE) @pytest.fixture(params=[True, False]) def multiprocessing(request, monkeypatch) -> Generator[bool, None, None]: """Run the test with or without multiprocessing.""" if not request.param: monkeypatch.delattr(mp, "Pool") yield request.param @pytest.fixture(params=[True, False]) def add_license_concluded(request) -> Generator[bool, None, None]: yield request @pytest.fixture() def empty_directory(tmpdir_factory) -> Path: """Create a temporary empty directory.""" directory = Path(str(tmpdir_factory.mktemp("empty_directory"))) os.chdir(str(directory)) return directory @pytest.fixture() def fake_repository(tmpdir_factory) -> Path: """Create a temporary fake repository.""" directory = Path(str(tmpdir_factory.mktemp("fake_repository"))) for file_ in (RESOURCES_DIRECTORY / "fake_repository").iterdir(): if file_.is_file(): shutil.copy(file_, directory / file_.name) elif file_.is_dir(): shutil.copytree(file_, directory / file_.name) # Get rid of those pesky pyc files. shutil.rmtree(directory / "src/__pycache__", ignore_errors=True) # Adding this here to avoid conflict in main project. (directory / "src/exception.py").write_text( "SPDX-FileCopyrightText: 2017 Jane Doe\n" "SPDX-License-Identifier: GPL-3.0-or-later WITH Autoconf-exception-3.0", encoding="utf-8", ) (directory / "src/custom.py").write_text( "SPDX-FileCopyrightText: 2017 Jane Doe\n" "SPDX-License-Identifier: LicenseRef-custom", encoding="utf-8", ) (directory / "src/multiple_licenses.rs").write_text( "SPDX-FileCopyrightText: 2022 Jane Doe\n" "SPDX-License-Identifier: GPL-3.0-or-later\n" "SPDX-License-Identifier: Apache-2.0 OR CC0-1.0" " WITH Autoconf-exception-3.0\n", encoding="utf-8", ) os.chdir(directory) return directory def _repo_contents( fake_repository, ignore_filename=".gitignore", ignore_prefix="" ): """Generate contents for a vcs repository. Currently defaults to git-like behavior for ignoring files with the expectation that other tools can be configured to ignore files by just chanigng the ignore-file-name and enabling git-like behavior with a prefix line in the ignore file. """ gitignore = ignore_prefix + ( "# SPDX-License-Identifier: CC0-1.0\n" "# SPDX-FileCopyrightText: 2017 Jane Doe\n" "*.pyc\nbuild" ) (fake_repository / ignore_filename).write_text(gitignore) (fake_repository / "LICENSES/CC0-1.0.txt").write_text("License text") for file_ in (fake_repository / "src").iterdir(): if file_.suffix == ".py": file_.with_suffix(".pyc").write_text("foo") build_dir = fake_repository / "build" build_dir.mkdir() (build_dir / "hello.py").write_text("foo") @pytest.fixture() def git_repository(fake_repository: Path, git_exe: str) -> Path: """Create a git repository with ignored files.""" os.chdir(fake_repository) _repo_contents(fake_repository) # TODO: To speed this up, maybe directly write to '.gitconfig' instead. subprocess.run([git_exe, "init", str(fake_repository)], check=True) subprocess.run([git_exe, "config", "user.name", "Example"], check=True) subprocess.run( [git_exe, "config", "user.email", "example@example.com"], check=True ) subprocess.run([git_exe, "config", "commit.gpgSign", "false"], check=True) subprocess.run([git_exe, "add", str(fake_repository)], check=True) subprocess.run( [ git_exe, "commit", "-m", "initial", ], check=True, ) return fake_repository @pytest.fixture() def hg_repository(fake_repository: Path, hg_exe: str) -> Path: """Create a mercurial repository with ignored files.""" os.chdir(fake_repository) _repo_contents( fake_repository, ignore_filename=".hgignore", ignore_prefix="syntax:glob", ) subprocess.run([hg_exe, "init", "."], check=True) subprocess.run([hg_exe, "addremove"], check=True) subprocess.run( [ hg_exe, "commit", "--user", "Example ", "-m", "initial", ], check=True, ) return fake_repository @pytest.fixture() def submodule_repository( git_repository: Path, git_exe: str, tmpdir_factory ) -> Path: """Create a git repository that contains a submodule.""" header = cleandoc( """ SPDX-FileCopyrightText: 2019 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) submodule = Path(str(tmpdir_factory.mktemp("submodule"))) (submodule / "foo.py").write_text(header, encoding="utf-8") os.chdir(submodule) subprocess.run([git_exe, "init", str(submodule)], check=True) subprocess.run([git_exe, "config", "user.name", "Example"], check=True) subprocess.run( [git_exe, "config", "user.email", "example@example.com"], check=True ) subprocess.run([git_exe, "add", str(submodule)], check=True) subprocess.run( [ git_exe, "commit", "-m", "initial", ], check=True, ) os.chdir(git_repository) subprocess.run( [ git_exe, # https://git-scm.com/docs/git-config#Documentation/git-config.txt-protocolallow # # This circumvents a bug/behaviour caused by CVE-2022-39253 where # you cannot use `git submodule add repository path` where # repository is a file on the filesystem. "-c", "protocol.file.allow=always", "submodule", "add", str(submodule.resolve()), "submodule", ], check=True, ) subprocess.run( [ git_exe, "commit", "-m", "add submodule", ], check=True, ) (git_repository / ".gitmodules.license").write_text(header) return git_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) @pytest.fixture() def stringio(): """Create a StringIO object.""" return StringIO() @pytest.fixture() def binary_string(): """Create a binary string.""" return bytes(range(256)) @pytest.fixture() def template_simple_source(): """Source code of simple Jinja2 template.""" return cleandoc( """ Hello, world! {% for copyright_line in copyright_lines %} {{ copyright_line }} {% endfor %} {% for expression in spdx_expressions %} SPDX-License-Identifier: {{ expression }} {% endfor %} """.replace( "spdx-Lic", "SPDX-Lic" ) ) @pytest.fixture() def template_simple(template_simple_source): """Provide a simple Jinja2 template.""" env = Environment(trim_blocks=True) return env.from_string(template_simple_source) @pytest.fixture() def template_no_spdx_source(): """Source code of Jinja2 template without SPDX lines.""" return "Hello, world" @pytest.fixture() def template_no_spdx(template_no_spdx_source): """Provide a Jinja2 template without SPDX lines.""" env = Environment(trim_blocks=True) return env.from_string(template_no_spdx_source) @pytest.fixture() def template_commented_source(): """Source code of a simple Jinja2 template that is already commented.""" return cleandoc( """ # Hello, world! # {% for copyright_line in copyright_lines %} # {{ copyright_line }} {% endfor %} # {% for expression in spdx_expressions %} # SPDX-License-Identifier: {{ expression }} {% endfor %} """.replace( "spdx-Lic", "SPDX-Lic" ) ) @pytest.fixture() def template_commented(template_commented_source): """Provide a Jinja2 template that is already commented.""" env = Environment(trim_blocks=True) return env.from_string(template_commented_source) @pytest.fixture() def mock_date_today(monkeypatch): """Mock away datetime.date.today to always return 2018.""" date = create_autospec(datetime.date) date.today.return_value = datetime.date(2018, 1, 1) monkeypatch.setattr(datetime, "date", date) @pytest.fixture( params=[[], ["John Doe"], ["John Doe", "Alice Doe"]], ids=["None", "John", "John and Alice"], ) def contributors(request): """Provide contributors for SPDX-FileContributor field generation""" yield request.param # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/resources/000077500000000000000000000000001445545121300167705ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/000077500000000000000000000000001445545121300221755ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/.reuse/000077500000000000000000000000001445545121300233765ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/.reuse/dep5000066400000000000000000000003271445545121300241600ustar00rootroot00000000000000Format: 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 License: CC0-1.0 reuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/000077500000000000000000000000001445545121300234025ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/Apache-2.0.txt000066400000000000000000000000161445545121300256160ustar00rootroot00000000000000License text. reuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/Autoconf-exception-3.0.txt000066400000000000000000000000161445545121300302100ustar00rootroot00000000000000Exception textreuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/CC0-1.0.txt000066400000000000000000000000151445545121300250000ustar00rootroot00000000000000License text reuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/GPL-3.0-or-later.txt000066400000000000000000000000151445545121300266020ustar00rootroot00000000000000License text reuse-tool-2.1.0/tests/resources/fake_repository/LICENSES/LicenseRef-custom.txt000066400000000000000000000000001445545121300274600ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/doc/000077500000000000000000000000001445545121300227425ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/doc/index.rst000066400000000000000000000000161445545121300246000ustar00rootroot00000000000000Hello, world! reuse-tool-2.1.0/tests/resources/fake_repository/src/000077500000000000000000000000001445545121300227645ustar00rootroot00000000000000reuse-tool-2.1.0/tests/resources/fake_repository/src/custom.py000066400000000000000000000000721445545121300246470ustar00rootroot00000000000000# This file is overridden by the fake_repository fixture. reuse-tool-2.1.0/tests/resources/fake_repository/src/exception.py000066400000000000000000000000721445545121300253330ustar00rootroot00000000000000# This file is overridden by the fake_repository fixture. reuse-tool-2.1.0/tests/resources/fake_repository/src/multiple_licenses.rs000066400000000000000000000000731445545121300270520ustar00rootroot00000000000000// This file is overridden by the fake_repository fixture. reuse-tool-2.1.0/tests/resources/fake_repository/src/source_code.c000066400000000000000000000002341445545121300254210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2017 Jane Doe */ /* SPDX-License-Identifier: GPL-3.0-or-later */ #include main() { printf("Hello, world!\n"); } reuse-tool-2.1.0/tests/resources/fake_repository/src/source_code.html000066400000000000000000000001571445545121300261470ustar00rootroot00000000000000

Hello, world!

reuse-tool-2.1.0/tests/resources/fake_repository/src/source_code.jinja2000066400000000000000000000001551445545121300263560ustar00rootroot00000000000000{# SPDX-FileCopyrightText: 2017 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later #}

Hello, world!

reuse-tool-2.1.0/tests/resources/fake_repository/src/source_code.py000066400000000000000000000002461445545121300256320ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later """Module docstring.""" if __name__ == "__main__": print("Hello, world!") reuse-tool-2.1.0/tests/resources/fsfe.png000066400000000000000000000125121445545121300204220ustar00rootroot00000000000000PNG  IHDRmFqbKGD pHYs  tIME4IDATxyu?s3!8$Äke]ETU]u`DD˭E-t]]D]IhaH&h dfr&\L\dLt{UIM%j@3{(]`\or.הPx6ChtJ{ ^XD\jB)#_+ tUxI1KA^E1[ ( mqxM)q:4/$ gS=q64šEQm3Nʥ ;yQ xRC/+eQWj  œLÀ#qݗh=xM s欸yYSĢ WY~=x^ [4{ˌƈlXNՊ-~lsF*|iIɅ-x 08Ֆ=^YM\D,iUowTYB#fAJ`Ţ6O}jŲ]T21G3IbpDO-@\;WOl9׹;x}RnbDTfR9kC)g⺚'7XM\瀥M Ѹs2:OMHH t鞩BI$dmTw%W'~g:ouooBfaqu|IznBB6&s~!ЁG [3od,XTO9>\%9N*={eSqE!tU|3o[H)yhU02VG ѻg=;Ƃ^=Ϸ۝NG^%[*=PQ}l'/vwÎmmD zÂ2cЖpW?@{%6uYbgN`lh^8QzQ m&&O~ԕ0r%1],qEkD.."7s6Ю>618h 4]^BlafEqa"Dw{x{/˿#c(E !Ta4~G@@U(Upǀ+]ռZ80䜥b=]\aXL*r;sm}<5ź]R,FGkw k#hvCwR 0 魳`b;LɸjmTI,ۍ[,ȰctdzX\ '^o+K9>#ډw]Lub;JC[ޖ-)xmzյ,cGLd/`-˳ͻubv Yodwz?j48md}u!rDbp}XlV uE>$˶5rzUY[Ђqs&q9pO/Oߴp|MKӎ^[BW`Dɚ\D6rn/ WYRœr3DAϲ1tc.(m^#-NCwAF( pgB6qFG <NA5 F(DgX6I[ }vv[_^(j hڭe-YK i++%] ̀ ɤr p̤Q|ȶi!re6i1-0 ArXf̸g(^*o}W׺16y3yĿYO%IQXL}L?5l' =3MeBq۶ilY<\j(IilgŸ<'P19 gyٱx;/7iL-Uw*xvڸL62x"f, Mhzׯv3iIy4dq6TkldCdD \ԓ)}-s%,KG҅%;oNGx@wP0Ԩ+src!-JD# t9"]ծlvCy|feDc`кY]^2z6`PQHk&,6kӋU+h;N[Ñ鿥@eC&Wln JV+`$Dz;NoT.PKZ?Ah Ȗ4zAw"V.섫*Uk տ3dqLܪ:/Ah'[*^յIC|5YCaTYWA'Kc~hDtn_4FَzR2<]&U׺+\Z ^IQZcYWIKndΟM!.I,nf">KG}b3r#tEn_k.wt_v韌 UXg%+bƻ dwJ?쇺M;MpPd6`3k]J/B{RPn3ʌ_(CAh(.6TO xFn"_N[g4tmF8}xFcD Q.&ߣ2'ˏ0/ }dSHYeh;]RhXeeXd 3$ksR3sq*{OAWT"Ȓ`^ܵ0|]e,סl,BEr#pэJiy"gG48/ɺX G=UhG./o!PBxWbX<~sEV1GBxX<^U:rQcn6td|61# VrR׀x/Q֏ȃ[Vw= <0@dݶ9<_{)4ӏy%3u?7E"_B{-)uLo `b4=O'?߬wX {˝N8oa:=Tß7;Tymr|DPϸZzXC|մxLuqPi<UHrPYV7 g\Ƣk; @@*thFe:,w`?M!6W?&qOYgtCO t9qj P # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.comment""" # pylint: disable=protected-access,invalid-name,redefined-outer-name from inspect import cleandoc from textwrap import dedent import pytest from reuse.comment import ( CCommentStyle, CommentCreateError, CommentParseError, CommentStyle, HtmlCommentStyle, PythonCommentStyle, _all_style_classes, ) @pytest.fixture( params=[ Style for Style in _all_style_classes() if Style.can_handle_single() ] ) def SingleStyle(request): """Yield all Style classes that support single-line comments.""" yield request.param @pytest.fixture( params=[Style for Style in _all_style_classes() if Style.can_handle_multi()] ) def MultiStyle(request): """Yield all Style classes that support multi-line comments.""" yield request.param def test_create_comment_generic_single(SingleStyle): """Create a comment for all classes that support single-line comments.""" text = "Hello" expected = ( f"{SingleStyle.SINGLE_LINE}{SingleStyle.INDENT_AFTER_SINGLE}Hello" ) assert SingleStyle.create_comment(text) == expected def test_create_comment_generic_multi(MultiStyle): """Create a comment for all classes that support multi-line comments.""" # pylint: disable=line-too-long text = "Hello" expected = cleandoc( f""" {MultiStyle.MULTI_LINE.start} {MultiStyle.INDENT_BEFORE_MIDDLE}{MultiStyle.MULTI_LINE.middle}{MultiStyle.INDENT_AFTER_MIDDLE}Hello {MultiStyle.INDENT_BEFORE_END}{MultiStyle.MULTI_LINE.end} """ ) assert MultiStyle.create_comment(text, force_multi=True) == expected def test_parse_comment_generic_single(SingleStyle): """Parse a comment for all classes that support single-line comments.""" text = f"{SingleStyle.SINGLE_LINE}{SingleStyle.INDENT_AFTER_SINGLE}Hello" expected = "Hello" assert SingleStyle.parse_comment(text) == expected def test_parse_comment_generic_multi(MultiStyle): """Parse a comment for all classes that support multi-line comments.""" # pylint: disable=line-too-long text = cleandoc( f""" {MultiStyle.MULTI_LINE.start} {MultiStyle.INDENT_BEFORE_MIDDLE}{MultiStyle.MULTI_LINE.middle}{MultiStyle.INDENT_AFTER_MIDDLE}Hello {MultiStyle.INDENT_BEFORE_END}{MultiStyle.MULTI_LINE.end} """ ) expected = "Hello" assert MultiStyle.parse_comment(text) == expected def test_parse_comment_sameline_multi(MultiStyle): """If a multi-line comment style is on a single line, it should still be parsed. """ text = cleandoc( f""" {MultiStyle.MULTI_LINE.start} Hello {MultiStyle.MULTI_LINE.end} """ ) expected = "Hello" assert MultiStyle.parse_comment(text) == expected def test_base_class_throws_errors(): """When trying to do much of anything with the base class, expect errors.""" with pytest.raises(CommentParseError): CommentStyle.parse_comment("hello") with pytest.raises(CommentCreateError): CommentStyle.create_comment("hello") with pytest.raises(CommentParseError): CommentStyle.comment_at_first_character("hello") def test_create_comment_python(): """Create a simple Python comment.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ # Hello # # world """ ) assert PythonCommentStyle.create_comment(text) == expected def test_parse_comment_python(): """Parse a simple Python comment.""" text = cleandoc( """ # Hello # # world """ ) expected = cleandoc( """ Hello world """ ) assert PythonCommentStyle.parse_comment(text) == expected def test_parse_comment_python_indented(): """Preserve indentations in Python comments.""" text = cleandoc( """ # def foo(): # print("foo") """ ) expected = cleandoc( """ def foo(): print("foo") """ ) assert PythonCommentStyle.parse_comment(text) == expected def test_create_comment_python_dont_strip_newlines(): """Include newlines in the comment.""" text = "\nhello\n" expected = cleandoc( """ # # hello # """ ) assert PythonCommentStyle.create_comment(text) == expected def test_create_comment_python_force_multi(): """Raise CommentCreateError when creating a multi-line Python comment.""" with pytest.raises(CommentCreateError): PythonCommentStyle.create_comment("hello", force_multi=True) def test_parse_comment_python_fail_on_newline(): """If a provided comment does not start with the comment character, fail.""" text = dedent( """ # # hello # """ ) with pytest.raises(CommentParseError): assert PythonCommentStyle.parse_comment(text) def test_parse_comment_python_not_a_comment(): """Raise CommentParseError when a comment isn't provided.""" text = "Hello world" with pytest.raises(CommentParseError): PythonCommentStyle.parse_comment(text) def test_parse_comment_python_single_line_is_not_comment(): """Raise CommentParseError when a single line is not a comment.""" text = cleandoc( """ # Hello world """ ) with pytest.raises(CommentParseError): PythonCommentStyle.parse_comment(text) def test_parse_comment_python_multi_error(): """Raise CommentParseError when trying to parse a multi-line Python comment. """ with pytest.raises(CommentParseError): PythonCommentStyle._parse_comment_multi("Hello world") def test_create_comment_c_single(): """Create a C comment with single-line comments.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ // Hello // world """ ) assert CCommentStyle.create_comment(text) == expected def test_parse_comment_c_single(): """Parse a C comment with single-line comments.""" text = cleandoc( """ // Hello // world """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_create_comment_c_multi(): """Create a C comment with multi-line comments.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ /* * Hello * world */ """ ) assert CCommentStyle.create_comment(text, force_multi=True) == expected def test_create_comment_c_multi_empty_newlines(): """Create a C comment that contains empty lines.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ /* * Hello * * world */ """ ) assert CCommentStyle.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.""" text = "\nHello\nworld\n" expected = cleandoc( """ /* * * Hello * world * */ """ ) assert CCommentStyle.create_comment(text, force_multi=True) == expected def test_create_comment_c_multi_contains_ending(): """Raise CommentCreateError when the text contains a comment ending.""" text = cleandoc( """ Hello world */ """ ) with pytest.raises(CommentCreateError): CCommentStyle.create_comment(text, force_multi=True) def test_parse_comment_c_multi(): """Parse a C comment with multi-line comments.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_missing_middle(): """Parse a C comment even though the middle markers are missing.""" text = cleandoc( """ /* Hello world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_misaligned_end(): """Parse a C comment even though the end is misaligned.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_no_middle(): """Parse a C comment that has no middle whatsoever.""" text = cleandoc( """ /* Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.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.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.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.""" text = cleandoc( """ /* Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_indented(): """Preserve indentations in C comments.""" text = cleandoc( """ /* * Hello * world */ """ ) expected = cleandoc( """ Hello world """ ) assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_single_line(): """Parse a single-line multi-line comment.""" text = "/* Hello world */" expected = "Hello world" assert CCommentStyle.parse_comment(text) == expected def test_parse_comment_c_multi_no_start(): """Raise CommentParseError when there is no comment starter.""" text = "Hello world */" with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) with pytest.raises(CommentParseError): CCommentStyle._parse_comment_multi(text) def test_parse_comment_c_multi_no_end(): """Raise CommentParseError when there is no comment end.""" text = "/* Hello world" with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) def test_parse_comment_c_multi_text_after_end(): """Raise CommentParseError when there is stuff after the comment delimiter. """ text = cleandoc( """ /* * Hello * world */ Spam """ ) with pytest.raises(CommentParseError): CCommentStyle.parse_comment(text) def test_create_comment_html(): """Create an HTML comment.""" text = cleandoc( """ Hello world """ ) expected = cleandoc( """ """ ) assert HtmlCommentStyle.create_comment(text) == expected def test_parse_comment_html(): """Parse an HTML comment.""" text = cleandoc( """ """ ) expected = cleandoc( """ Hello world """ ) assert HtmlCommentStyle.parse_comment(text) == expected def test_create_comment_html_single(): """Creating a single-line HTML comment fails.""" with pytest.raises(CommentCreateError): HtmlCommentStyle._create_comment_single("hello") def test_parse_comment_html_single_line(): """Parse a single-line HTML comment.""" text = "" expected = "Hello world" assert HtmlCommentStyle.parse_comment(text) == expected def test_comment_at_first_character_python(): """Find the comment block at the first character.""" text = cleandoc( """ # Hello # world Spam """ ) expected = cleandoc( """ # Hello # world """ ) assert PythonCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_python_no_comment(): """The text does not start with a comment character.""" with pytest.raises(CommentParseError): PythonCommentStyle.comment_at_first_character(" # Hello world") def test_comment_at_first_character_python_indented_comments(): """Don't handle indented comments.""" text = cleandoc( """ # Hello # world """ ) expected = "# Hello" assert PythonCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_c_multi(): """Simple test for a multi-line C comment.""" text = cleandoc( """ /* * Hello * world */ Spam """ ) expected = cleandoc( """ /* * Hello * world */ """ ) assert CCommentStyle.comment_at_first_character(text) == expected def test_comment_at_first_character_c_multi_never_ends(): """Expect CommentParseError if the comment never ends.""" text = cleandoc( """ /* * Hello * world /* """ ) with pytest.raises(CommentParseError): CCommentStyle.comment_at_first_character(text) reuse-tool-2.1.0/tests/test_core.py000066400000000000000000000063641445545121300173300ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for some core components.""" import pytest from reuse import ReuseInfo, SourceType # REUSE-IgnoreStart def test_reuse_info_contains_copyright_or_licensing(): """If either spdx_expressions or copyright_lines is truthy, expect True.""" arguments = [ ({"GPL-3.0-or-later"}, set()), (set(), "SPDX-FileCopyrightText: 2017 Jane Doe"), ({"GPL-3.0-or-later"}, "SPDX-FileCopyrightText: 2017 Jane Doe"), ] for args in arguments: info = ReuseInfo(*args) assert info.contains_copyright_or_licensing() def test_reuse_info_contains_copyright_or_licensing_empty(): """If the ReuseInfo object is completely empty, expect False.""" info = ReuseInfo() assert not info.contains_copyright_or_licensing() def test_reuse_info_contains_copyright_or_licensing_other_truthy(): """If another attribute is truthy, still expect False.""" info = ReuseInfo(contributor_lines={"SPDX-FileContributor: 2017 Jane Doe"}) assert not info.contains_copyright_or_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() assert ReuseInfo( copyright_lines={"SPDX-FileCopyrightText: 2017 Jane Doe"} ).contains_info() assert ReuseInfo( contributor_lines={"SPDX-FileContributor: 2017 John Doe"} ).contains_info() def test_reuse_info_contains_info_empty(): """If the ReuseInfo object is empty, expect False.""" info = ReuseInfo() assert not info.contains_info() def test_reuse_info_contains_info_source_truthy(): """If any of the source information is truthy, still expect False.""" assert not ReuseInfo(source_path="foo.py").contains_info() assert not ReuseInfo(source_type=SourceType.FILE_HEADER).contains_info() def test_reuse_info_copy_simple(): """Get a copy of ReuseInfo with one field replaced.""" info = ReuseInfo( spdx_expressions={"GPL-3.0-or-later"}, copyright_lines={"2017 Jane Doe"}, source_path="foo", ) new_info = info.copy(source_path="bar") assert info != new_info assert info.spdx_expressions == new_info.spdx_expressions assert info.copyright_lines == new_info.copyright_lines assert info.source_path != new_info.source_path assert new_info.source_path == "bar" def test_reuse_info_copy_nonexistent_attribute(): """ Expect a KeyError when trying to copy a nonexistent field into ReuseInfo. """ info = ReuseInfo() with pytest.raises(KeyError): info.copy(foo="bar") def test_reuse_info_union_simple(): """ Get a union of ReuseInfo with one field merged and one remaining equal. """ info1 = ReuseInfo( copyright_lines={"2017 Jane Doe"}, source_path="foo", ) info2 = ReuseInfo(copyright_lines={"2017 John Doe"}, source_path="bar") new_info = info1 | info2 # union and __or__ are equal assert new_info == info1.union(info2) assert sorted(new_info.copyright_lines) == [ "2017 Jane Doe", "2017 John Doe", ] assert new_info.source_path == "foo" # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_download.py000066400000000000000000000062011445545121300201750ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.download""" import urllib.request from pathlib import Path from urllib.error import URLError import pytest from reuse.download import download_license, put_license_in_file class MockResponse: """Super simple mocked version of Response.""" def __init__(self, text=None, status_code=None): self.text = text self.status_code = status_code def __enter__(self): return self def __exit__(self, type_, value, traceback): return False def read(self): return self.text.encode("utf-8") def getcode(self): return self.status_code def test_download(monkeypatch): """A straightforward test: Request license text, get license text.""" monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse("hello", 200) ) result = download_license("0BSD") assert result == "hello" def test_download_404(monkeypatch): """If the server returns a 404, there is no license text.""" monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse(status_code=404) ) with pytest.raises(URLError): download_license("does-not-exist") def test_download_exception(monkeypatch): """If urllib raises an exception itself, that exception is not escaped.""" def raise_exception(_): raise URLError("test") monkeypatch.setattr(urllib.request, "urlopen", raise_exception) with pytest.raises(URLError): download_license("hello world") def test_put_simple(fake_repository, monkeypatch): """Straightforward test.""" monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse("hello\n", 200) ) put_license_in_file("0BSD", "LICENSES/0BSD.txt") assert (fake_repository / "LICENSES/0BSD.txt").read_text() == "hello\n" def test_put_file_exists(fake_repository, monkeypatch): """The to-be-downloaded file already exists.""" # pylint: disable=unused-argument monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse("hello\n", 200) ) with pytest.raises(FileExistsError) as exc_info: put_license_in_file("GPL-3.0-or-later", "LICENSES/GPL-3.0-or-later.txt") assert Path(exc_info.value.filename).name == "GPL-3.0-or-later.txt" def test_put_request_exception(fake_repository, monkeypatch): """There was an error while downloading the license file.""" # pylint: disable=unused-argument monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse(status_code=404) ) with pytest.raises(URLError): put_license_in_file("0BSD", "LICENSES/0BSD.txt") def test_put_empty_dir(empty_directory, monkeypatch): """Create a LICENSES/ directory if one does not yet exist.""" monkeypatch.setattr( urllib.request, "urlopen", lambda _: MockResponse("hello\n", 200) ) put_license_in_file("0BSD", "LICENSES/0BSD.txt") assert (empty_directory / "LICENSES").exists() assert (empty_directory / "LICENSES/0BSD.txt").read_text() == "hello\n" reuse-tool-2.1.0/tests/test_header.py000066400000000000000000000246401445545121300176250ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.header""" from inspect import cleandoc import pytest from reuse import ReuseInfo from reuse.comment import CCommentStyle, CommentCreateError from reuse.header import ( MissingReuseInfo, add_new_header, create_header, find_and_replace_header, ) # REUSE-IgnoreStart def test_create_header_simple(): """Create a super simple header.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert create_header(info).strip() == expected def test_create_header_simple_with_contributor(): """Create a super simple header.""" info = ReuseInfo( {"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}, {"John Doe"} ) expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # SPDX-FileContributor: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert create_header(info).strip() == expected def test_create_header_template_simple(template_simple): """Create a header with a simple template.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert create_header(info, template=template_simple).strip() == expected def test_create_header_template_no_spdx(template_no_spdx): """Create a header with a template that does not have all REUSE info.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) with pytest.raises(MissingReuseInfo): create_header(info, template=template_no_spdx) def test_create_header_template_commented(template_commented): """Create a header with an already-commented template.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert ( create_header( info, template=template_commented, template_is_commented=True, style=CCommentStyle, ).strip() == expected ) def test_create_header_already_contains_spdx(): """Create a new header from a header that already contains REUSE info.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) existing = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: MIT """ ) expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: MIT """ ) assert create_header(info, header=existing).strip() == expected def test_create_header_existing_is_wrong(): """If the existing header contains errors, raise a CommentCreateError.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) existing = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: MIT AND OR 0BSD """ ) with pytest.raises(CommentCreateError): create_header(info, header=existing) def test_create_header_old_syntax(): """Old copyright syntax is preserved when creating a new header.""" info = ReuseInfo({"GPL-3.0-or-later"}) existing = cleandoc( """ # Copyright John Doe """ ) expected = cleandoc( """ # Copyright John Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert create_header(info, header=existing).strip() == expected def test_create_header_remove_fluff(): """Any stuff that isn't REUSE info is removed when using create_header.""" info = ReuseInfo({"GPL-3.0-or-later"}) existing = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # Hello, world! pass """ ) expected = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later """ ) assert create_header(info, header=existing).strip() == expected def test_add_new_header_simple(): """Given text that already contains a header, create a new one, and preserve the old one. """ info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) text = cleandoc( """ # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: MIT pass """ ) expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: MIT pass """ ) assert add_new_header(text, info) == expected def test_find_and_replace_no_header(): """Given text without header, add a header.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) text = "pass" expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert ( find_and_replace_header(text, info) == add_new_header(text, info) == expected ) def test_find_and_replace_verbatim(): """Replace a header with itself.""" info = ReuseInfo() text = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert find_and_replace_header(text, info) == text def test_find_and_replace_newline_before_header(): """In a scenario where the header is preceded by whitespace, remove the preceding whitespace. """ info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: John Doe"}) text = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe pass """ ) text = "\n" + text expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert find_and_replace_header(text, info) == expected def test_find_and_replace_preserve_preceding(): """When the SPDX header is in the middle of the file, keep it there.""" info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: John Doe"}) text = cleandoc( """ # Hello, world! def foo(bar): return bar # SPDX-FileCopyrightText: Jane Doe pass """ ) expected = cleandoc( """ # Hello, world! def foo(bar): return bar # SPDX-FileCopyrightText: Jane Doe # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert find_and_replace_header(text, info) == expected def test_find_and_replace_keep_shebang(): """When encountering a shebang, keep it and put the REUSE header beneath it. """ info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: John Doe"}) text = cleandoc( """ #!/usr/bin/env python3 # SPDX-FileCopyrightText: Jane Doe pass """ ) expected = cleandoc( """ #!/usr/bin/env python3 # SPDX-FileCopyrightText: Jane Doe # SPDX-FileCopyrightText: John Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert find_and_replace_header(text, info) == expected def test_find_and_replace_separate_shebang(): """When the shebang is part of the same comment as the SPDX comment, separate the two. """ info = ReuseInfo({"GPL-3.0-or-later"}) text = cleandoc( """ #!/usr/bin/env python3 #!nix-shell -p python3 # SPDX-FileCopyrightText: Jane Doe pass """ ) expected = cleandoc( """ #!/usr/bin/env python3 #!nix-shell -p python3 # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) 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.""" info = ReuseInfo({"GPL-3.0-or-later"}) text = cleandoc( """ #!/usr/bin/env python3 # Hello, world! pass """ ) expected = cleandoc( """ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-3.0-or-later # Hello, world! pass """ ) 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. """ info = ReuseInfo({"GPL-3.0-or-later"}, {"SPDX-FileCopyrightText: Jane Doe"}) text = cleandoc( """ # Hello, world! pass """ ) expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later # Hello, world! pass """ ) assert find_and_replace_header(text, info) == expected def test_find_and_replace_preserve_newline(): """If the file content ends with a newline, don't remove it.""" info = ReuseInfo() text = ( cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) + "\n" ) assert find_and_replace_header(text, info) == text # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_lint.py000066400000000000000000000135741445545121300173470ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2019 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """All tests for reuse.lint""" import shutil import sys from importlib import import_module import pytest from reuse.lint import 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 def test_lint_simple(fake_repository): """Extremely simple test for lint.""" project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert result def test_lint_git(git_repository): """Extremely simple test for lint with a git repository.""" project = Project(git_repository) report = ProjectReport.generate(project) result = format_plain(report) assert result def test_lint_submodule(submodule_repository): """Extremely simple test for lint with an ignored submodule.""" project = Project(submodule_repository) (submodule_repository / "submodule/foo.c").write_text("foo") report = ProjectReport.generate(project) result = format_plain(report) assert result def test_lint_submodule_included(submodule_repository): """Extremely simple test for lint with an included submodule.""" project = Project(submodule_repository, include_submodules=True) (submodule_repository / "submodule/foo.c").write_text("foo") report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result def test_lint_empty_directory(empty_directory): """An empty directory is compliant.""" project = Project(empty_directory) report = ProjectReport.generate(project) result = format_plain(report) assert result def test_lint_deprecated(fake_repository): """If a repo has a deprecated license, detect it.""" shutil.copy( fake_repository / "LICENSES/GPL-3.0-or-later.txt", fake_repository / "LICENSES/GPL-3.0.txt", ) (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: GPL-3.0\nSPDX-FileCopyrightText: Jane Doe" ) project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert "GPL-3.0" in result def test_lint_bad_license(fake_repository): """A bad license is detected.""" (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: bad-license" ) project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert "foo.py" in result assert "bad-license" in result def test_lint_missing_licenses(fake_repository): """A missing license is detected.""" (fake_repository / "foo.py").write_text("SPDX-License-Identifier: MIT") project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert "foo.py" in result assert "MIT" in result def test_lint_unused_licenses(fake_repository): """An unused license is detected.""" (fake_repository / "LICENSES/MIT.txt").write_text("foo") project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert "Unused licenses: MIT" in result @cpython @posix def test_lint_read_errors(fake_repository): """A read error is detected.""" (fake_repository / "foo.py").write_text("foo") (fake_repository / "foo.py").chmod(0o000) project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert "Could not read:" in result assert "foo.py" in result def test_lint_files_without_copyright_and_licensing(fake_repository): """A file without copyright and licensing is detected.""" (fake_repository / "foo.py").write_text("foo") project = Project(fake_repository) report = ProjectReport.generate(project) result = format_plain(report) assert ":-(" in result assert ( "The following files have no copyright and licensing information:" in result ) assert "foo.py" in result def test_lint_json_output(fake_repository): """Test for lint with JSON output.""" (fake_repository / "foo.py").write_text("SPDX-License-Identifier: MIT") project = Project(fake_repository) report = ProjectReport.generate(project) json_result = report.to_dict_lint() assert json_result # Test if all the keys are present assert "lint_version" in json_result assert "reuse_spec_version" in json_result assert "reuse_tool_version" in json_result assert "non_compliant" in json_result assert "files" in json_result assert "summary" in json_result # Test length of resulting list values assert len(json_result["files"]) == 9 assert len(json_result["summary"]) == 5 # Test result assert json_result["summary"]["compliant"] is False # Test license path for test_file in json_result["files"]: if test_file["path"] == str(fake_repository / "foo.py"): assert test_file["licenses"][0]["value"] == "MIT" assert test_file["licenses"][0]["source"] == str( fake_repository / "foo.py" ) if test_file["path"].startswith(str(fake_repository / "doc")): assert test_file["licenses"][0]["value"] == "CC0-1.0" assert test_file["licenses"][0]["source"] == str( fake_repository / ".reuse/dep5" ) # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_main.py000066400000000000000000000342361445545121300173230ustar00rootroot00000000000000# 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 Pietro Albini # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._main: lint, spdx, download""" # pylint: disable=redefined-outer-name,unused-argument import errno import json import os import re from inspect import cleandoc from pathlib import Path from typing import Generator, Optional from unittest.mock import create_autospec from urllib.error import URLError import pytest from reuse import download from reuse._main import main from reuse._util import GIT_EXE, HG_EXE from reuse.report import LINT_VERSION # REUSE-IgnoreStart @pytest.fixture(params=[True, False]) def optional_git_exe( request, monkeypatch ) -> Generator[Optional[str], None, None]: """Run the test with or without git.""" exe = GIT_EXE if request.param else "" monkeypatch.setattr("reuse.project.GIT_EXE", exe) monkeypatch.setattr("reuse._util.GIT_EXE", exe) yield exe @pytest.fixture(params=[True, False]) def optional_hg_exe( request, monkeypatch ) -> Generator[Optional[str], None, None]: """Run the test with or without mercurial.""" exe = HG_EXE if request.param else "" monkeypatch.setattr("reuse.project.HG_EXE", exe) monkeypatch.setattr("reuse._util.HG_EXE", exe) yield exe @pytest.fixture() def mock_put_license_in_file(monkeypatch): """Create a mocked version of put_license_in_file.""" result = create_autospec(download.put_license_in_file) monkeypatch.setattr(download, "put_license_in_file", result) return result def test_lint(fake_repository, stringio, optional_git_exe, optional_hg_exe): """Run a successful lint. The optional VCSs are there to make sure that the test also works if these programs are not installed. """ 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) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_submodule(submodule_repository, stringio): """Run a successful lint.""" (submodule_repository / "submodule/foo.c").write_text("foo") result = main(["lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_submodule_included(submodule_repository, stringio): """Run a successful lint.""" result = main(["--include-submodules", "lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_submodule_included_fail(submodule_repository, stringio): """Run a failed lint.""" (submodule_repository / "submodule/foo.c").write_text("foo") result = main(["--include-submodules", "lint"], out=stringio) assert result == 1 assert ":-(" in stringio.getvalue() def test_lint_meson_subprojects(fake_repository, stringio): """Verify that subprojects are ignored.""" (fake_repository / "meson.build").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) ) subprojects_dir = fake_repository / "subprojects" subprojects_dir.mkdir() libfoo_dir = subprojects_dir / "libfoo" libfoo_dir.mkdir() # ./subprojects/foo.wrap has license and linter succeeds (subprojects_dir / "foo.wrap").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) ) # ./subprojects/libfoo/foo.c misses license but is ignored (libfoo_dir / "foo.c").write_text("foo") result = main(["lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_meson_subprojects_fail(fake_repository, stringio): """Verify that files in './subprojects' are not ignored.""" (fake_repository / "meson.build").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) ) subprojects_dir = fake_repository / "subprojects" subprojects_dir.mkdir() # ./subprojects/foo.wrap misses license and linter fails (subprojects_dir / "foo.wrap").write_text("foo") result = main(["lint"], out=stringio) assert result == 1 assert ":-(" in stringio.getvalue() def test_lint_meson_subprojects_included_fail(fake_repository, stringio): """When Meson subprojects are included, fail on errors.""" (fake_repository / "meson.build").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) ) libfoo_dir = fake_repository / "subprojects/libfoo" libfoo_dir.mkdir(parents=True) # ./subprojects/libfoo/foo.c misses license and linter fails (libfoo_dir / "foo.c").write_text("foo") result = main(["--include-meson-subprojects", "lint"], out=stringio) assert result == 1 assert ":-(" in stringio.getvalue() def test_lint_meson_subprojects_included(fake_repository, stringio): """Successfully lint when Meson subprojects are included.""" (fake_repository / "meson.build").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: CC0-1.0 """ ) ) libfoo_dir = fake_repository / "subprojects/libfoo" libfoo_dir.mkdir(parents=True) # ./subprojects/libfoo/foo.c has license and linter succeeds (libfoo_dir / "foo.c").write_text( cleandoc( """ SPDX-FileCopyrightText: 2022 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) ) result = main(["--include-meson-subprojects", "lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_fail(fake_repository, stringio): """Run a failed lint.""" (fake_repository / "foo.py").write_text("foo") result = main(["lint"], out=stringio) assert result > 0 assert "foo.py" in stringio.getvalue() assert ":-(" in stringio.getvalue() def test_lint_fail_quiet(fake_repository, stringio): """Run a failed lint.""" (fake_repository / "foo.py").write_text("foo") result = main(["lint", "--quiet"], out=stringio) assert result > 0 assert stringio.getvalue() == "" def test_lint_json(fake_repository, stringio): """Run a failed lint.""" result = main(["lint", "--json"], out=stringio) output = json.loads(stringio.getvalue()) assert result == 0 assert output["lint_version"] == LINT_VERSION assert len(output["files"]) == 8 def test_lint_json_fail(fake_repository, stringio): """Run a failed lint.""" (fake_repository / "foo.py").write_text("foo") result = main(["lint", "--json"], out=stringio) output = json.loads(stringio.getvalue()) assert result > 0 assert output["lint_version"] == LINT_VERSION assert len(output["non_compliant"]["missing_licensing_info"]) == 1 assert len(output["non_compliant"]["missing_copyright_info"]) == 1 assert len(output["files"]) == 9 def test_lint_no_file_extension(fake_repository, stringio): """If a license has no file extension, the lint fails.""" (fake_repository / "LICENSES/CC0-1.0.txt").rename( fake_repository / "LICENSES/CC0-1.0" ) result = main(["lint"], out=stringio) assert result > 0 assert "Licenses without file extension: CC0-1.0" in stringio.getvalue() assert ":-(" in stringio.getvalue() def test_lint_custom_root(fake_repository, stringio): """Use a custom root location.""" result = main(["--root", "doc", "lint"], out=stringio) assert result > 0 assert "index.rst" in stringio.getvalue() assert ":-(" in stringio.getvalue() def test_lint_custom_root_git(git_repository, stringio): """Use a custom root location in a git repo.""" result = main(["--root", "doc", "lint"], out=stringio) assert result > 0 assert "index.rst" in stringio.getvalue() assert ":-(" in stringio.getvalue() def test_lint_custom_root_different_cwd(fake_repository, stringio): """Use a custom root while CWD is different.""" os.chdir("/") result = main(["--root", str(fake_repository), "lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_lint_custom_root_is_file(fake_repository, stringio): """Custom root cannot be a file.""" with pytest.raises(SystemExit): main(["--root", ".reuse/dep5", "lint"], out=stringio) def test_lint_custom_root_not_exists(fake_repository, stringio): """Custom root must exist.""" with pytest.raises(SystemExit): main(["--root", "does-not-exist", "lint"], out=stringio) def test_lint_no_multiprocessing(fake_repository, stringio, multiprocessing): """--no-multiprocessing works.""" result = main(["--no-multiprocessing", "lint"], out=stringio) assert result == 0 assert ":-)" in stringio.getvalue() def test_spdx(fake_repository, stringio): """Compile to an SPDX document.""" os.chdir(str(fake_repository)) result = main(["spdx"], out=stringio) output = stringio.getvalue() # Ensure no LicenseConcluded is included without the flag assert "\nLicenseConcluded: NOASSERTION\n" in output 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 # TODO: This test is rubbish. assert result == 0 assert output def test_spdx_creator_info(fake_repository, stringio): """Ensure the --creator-* flags are properly formatted""" os.chdir(str(fake_repository)) result = main( [ "spdx", "--creator-person=Jane Doe (jane.doe@example.org)", "--creator-organization=FSFE", ], out=stringio, ) output = stringio.getvalue() assert result == 0 assert "\nCreator: Person: Jane Doe (jane.doe@example.org)\n" in output assert "\nCreator: Organization: FSFE ()\n" in output def test_spdx_add_license_concluded(fake_repository, stringio): """Compile to an SPDX document with the LicenseConcluded field.""" os.chdir(str(fake_repository)) result = main( [ "spdx", "--add-license-concluded", "--creator-person=Jane Doe", "--creator-organization=FSFE", ], out=stringio, ) output = stringio.getvalue() # Ensure no LicenseConcluded is included without the flag assert result == 0 assert "\nLicenseConcluded: NOASSERTION\n" not in output assert "\nLicenseConcluded: GPL-3.0-or-later\n" in output assert "\nCreator: Person: Jane Doe ()\n" in output assert "\nCreator: Organization: FSFE ()\n" in output def test_spdx_add_license_concluded_without_creator_info( fake_repository, stringio ): """Adding LicenseConcluded should require creator information""" os.chdir(str(fake_repository)) with pytest.raises(SystemExit): main(["spdx", "--add-license-concluded"], out=stringio) def test_spdx_no_multiprocessing(fake_repository, stringio, multiprocessing): """--no-multiprocessing works.""" os.chdir(str(fake_repository)) result = main(["--no-multiprocessing", "spdx"], out=stringio) # TODO: This test is rubbish. assert result == 0 assert stringio.getvalue() def test_download(fake_repository, stringio, mock_put_license_in_file): """Straightforward test.""" result = main(["download", "0BSD"], out=stringio) assert result == 0 mock_put_license_in_file.assert_called_with( "0BSD", Path("LICENSES/0BSD.txt").resolve() ) def test_download_file_exists( fake_repository, stringio, mock_put_license_in_file ): """The to-be-downloaded file already exists.""" mock_put_license_in_file.side_effect = FileExistsError( errno.EEXIST, "", "GPL-3.0-or-later.txt" ) result = main(["download", "GPL-3.0-or-later"], out=stringio) assert result == 1 assert "GPL-3.0-or-later.txt already exists" in stringio.getvalue() def test_download_exception( fake_repository, stringio, mock_put_license_in_file ): """There was an error while downloading the license file.""" mock_put_license_in_file.side_effect = URLError("test") result = main(["download", "0BSD"], out=stringio) assert result == 1 assert "internet" in stringio.getvalue() def test_download_invalid_spdx( fake_repository, stringio, mock_put_license_in_file ): """An invalid SPDX identifier was provided.""" mock_put_license_in_file.side_effect = URLError("test") result = main(["download", "does-not-exist"], out=stringio) assert result == 1 assert "not a valid SPDX License Identifier" in stringio.getvalue() def test_download_custom_output( empty_directory, stringio, mock_put_license_in_file ): """Download the license into a custom file.""" result = main(["download", "-o", "foo", "0BSD"], out=stringio) assert result == 0 mock_put_license_in_file.assert_called_with("0BSD", destination=Path("foo")) def test_download_custom_output_too_many( empty_directory, stringio, mock_put_license_in_file ): """Providing more than one license with a custom output results in an error. """ with pytest.raises(SystemExit): main( ["download", "-o", "foo", "0BSD", "GPL-3.0-or-later"], out=stringio ) def test_supported_licenses(stringio): """Invoke the supported-licenses command and check whether the result contains at least one license in the expected format. """ assert main(["supported-licenses"], out=stringio) == 0 assert re.search( # pylint: disable=line-too-long r"GPL-3\.0-or-later\s+GNU General Public License v3\.0 or later\s+https:\/\/spdx\.org\/licenses\/GPL-3\.0-or-later\.html\s+\n", stringio.getvalue(), ) # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_main_annotate.py000066400000000000000000001026701445545121300212120ustar00rootroot00000000000000# 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-License-Identifier: GPL-3.0-or-later """Tests for reuse._main: annotate""" import logging import stat from inspect import cleandoc import pytest from reuse._main import main # pylint: disable=too-many-lines,unused-argument # REUSE-IgnoreStart # TODO: Replace this test with a monkeypatched test def test_annotate_simple(fake_repository, stringio, mock_date_today): """Add a header to a file that does not have one.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_addheader_simple(fake_repository, stringio, mock_date_today): """Add a header to a file that does not have one.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "addheader", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_simple_no_replace(fake_repository, stringio, mock_date_today): """Add a header to a file without replacing the existing header.""" simple_file = fake_repository / "foo.py" simple_file.write_text( cleandoc( """ # SPDX-FileCopyrightText: 2017 John Doe # # SPDX-License-Identifier: MIT pass """ ) ) expected = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2017 John Doe # # SPDX-License-Identifier: MIT pass """ ) result = main( [ "annotate", "--no-replace", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_year(fake_repository, stringio): """Add a header to a file with a custom year.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ # SPDX-FileCopyrightText: 2016 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--year", "2016", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_no_year(fake_repository, stringio): """Add a header to a file without a year.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ # SPDX-FileCopyrightText: Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--exclude-year", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "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" simple_file.write_text( cleandoc( """ #!/usr/bin/env python3 pass """ ) ) expected = cleandoc( """ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_shebang_wrong_comment_style(fake_repository, stringio): """If a comment style does not support the shebang at the top, don't treat the shebang as special. """ simple_file = fake_repository / "foo.html" simple_file.write_text( cleandoc( """ #!/usr/bin/env python3 pass """ ) ) expected = cleandoc( """ #!/usr/bin/env python3 pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "foo.html", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_contributors_only( fake_repository, stringio, mock_date_today, contributors ): """Add a header with only contributor information.""" if not contributors: pytest.skip("No contributors to add") simple_file = fake_repository / "foo.py" simple_file.write_text("pass") content = [] for contributor in sorted(contributors): content.append(f"# SPDX-FileContributor: {contributor}") content += ["", "pass"] expected = cleandoc("\n".join(content)) args = [ "annotate", ] for contributor in contributors: args += ["--contributor", contributor] args += ["foo.py"] result = main( args, out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_contributors( fake_repository, stringio, mock_date_today, contributors ): """Add a header with contributor information.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") content = ["# SPDX-FileCopyrightText: 2018 Jane Doe"] if contributors: for contributor in sorted(contributors): content.append(f"# SPDX-FileContributor: {contributor}") content += ["#", "# SPDX-License-Identifier: GPL-3.0-or-later", "", "pass"] expected = cleandoc("\n".join(content)) args = [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", ] for contributor in contributors: args += ["--contributor", contributor] args += ["foo.py"] result = main( args, out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_specify_style(fake_repository, stringio, mock_date_today): """Add a header to a file that does not have one, using a custom style.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ // SPDX-FileCopyrightText: 2018 Jane Doe // // SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--style", "c", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_implicit_style(fake_repository, stringio, mock_date_today): """Add a header to a file that has a recognised extension.""" simple_file = fake_repository / "foo.js" simple_file.write_text("pass") expected = cleandoc( """ // SPDX-FileCopyrightText: 2018 Jane Doe // // SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.js", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_implicit_style_filename( fake_repository, stringio, mock_date_today ): """Add a header to a filename that is recognised.""" simple_file = fake_repository / "Makefile" simple_file.write_text("pass") expected = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "Makefile", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_unrecognised_style(fake_repository): """Add a header to a file that has an unrecognised extension.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.foo", ] ) def test_annotate_skip_unrecognised(fake_repository, stringio): """Skip file that has an unrecognised extension.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--skip-unrecognised", "foo.foo", ], out=stringio, ) assert result == 0 assert "Skipped unrecognised file foo.foo" in stringio.getvalue() def test_annotate_skip_unrecognised_and_style( fake_repository, stringio, caplog ): """--skip-unrecognised and --style show warning message.""" simple_file = fake_repository / "foo.foo" simple_file.write_text("pass") result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--style=c", "--skip-unrecognised", "foo.foo", ], out=stringio, ) assert result == 0 loglevel = logging.getLogger("reuse").level if loglevel > logging.WARNING: pytest.skip( "Test needs LogLevel <= WARNING (e.g. WARNING, INFO, DEBUG)." ) else: assert "no effect" in caplog.text def test_annotate_no_copyright_or_license(fake_repository): """Add a header, but supply no copyright or license.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") with pytest.raises(SystemExit): main(["annotate", "foo.py"]) def test_annotate_template_simple( fake_repository, stringio, mock_date_today, template_simple_source ): """Add a header with a custom template.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" template_file.parent.mkdir(parents=True, exist_ok=True) template_file.write_text(template_simple_source) expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate.jinja2", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_template_simple_multiple( fake_repository, stringio, mock_date_today, template_simple_source ): """Add a header with a custom template to multiple files.""" simple_files = [fake_repository / f"foo{i}.py" for i in range(10)] for simple_file in simple_files: simple_file.write_text("pass") template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" template_file.parent.mkdir(parents=True, exist_ok=True) template_file.write_text(template_simple_source) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate.jinja2", ] + list(map(str, simple_files)), out=stringio, ) assert result == 0 for simple_file in simple_files: expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) assert simple_file.read_text() == expected def test_annotate_template_no_spdx( fake_repository, stringio, template_no_spdx_source ): """Add a header with a template that lacks REUSE info.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" template_file.parent.mkdir(parents=True, exist_ok=True) template_file.write_text(template_no_spdx_source) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate.jinja2", "foo.py", ], out=stringio, ) assert result == 1 def test_annotate_template_commented( fake_repository, stringio, mock_date_today, template_commented_source ): """Add a header with a custom template that is already commented.""" simple_file = fake_repository / "foo.c" simple_file.write_text("pass") template_file = ( fake_repository / ".reuse/templates/mytemplate.commented.jinja2" ) template_file.parent.mkdir(parents=True, exist_ok=True) template_file.write_text(template_commented_source) expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate.commented.jinja2", "foo.c", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_template_nonexistant(fake_repository): """Raise an error when using a header that does not exist.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate.jinja2", "foo.py", ] ) def test_annotate_template_without_extension( fake_repository, stringio, mock_date_today, template_simple_source ): """Find the correct header even when not using an extension.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") template_file = fake_repository / ".reuse/templates/mytemplate.jinja2" template_file.parent.mkdir(parents=True, exist_ok=True) template_file.write_text(template_simple_source) expected = cleandoc( """ # Hello, world! # # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--template", "mytemplate", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected def test_annotate_binary( fake_repository, stringio, mock_date_today, binary_string ): """Add a header to a .license file if the file is a binary.""" binary_file = fake_repository / "foo.png" binary_file.write_bytes(binary_string) expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.png", ], out=stringio, ) assert result == 0 assert ( binary_file.with_name(f"{binary_file.name}.license").read_text().strip() == expected ) def test_annotate_uncommentable_json( fake_repository, stringio, mock_date_today ): """Add a header to a .license file if the file is uncommentable, e.g., JSON. """ json_file = fake_repository / "foo.json" json_file.write_text('{"foo": 23, "bar": 42}') expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.json", ], out=stringio, ) assert result == 0 assert ( json_file.with_name(f"{json_file.name}.license").read_text().strip() == expected ) def test_annotate_force_dot_license(fake_repository, stringio, mock_date_today): """Add a header to a .license file if --force-dot-license is given.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--force-dot-license", "foo.py", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license").read_text().strip() == expected ) assert simple_file.read_text() == "pass" def test_annotate_force_dot_license_identical_to_explicit_license( fake_repository, stringio, mock_date_today ): """For backwards compatibility, --force-dot-license should have identical results as --explicit-license. """ files = [ fake_repository / "foo.py", fake_repository / "bar.py", ] for path in files: path.write_text("pass") expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) for arg, path in zip(("--force-dot-license", "--explicit-license"), files): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", arg, str(path), ], out=stringio, ) for path in files: assert ( path.with_name(f"{path.name}.license").read_text().strip() == expected ) assert path.read_text() == "pass" def test_annotate_force_dot_license_double( fake_repository, stringio, mock_date_today ): """When path.license already exists, don't create path.license.license.""" simple_file = fake_repository / "foo.txt" simple_file_license = fake_repository / "foo.txt.license" simple_file_license_license = fake_repository / "foo.txt.license.license" simple_file.write_text("foo") simple_file_license.write_text("foo") expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--force-dot-license", "foo.txt", ], out=stringio, ) assert result == 0 assert not simple_file_license_license.exists() assert simple_file_license.read_text().strip() == expected def test_annotate_force_dot_license_unsupported_filetype( fake_repository, stringio, mock_date_today ): """Add a header to a .license file if --force-dot-license is given, with the base file being an otherwise unsupported filetype. """ simple_file = fake_repository / "foo.txt" simple_file.write_text("Preserve this") expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--force-dot-license", "foo.txt", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license").read_text().strip() == expected ) assert simple_file.read_text() == "Preserve this" def test_annotate_force_dot_license_doesnt_write_to_file( fake_repository, stringio, mock_date_today ): """Adding a header to a .license file if --force-dot-license is given, doesn't require write permission to the file, just the directory. """ simple_file = fake_repository / "foo.txt" simple_file.write_text("Preserve this") simple_file.chmod(mode=stat.S_IREAD) expected = cleandoc( """ SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--force-dot-license", "foo.txt", ], out=stringio, ) assert result == 0 assert ( simple_file.with_name(f"{simple_file.name}.license").read_text().strip() == expected ) assert simple_file.read_text() == "Preserve this" def test_annotate_to_read_only_file_does_not_traceback( fake_repository, stringio, mock_date_today ): """Trying to add a header without having write permission, shouldn't result in a traceback. See issue #398""" _file = fake_repository / "test.sh" _file.write_text("#!/bin/sh") _file.chmod(mode=stat.S_IREAD) with pytest.raises(SystemExit) as info: main( [ "annotate", "--license", "Apache-2.0", "--copyright", "mycorp", "--style", "python", "test.sh", ] ) assert info.value # should not exit with 0 def test_annotate_license_file(fake_repository, stringio, mock_date_today): """Add a header to a .license file if it exists.""" simple_file = fake_repository / "foo.py" simple_file.write_text("foo") license_file = fake_repository / "foo.py.license" license_file.write_text( cleandoc( """ SPDX-FileCopyrightText: 2016 John Doe Hello """ ) ) expected = ( cleandoc( """ SPDX-FileCopyrightText: 2016 John Doe SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) + "\n" ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert license_file.read_text() == expected assert simple_file.read_text() == "foo" def test_annotate_license_file_only_one_newline( fake_repository, stringio, mock_date_today ): """When a header is added to a .license file that already ends with a newline, the new header should end with a single newline. """ simple_file = fake_repository / "foo.py" simple_file.write_text("foo") license_file = fake_repository / "foo.py.license" license_file.write_text( cleandoc( """ SPDX-FileCopyrightText: 2016 John Doe Hello """ ) + "\n" ) expected = ( cleandoc( """ SPDX-FileCopyrightText: 2016 John Doe SPDX-FileCopyrightText: 2018 Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) + "\n" ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 assert license_file.read_text() == expected assert simple_file.read_text() == "foo" def test_annotate_year_mutually_exclusive(fake_repository): """--exclude-year and --year are mutually exclusive.""" with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--exclude-year", "--year", "2020", "src/source_code.py", ] ) def test_annotate_single_multi_line_mutually_exclusive(fake_repository): """--single-line and --multi-line are mutually exclusive.""" with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--single-line", "--multi-line", "src/source_code.c", ] ) @pytest.mark.parametrize("skip_option", [("--skip-unrecognised"), ("")]) def test_annotate_multi_line_not_supported(fake_repository, skip_option): """Expect a fail if --multi-line is not supported for a file type.""" with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--multi-line", skip_option, "src/source_code.py", ] ) @pytest.mark.parametrize("skip_option", [("--skip-unrecognised"), ("")]) def test_annotate_single_line_not_supported(fake_repository, skip_option): """Expect a fail if --single-line is not supported for a file type.""" with pytest.raises(SystemExit): main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--single-line", skip_option, "src/source_code.html", ] ) def test_annotate_force_multi_line_for_c( fake_repository, stringio, mock_date_today ): """--multi-line forces a multi-line comment for C.""" simple_file = fake_repository / "foo.c" simple_file.write_text("foo") expected = cleandoc( """ /* * SPDX-FileCopyrightText: 2018 Jane Doe * * SPDX-License-Identifier: GPL-3.0-or-later */ foo """ ) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "--multi-line", "foo.c", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == expected @pytest.mark.parametrize("line_ending", ["\r\n", "\r", "\n"]) def test_annotate_line_endings( empty_directory, stringio, mock_date_today, line_ending ): """Given a file with a certain type of line ending, preserve it.""" simple_file = empty_directory / "foo.py" simple_file.write_bytes( line_ending.encode("utf-8").join([b"hello", b"world"]) ) expected = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later hello world """ ).replace("\n", line_ending) result = main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) assert result == 0 with open(simple_file, newline="", encoding="utf-8") as fp: contents = fp.read() assert contents == expected def test_annotate_skip_existing(fake_repository, stringio, mock_date_today): """When annotate --skip-existing on a file that already contains REUSE info, don't write additional information to it. """ for path in ("foo.py", "bar.py"): (fake_repository / path).write_text("pass") expected_foo = cleandoc( """ # SPDX-FileCopyrightText: 2018 Jane Doe # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) expected_bar = cleandoc( """ # SPDX-FileCopyrightText: 2018 John Doe # # SPDX-License-Identifier: MIT pass """ ) main( [ "annotate", "--license", "GPL-3.0-or-later", "--copyright", "Jane Doe", "foo.py", ], out=stringio, ) result = main( [ "annotate", "--license", "MIT", "--copyright", "John Doe", "--skip-existing", "foo.py", "bar.py", ] ) assert result == 0 assert (fake_repository / "foo.py").read_text() == expected_foo assert (fake_repository / "bar.py").read_text() == expected_bar def test_annotate_recursive(fake_repository, stringio, mock_date_today): """Add a header to a directory recursively.""" (fake_repository / "src/one/two").mkdir(parents=True) (fake_repository / "src/one/two/foo.py").write_text( cleandoc( """ # SPDX-License-Identifier: GPL-3.0-or-later """ ) ) (fake_repository / "src/hello.py").touch() (fake_repository / "src/one/world.py").touch() (fake_repository / "bar").mkdir(parents=True) (fake_repository / "bar/bar.py").touch() result = main( [ "annotate", "--copyright", "Joe Somebody", "--recursive", "src/", ], out=stringio, ) for path in (fake_repository / "src").glob("src/**"): content = path.read_text() assert "SPDX-FileCopyrightText: 2018 Joe Somebody" in content assert "Joe Somebody" not in (fake_repository / "bar/bar.py").read_text() assert result == 0 def test_annotate_recursive_on_file(fake_repository, stringio, mock_date_today): """Don't expect errors when annotate is run 'recursively' on a file.""" result = main( [ "annotate", "--copyright", "Joe Somebody", "--recursive", "src/source_code.py", ], out=stringio, ) assert ( "Joe Somebody" in (fake_repository / "src/source_code.py").read_text() ) assert result == 0 def test_annotate_recursive_contains_unrecognised( fake_repository, stringio, mock_date_today ): """Expect error and no edited files if at least one file has not been recognised.""" (fake_repository / "baz").mkdir(parents=True) (fake_repository / "baz/foo.py").write_text("foo") (fake_repository / "baz/bar.unknown").write_text("bar") (fake_repository / "baz/baz.sh").write_text("baz") with pytest.raises(SystemExit): main( [ "annotate", "--license", "Apache-2.0", "--copyright", "Jane Doe", "--recursive", "baz/", ] ) assert "Jane Doe" not in (fake_repository / "baz/foo.py").read_text() # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_main_annotate_merge.py000066400000000000000000000072001445545121300223620ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021 Liam Beguin # # 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 # REUSE-IgnoreStart def test_annotate_merge_copyrights_simple(fake_repository, stringio): """Add multiple headers to a file with merge copyrights.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") result = main( [ "annotate", "--year", "2016", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--merge-copyrights", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == cleandoc( """ # SPDX-FileCopyrightText: 2016 Mary Sue # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--year", "2018", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--merge-copyrights", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == cleandoc( """ # SPDX-FileCopyrightText: 2016 - 2018 Mary Sue # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) def test_annotate_merge_copyrights_multi_prefix(fake_repository, stringio): """Add multiple headers to a file with merge copyrights.""" simple_file = fake_repository / "foo.py" simple_file.write_text("pass") for i in range(0, 3): result = main( [ "annotate", "--year", str(2010 + i), "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 for i in range(0, 5): result = main( [ "annotate", "--year", str(2015 + i), "--license", "GPL-3.0-or-later", "--copyright-style", "string-c", "--copyright", "Mary Sue", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == cleandoc( """ # Copyright (C) 2015 Mary Sue # Copyright (C) 2016 Mary Sue # Copyright (C) 2017 Mary Sue # Copyright (C) 2018 Mary Sue # Copyright (C) 2019 Mary Sue # SPDX-FileCopyrightText: 2010 Mary Sue # SPDX-FileCopyrightText: 2011 Mary Sue # SPDX-FileCopyrightText: 2012 Mary Sue # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) result = main( [ "annotate", "--year", "2018", "--license", "GPL-3.0-or-later", "--copyright", "Mary Sue", "--merge-copyrights", "foo.py", ], out=stringio, ) assert result == 0 assert simple_file.read_text() == cleandoc( """ # Copyright (C) 2010 - 2019 Mary Sue # # SPDX-License-Identifier: GPL-3.0-or-later pass """ ) # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_project.py000066400000000000000000000335121445545121300200410ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2023 Carmen Bianca BAKKER # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.project.""" 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 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" # REUSE-IgnoreStart def test_project_not_a_directory(empty_directory): """Cannot create a Project without a valid directory.""" (empty_directory / "foo.py").write_text("foo") with pytest.raises(NotADirectoryError): Project(empty_directory / "foo.py") def test_all_files(empty_directory): """Given a directory with some files, yield all files.""" (empty_directory / "foo").write_text("foo") (empty_directory / "bar").write_text("foo") project = Project(empty_directory) assert {file_.name for file_ in project.all_files()} == {"foo", "bar"} def test_all_files_ignore_dot_license(empty_directory): """When file and file.license are present, only yield file.""" (empty_directory / "foo").write_text("foo") (empty_directory / "foo.license").write_text("foo") project = Project(empty_directory) assert {file_.name for file_ in project.all_files()} == {"foo"} def test_all_files_ignore_cal_license(empty_directory): """CAL licenses contain SPDX tags referencing themselves. They should be skipped. """ (empty_directory / "CAL-1.0").write_text("foo") (empty_directory / "CAL-1.0.txt").write_text("foo") (empty_directory / "CAL-1.0-Combined-Work-Exception").write_text("foo") (empty_directory / "CAL-1.0-Combined-Work-Exception.txt").write_text("foo") project = Project(empty_directory) assert not list(project.all_files()) def test_all_files_ignore_shl_license(empty_directory): """SHL-2.1 contains an SPDX tag referencing itself. It should be skipped.""" (empty_directory / "SHL-2.1").write_text("foo") (empty_directory / "SHL-2.1.txt").write_text("foo") project = Project(empty_directory) assert not list(project.all_files()) def test_all_files_ignore_git(empty_directory): """When the git directory is present, ignore it.""" (empty_directory / ".git").mkdir() (empty_directory / ".git/config").write_text("foo") project = Project(empty_directory) assert not list(project.all_files()) 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() project = Project(empty_directory) assert not list(project.all_files()) @posix def test_all_files_symlinks(empty_directory): """All symlinks must be ignored.""" (empty_directory / "blob").write_text("foo") (empty_directory / "blob.license").write_text( cleandoc( """ SPDX-FileCopyrightText: Jane Doe SPDX-License-Identifier: GPL-3.0-or-later """ ) ) (empty_directory / "symlink").symlink_to("blob") project = Project(empty_directory) assert Path("symlink").absolute() not in project.all_files() def test_all_files_ignore_zero_sized(empty_directory): """Empty files should be skipped.""" (empty_directory / "foo").touch() project = Project(empty_directory) assert Path("foo").absolute() not in project.all_files() def test_all_files_git_ignored(git_repository): """Given a Git repository where some files are ignored, do not yield those files. """ project = Project(git_repository) assert Path("build/hello.py").absolute() not in project.all_files() def test_all_files_git_ignored_different_cwd(git_repository): """Given a Git repository where some files are ignored, do not yield those files. Be in a different CWD during the above. """ os.chdir(git_repository / "LICENSES") project = Project(git_repository) assert Path("build/hello.py").absolute() not in project.all_files() def test_all_files_git_ignored_contains_space(git_repository): """Files that contain spaces are also ignored.""" (git_repository / "I contain spaces.pyc").write_text("foo") project = Project(git_repository) assert Path("I contain spaces.pyc").absolute() not in project.all_files() @posix def test_all_files_git_ignored_contains_newline(git_repository): """Files that contain newlines are also ignored.""" (git_repository / "hello\nworld.pyc").write_text("foo") project = Project(git_repository) assert Path("hello\nworld.pyc").absolute() not in project.all_files() def test_all_files_submodule_is_ignored(submodule_repository): """If a submodule is ignored, all_files should not raise an Exception.""" (submodule_repository / "submodule/foo.py").write_text("foo") gitignore = submodule_repository / ".gitignore" contents = gitignore.read_text() contents += "\nsubmodule/\n" gitignore.write_text(contents) project = Project(submodule_repository) assert Path("submodule/foo.py").absolute() not in project.all_files() def test_all_files_hg_ignored(hg_repository): """Given a mercurial repository where some files are ignored, do not yield those files. """ project = Project(hg_repository) assert Path("build/hello.py").absolute() not in project.all_files() def test_all_files_hg_ignored_different_cwd(hg_repository): """Given a mercurial repository where some files are ignored, do not yield those files. Be in a different CWD during the above. """ os.chdir(hg_repository / "LICENSES") project = Project(hg_repository) assert Path("build/hello.py").absolute() not in project.all_files() def test_all_files_hg_ignored_contains_space(hg_repository): """File names that contain spaces are also ignored.""" (hg_repository / "I contain spaces.pyc").touch() project = Project(hg_repository) assert Path("I contain spaces.pyc").absolute() not in project.all_files() @posix def test_all_files_hg_ignored_contains_newline(hg_repository): """File names that contain newlines are also ignored.""" (hg_repository / "hello\nworld.pyc").touch() project = Project(hg_repository) assert Path("hello\nworld.pyc").absolute() not in project.all_files() def test_reuse_info_of_file_does_not_exist(fake_repository): """Raise FileNotFoundError when asking for the REUSE info of a file that does not exist. """ project = Project(fake_repository) with pytest.raises(FileNotFoundError): project.reuse_info_of(fake_repository / "does_not_exist") def test_reuse_info_of_directory(empty_directory): """Raise IsADirectoryError when calling reuse_info_of on a directory.""" (empty_directory / "src").mkdir() project = Project(empty_directory) with pytest.raises((IsADirectoryError, PermissionError)): project.reuse_info_of(empty_directory / "src") def test_reuse_info_of_unlicensed_file(fake_repository): """Return an empty set when asking for the REUSE information of a file that has no REUSE information. """ (fake_repository / "foo.py").write_text("foo") project = Project(fake_repository) assert not bool(project.reuse_info_of("foo.py")) def test_reuse_info_of_only_copyright(fake_repository): """A file contains only a copyright line. Test whether it correctly picks up on that. """ (fake_repository / "foo.py").write_text( "SPDX-FileCopyrightText: 2017 Jane Doe" ) project = Project(fake_repository) reuse_info = project.reuse_info_of("foo.py")[0] assert not any(reuse_info.spdx_expressions) assert len(reuse_info.copyright_lines) == 1 assert ( reuse_info.copyright_lines.pop() == "SPDX-FileCopyrightText: 2017 Jane Doe" ) assert reuse_info.source_type == SourceType.FILE_HEADER assert reuse_info.source_path == "foo.py" 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. """ (fake_repository / "doc/foo.py").write_text( dedent( """ SPDX-License-Identifier: MIT SPDX-FileCopyrightText: in file""" ) ) project = Project(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" assert len(caught_warnings) == 1 assert issubclass( caught_warnings[0].category, PendingDeprecationWarning ) def test_reuse_info_of_no_duplicates(empty_directory): """A file contains the same lines twice. The ReuseInfo only contains those lines once. """ spdx_line = "SPDX-License-Identifier: GPL-3.0-or-later\n" copyright_line = ( "SPDX-FileCopyrightText: 2017 Free Software Foundation Europe\n" ) text = spdx_line + copyright_line (empty_directory / "foo.py").write_text(text * 2) project = Project(empty_directory) reuse_info = project.reuse_info_of("foo.py")[0] assert len(reuse_info.spdx_expressions) == 1 assert LicenseSymbol("GPL-3.0-or-later") in reuse_info.spdx_expressions assert len(reuse_info.copyright_lines) == 1 assert ( "SPDX-FileCopyrightText: 2017 Free Software Foundation Europe" in reuse_info.copyright_lines ) def test_reuse_info_of_binary_succeeds(fake_repository): """reuse_info_of succeeds when the target is covered by dep5.""" shutil.copy( RESOURCES_DIRECTORY / "fsfe.png", fake_repository / "doc/fsfe.png" ) project = Project(fake_repository) 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 assert reuse_info.path == "doc/fsfe.png" def test_license_file_detected(empty_directory): """Test whether---when given a file and a license file---the license file is detected and read. """ (empty_directory / "foo.py").write_text("foo") (empty_directory / "foo.py.license").write_text( "SPDX-FileCopyrightText: 2017 Jane Doe\nSPDX-License-Identifier: MIT\n" ) project = Project(empty_directory) reuse_info = project.reuse_info_of("foo.py")[0] assert "SPDX-FileCopyrightText: 2017 Jane Doe" in reuse_info.copyright_lines assert LicenseSymbol("MIT") in reuse_info.spdx_expressions assert reuse_info.source_type == SourceType.DOT_LICENSE assert reuse_info.path == "foo.py" assert reuse_info.source_path == "foo.py.license" def test_licenses_filename(empty_directory): """Detect the license identifier of a license from its stem.""" (empty_directory / "LICENSES").mkdir() (empty_directory / "LICENSES/foo.txt").write_text("foo") project = Project(empty_directory) assert "foo" in project.licenses def test_licenses_no_extension(empty_directory): """Detect the license identifier of a license from its full name if it is in the license list. """ (empty_directory / "LICENSES").mkdir() (empty_directory / "LICENSES/GPL-3.0-or-later").write_text("foo") (empty_directory / "LICENSES/MIT-3.0-or-later").write_text("foo") project = Project(empty_directory) assert "GPL-3.0-or-later" in project.licenses assert "MIT-3" in project.licenses def test_licenses_subdirectory(empty_directory): """Find a license in a subdirectory of LICENSES/.""" (empty_directory / "LICENSES/sub").mkdir(parents=True) (empty_directory / "LICENSES/sub/MIT.txt").write_text("foo") project = Project(empty_directory) assert "MIT" in project.licenses def test_relative_from_root(empty_directory): """A simple test. Given /path/to/root/src/hello.py, return src/hello.py.""" project = Project(empty_directory) assert project.relative_from_root(project.root / "src/hello.py") == Path( "src/hello.py" ) def test_relative_from_root_no_shared_base_path(empty_directory): """A path can still be relative from root if the paths do not have a common prefix. For instance, if root is /path/to/root and given root/src/hello.py from the directory /path/to, return src/hello.py. This is a bit involved, but works out. """ project = Project(empty_directory) parent = empty_directory.parent os.chdir(parent) assert project.relative_from_root( Path(f"{project.root.name}/src/hello.py") ) == Path("src/hello.py") # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_report.py000066400000000000000000000345201445545121300177060ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: 2022 Florian Snow # SPDX-FileCopyrightText: 2022 Pietro Albini # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.report""" import os import sys from importlib import import_module from textwrap import dedent import pytest 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 def test_generate_file_report_file_simple( fake_repository, add_license_concluded ): """An extremely simple generate test, just to see if the function doesn't crash. """ project = Project(fake_repository) result = FileReport.generate( project, "src/source_code.py", add_license_concluded=add_license_concluded, ) assert result.licenses_in_file == ["GPL-3.0-or-later"] assert ( result.license_concluded == "GPL-3.0-or-later" if add_license_concluded else "NOASSERTION" ) assert result.copyright == "SPDX-FileCopyrightText: 2017 Jane Doe" assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_file_from_different_cwd( fake_repository, add_license_concluded ): """Another simple generate test, but from a different CWD.""" os.chdir("/") project = Project(fake_repository) result = FileReport.generate( project, fake_repository / "src/source_code.py", add_license_concluded=add_license_concluded, ) assert result.licenses_in_file == ["GPL-3.0-or-later"] assert ( result.license_concluded == "GPL-3.0-or-later" if add_license_concluded else "NOASSERTION" ) assert result.copyright == "SPDX-FileCopyrightText: 2017 Jane Doe" assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_file_missing_license( fake_repository, add_license_concluded ): """Simple generate test with a missing license.""" (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: BSD-3-Clause" ) project = Project(fake_repository) result = FileReport.generate( project, "foo.py", add_license_concluded=add_license_concluded ) assert result.copyright == "" assert result.licenses_in_file == ["BSD-3-Clause"] assert ( result.license_concluded == "BSD-3-Clause" if add_license_concluded else "NOASSERTION" ) assert result.missing_licenses == {"BSD-3-Clause"} assert not result.bad_licenses def test_generate_file_report_file_bad_license( fake_repository, add_license_concluded ): """Simple generate test with a bad license.""" (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: fakelicense" ) project = Project(fake_repository) result = FileReport.generate( project, "foo.py", add_license_concluded=add_license_concluded ) assert result.copyright == "" assert result.licenses_in_file == ["fakelicense"] assert ( result.license_concluded == "fakelicense" if add_license_concluded else "NOASSERTION" ) assert result.bad_licenses == {"fakelicense"} assert result.missing_licenses == {"fakelicense"} def test_generate_file_report_license_contains_plus( fake_repository, add_license_concluded ): """Given a license expression akin to Apache-1.0+, LICENSES/Apache-1.0.txt should be an appropriate license file. """ (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: Apache-1.0+" ) (fake_repository / "LICENSES/Apache-1.0.txt").touch() project = Project(fake_repository) result = FileReport.generate( project, "foo.py", add_license_concluded=add_license_concluded ) assert result.copyright == "" assert result.licenses_in_file == ["Apache-1.0+"] assert ( result.license_concluded == "Apache-1.0+" if add_license_concluded else "NOASSERTION" ) assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_exception(fake_repository, add_license_concluded): """Simple generate test to test if the exception is detected.""" project = Project(fake_repository) result = FileReport.generate( project, "src/exception.py", add_license_concluded=add_license_concluded ) assert set(result.licenses_in_file) == { "GPL-3.0-or-later", "Autoconf-exception-3.0", } assert ( result.license_concluded == "GPL-3.0-or-later WITH Autoconf-exception-3.0" if add_license_concluded else "NOASSERTION" ) assert result.copyright == "SPDX-FileCopyrightText: 2017 Jane Doe" assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_no_licenses( fake_repository, add_license_concluded ): """Test behavior when no license information is present in the file""" (fake_repository / "foo.py").write_text("") project = Project(fake_repository) result = FileReport.generate( project, "foo.py", add_license_concluded=add_license_concluded ) assert result.copyright == "" assert not result.licenses_in_file assert ( result.license_concluded == "NONE" if add_license_concluded else "NOASSERTION" ) assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_multiple_licenses( fake_repository, add_license_concluded ): """Test that all licenses are included in LicenseConcluded""" project = Project(fake_repository) result = FileReport.generate( project, "src/multiple_licenses.rs", add_license_concluded=add_license_concluded, ) assert result.copyright == "SPDX-FileCopyrightText: 2022 Jane Doe" assert set(result.licenses_in_file) == { "GPL-3.0-or-later", "Apache-2.0", "CC0-1.0", "Autoconf-exception-3.0", } assert ( result.license_concluded == "GPL-3.0-or-later AND (Apache-2.0 OR CC0-1.0" " WITH Autoconf-exception-3.0)" if add_license_concluded else "NOASSERTION" ) assert not result.bad_licenses assert not result.missing_licenses def test_generate_file_report_to_dict_lint_source_information(fake_repository): """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( dedent( """ SPDX-License-Identifier: MIT OR 0BSD SPDX-FileCopyrightText: in file""" ) ) project = Project(fake_repository) report = FileReport.generate( project, "doc/foo.py", ) result = report.to_dict_lint() assert result["path"] == "doc/foo.py" assert len(result["copyrights"]) == 2 assert ( result["copyrights"][0]["source_type"] != result["copyrights"][1]["source_type"] ) for copyright_ in result["copyrights"]: if copyright_["source_type"] == SourceType.DEP5.value: assert copyright_["source"] == ".reuse/dep5" assert copyright_["value"] == "2017 Jane Doe" elif copyright_["source_type"] == SourceType.FILE_HEADER.value: assert copyright_["source"] == "doc/foo.py" assert copyright_["value"] == "SPDX-FileCopyrightText: in file" assert len(result["spdx_expressions"]) == 2 assert ( result["spdx_expressions"][0]["source_type"] != result["spdx_expressions"][1]["source_type"] ) for expression in result["spdx_expressions"]: if expression["source_type"] == SourceType.DEP5.value: assert expression["source"] == ".reuse/dep5" assert expression["value"] == "CC0-1.0" elif expression["source_type"] == SourceType.FILE_HEADER.value: assert expression["source"] == "doc/foo.py" assert expression["value"] == "MIT OR 0BSD" def test_generate_project_report_simple(fake_repository, multiprocessing): """Simple generate test, just to see if it sort of works.""" project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert not result.bad_licenses assert not result.licenses_without_extension assert not result.missing_licenses assert not result.unused_licenses assert result.used_licenses assert not result.read_errors assert result.file_reports def test_generate_project_report_licenses_without_extension( fake_repository, multiprocessing ): """Licenses without extension are detected.""" (fake_repository / "LICENSES/CC0-1.0.txt").rename( fake_repository / "LICENSES/CC0-1.0" ) project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "CC0-1.0" in result.licenses_without_extension def test_generate_project_report_missing_license( fake_repository, multiprocessing ): """Missing licenses are detected.""" (fake_repository / "LICENSES/GPL-3.0-or-later.txt").unlink() project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "GPL-3.0-or-later" in result.missing_licenses assert not result.bad_licenses def test_generate_project_report_bad_license(fake_repository, multiprocessing): """Bad licenses are detected.""" (fake_repository / "LICENSES/bad.txt").write_text("foo") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert result.bad_licenses assert not result.missing_licenses def test_generate_project_report_unused_license( fake_repository, multiprocessing ): """Unused licenses are detected.""" (fake_repository / "LICENSES/MIT.txt").write_text("foo") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert result.unused_licenses == {"MIT"} def test_generate_project_report_unused_license_plus( fake_repository, multiprocessing ): """Apache-1.0+ is not an unused license if LICENSES/Apache-1.0.txt exists. Furthermore, Apache-1.0+ is separately identified as a used license. """ (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: Apache-1.0+" ) (fake_repository / "bar.py").write_text( "SPDX-License-Identifier: Apache-1.0" ) (fake_repository / "LICENSES/Apache-1.0.txt").touch() project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert not result.unused_licenses assert {"Apache-1.0", "Apache-1.0+"}.issubset(result.used_licenses) def test_generate_project_report_unused_license_plus_only_plus( fake_repository, multiprocessing ): """If Apache-1.0+ is the only declared license in the project, LICENSES/Apache-1.0.txt should not be an unused license. """ (fake_repository / "foo.py").write_text( "SPDX-License-Identifier: Apache-1.0+" ) (fake_repository / "LICENSES/Apache-1.0.txt").touch() project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert not result.unused_licenses assert "Apache-1.0+" in result.used_licenses assert "Apache-1.0" not in result.used_licenses def test_generate_project_report_bad_license_in_file( fake_repository, multiprocessing ): """Bad licenses in files are detected.""" (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "bad" in result.bad_licenses def test_generate_project_report_bad_license_can_also_be_missing( fake_repository, multiprocessing ): """Bad licenses can also be missing licenses.""" (fake_repository / "foo.py").write_text("SPDX-License-Identifier: bad") project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "bad" in result.bad_licenses assert "bad" in result.missing_licenses def test_generate_project_report_deprecated_license( fake_repository, multiprocessing ): """Deprecated licenses are detected.""" (fake_repository / "LICENSES/GPL-3.0-or-later.txt").rename( fake_repository / "LICENSES/GPL-3.0.txt" ) project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) assert "GPL-3.0" in result.deprecated_licenses @cpython @posix def test_generate_project_report_read_error(fake_repository, multiprocessing): """Files that cannot be read are added to the read error list.""" (fake_repository / "bad").write_text("foo") (fake_repository / "bad").chmod(0o000) project = Project(fake_repository) result = ProjectReport.generate(project, multiprocessing=multiprocessing) # pylint: disable=superfluous-parens assert (fake_repository / "bad") in result.read_errors def test_generate_project_report_to_dict_lint(fake_repository, multiprocessing): """Generate dictionary output and verify correct ordering.""" project = Project(fake_repository) report = ProjectReport.generate(project, multiprocessing=multiprocessing) result = report.to_dict_lint() # Check if the top three keys are at the beginning of the dictionary assert list(result.keys())[:3] == [ "lint_version", "reuse_spec_version", "reuse_tool_version", ] # Check if the rest of the keys are sorted alphabetically assert list(result.keys())[3:] == sorted(list(result.keys())[3:]) def test_bill_of_materials(fake_repository, multiprocessing): """Generate a bill of materials.""" project = Project(fake_repository) report = ProjectReport.generate(project, multiprocessing=multiprocessing) # TODO: Actually do something report.bill_of_materials() # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_util.py000066400000000000000000000472001445545121300173470ustar00rootroot00000000000000# 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 Pietro Albini # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse._util""" # pylint: disable=protected-access,invalid-name import os from argparse import ArgumentTypeError from inspect import cleandoc from io import BytesIO from pathlib import Path import pytest from boolean.boolean import ParseError from license_expression import LicenseSymbol 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") # REUSE-IgnoreStart def test_extract_expression(): """Parse various expressions.""" expressions = ["GPL-3.0+", "GPL-3.0 AND CC0-1.0", "nonsense"] for expression in expressions: result = _util.extract_reuse_info( f"SPDX-License-Identifier: {expression}" ) assert result.spdx_expressions == {_LICENSING.parse(expression)} def test_extract_expression_from_ascii_art_frame(): """Parse an expression from an ASCII art frame""" result = _util.extract_reuse_info( cleandoc( """ /**********************************\\ |* SPDX-License-Identifier: MIT *| \\**********************************/ """ ) ) assert result.spdx_expressions == {_LICENSING.parse("MIT")} def test_extract_erroneous_expression(): """Parse an incorrect expression.""" expression = "SPDX-License-Identifier: GPL-3.0-or-later AND (MIT OR)" with pytest.raises(ParseError): _util.extract_reuse_info(expression) def test_extract_no_info(): """Given a string without REUSE information, return an empty ReuseInfo object. """ result = _util.extract_reuse_info("") assert result == _util.ReuseInfo() def test_extract_tab(): """A tag followed by a tab is also valid.""" result = _util.extract_reuse_info("SPDX-License-Identifier:\tMIT") assert result.spdx_expressions == {_LICENSING.parse("MIT")} def test_extract_many_whitespace(): """When a tag is followed by a lot of whitespace, the whitespace should be filtered out. """ result = _util.extract_reuse_info("SPDX-License-Identifier: MIT") assert result.spdx_expressions == {_LICENSING.parse("MIT")} def test_extract_bibtex_comment(): """A special case for BibTex comments.""" expression = "@Comment{SPDX-License-Identifier: GPL-3.0-or-later}" result = _util.extract_reuse_info(expression) assert str(list(result.spdx_expressions)[0]) == "GPL-3.0-or-later" def test_extract_copyright(): """Given a file with copyright information, have it return that copyright information. """ copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" result = _util.extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} def test_extract_copyright_duplicate(): """When a copyright line is duplicated, only yield one.""" copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" result = _util.extract_reuse_info( "\n".join((copyright_line, copyright_line)) ) assert result.copyright_lines == {copyright_line} def test_extract_copyright_tab(): """A tag followed by a tab is also valid.""" copyright_line = "SPDX-FileCopyrightText:\t2019 Jane Doe" result = _util.extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} def test_extract_copyright_many_whitespace(): """When a tag is followed by a lot of whitespace, that is also valid. The whitespace is not filtered out. """ copyright_line = "SPDX-FileCopyrightText: 2019 Jane Doe" result = _util.extract_reuse_info(copyright_line) assert result.copyright_lines == {copyright_line} def test_extract_copyright_variations(): """There are multiple ways to declare copyright. All should be detected.""" text = cleandoc( """ SPDX-FileCopyrightText: 2019 Jane Doe SPDX-FileCopyrightText: © 2019 Jane Doe © 2019 Jane Doe Copyright © 2019 Jane Doe Copyright 2019 Jane Doe Copyright (C) 2019 Jane Doe """ ) result = _util.extract_reuse_info(text) lines = text.splitlines() for line in lines: assert line in result.copyright_lines assert len(lines) == len(result.copyright_lines) def test_extract_with_ignore_block(): """Ensure that the copyright and licensing information inside the ignore block is actually ignored. """ text = cleandoc( """ SPDX-FileCopyrightText: 2019 Jane Doe SPDX-License-Identifier: CC0-1.0 REUSE-IgnoreStart SPDX-FileCopyrightText: 2019 John Doe SPDX-License-Identifier: GPL-3.0-or-later REUSE-IgnoreEnd SPDX-FileCopyrightText: 2019 Eve """ ) result = _util.extract_reuse_info(text) assert len(result.copyright_lines) == 2 assert len(result.spdx_expressions) == 1 def test_extract_sameline_multiline(): """When a copyright line is in a multi-line style comment on a single line, do not include the comment end pattern as part of the copyright. """ text = "" result = _util.extract_reuse_info(text) assert len(result.copyright_lines) == 1 assert result.copyright_lines == {"SPDX-FileCopyrightText: Jane Doe"} def test_extract_special_endings(): """Strip some non-comment-style endings from the end of copyright and licensing information. """ text = cleandoc( """ [Copyright 2019 Ajnulo] :: """ ) result = _util.extract_reuse_info(text) for item in result.copyright_lines: assert ">" not in item assert "] ::" not in item def test_extract_contributors(): """Correctly extract SPDX-FileContributor information from text.""" text = cleandoc( """ # SPDX-FileContributor: Jane Doe """ ) result = _util.extract_reuse_info(text) assert result.contributor_lines == {"Jane Doe"} def test_filter_ignore_block_with_comment_style(): """Test that the ignore block is properly removed if start and end markers are in comment style. """ text = cleandoc( """ Relevant text # REUSE-IgnoreStart Ignored text # REUSE-IgnoreEnd Other relevant text """ ) expected = "Relevant text\n# \nOther relevant text" result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_non_comment_style(): """Test that the ignore block is properly removed if start and end markers are not comment style. """ text = cleandoc( """ Relevant text REUSE-IgnoreStart Ignored text REUSE-IgnoreEnd Other relevant text """ ) expected = cleandoc( """ Relevant text Other relevant text """ ) result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_with_ignored_information_on_same_line(): """Test that the ignore block is properly removed if there is information to be ignored on the same line. """ text = cleandoc( """ Relevant text REUSE-IgnoreStart Copyright me Ignored text sdojfsdREUSE-IgnoreEnd Other relevant text """ ) expected = cleandoc( """ Relevant text Other relevant text """ ) result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_with_relevant_information_on_same_line(): """Test that the ignore block is properly removed if it has relevant information on the same line. """ text = cleandoc( """ Relevant textREUSE-IgnoreStart Ignored text REUSE-IgnoreEndOther relevant text """ ) expected = "Relevant textOther relevant text" result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_with_beginning_and_end_on_same_line_correct_order(): # pylint: disable=line-too-long """Test that the ignore block is properly removed if it has relevant information on the same line. """ text = cleandoc( """ Relevant textREUSE-IgnoreStartIgnored textREUSE-IgnoreEndOther relevant text """ ) expected = cleandoc( """ Relevant textOther relevant text """ ) result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_with_beginning_and_end_on_same_line_wrong_order(): """Test that the ignore block is properly removed if it has relevant information on the same line. """ text = "Relevant textREUSE-IgnoreEndOther relevant textREUSE-IgnoreStartIgnored text" # pylint: disable=line-too-long expected = "Relevant textREUSE-IgnoreEndOther relevant text" result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_without_end(): """Test that the ignore block is properly removed if it has relevant information on the same line. """ text = cleandoc( """ Relevant text REUSE-IgnoreStart Ignored text Other ignored text """ ) expected = "Relevant text\n" result = _util.filter_ignore_block(text) assert result == expected def test_filter_ignore_block_with_multiple_ignore_blocks(): """Test that the ignore block is properly removed if it has relevant information on the same line. """ text = cleandoc( """ Relevant text REUSE-IgnoreStart Ignored text REUSE-IgnoreEnd Other relevant text REUSE-IgnoreStart Other ignored text REUSE-IgnoreEnd Even more relevant text """ ) expected = cleandoc( """ Relevant text Other relevant text Even more relevant text """ ) result = _util.filter_ignore_block(text) assert result == expected 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" def test_make_copyright_line_year(): """Given a simple statement and a year, make it a copyright line.""" assert ( _util.make_copyright_line("hello", year="2019") == "SPDX-FileCopyrightText: 2019 hello" ) 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") 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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="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.""" statement = _util.make_copyright_line( "hello", year=2019, copyright_style="symbol" ) assert statement == "© 2019 hello" def test_make_copyright_line_existing_spdx_copyright(): """Given a copyright line, do nothing.""" value = "SPDX-FileCopyrightText: hello" assert _util.make_copyright_line(value) == value def test_make_copyright_line_existing_other_copyright(): """Given a non-SPDX copyright line, do nothing.""" value = "© hello" assert _util.make_copyright_line(value) == value def test_make_copyright_line_multine_error(): """Given a multiline argument, expect an error.""" with pytest.raises(RuntimeError): _util.make_copyright_line("hello\nworld") # pylint: disable=unused-argument def test_pathtype_read_simple(fake_repository): """Get a Path to a readable file.""" result = _util.PathType("r")("src/source_code.py") assert result == Path("src/source_code.py") def test_pathtype_read_directory(fake_repository): """Get a Path to a readable directory.""" result = _util.PathType("r")("src") assert result == Path("src") def test_pathtype_read_directory_force_file(fake_repository): """Cannot read a directory when a file is forced.""" with pytest.raises(ArgumentTypeError): _util.PathType("r", force_file=True)("src") @no_root @posix def test_pathtype_read_not_readable(fake_repository): """Cannot read a nonreadable file.""" try: os.chmod("src/source_code.py", 0o000) with pytest.raises(ArgumentTypeError): _util.PathType("r")("src/source_code.py") finally: os.chmod("src/source_code.py", 0o777) def test_pathtype_read_not_exists(empty_directory): """Cannot read a file that does not exist.""" with pytest.raises(ArgumentTypeError): _util.PathType("r")("foo.py") def test_pathtype_read_write_not_exists(empty_directory): """Cannot read/write a file that does not exist.""" with pytest.raises(ArgumentTypeError): _util.PathType("r+")("foo.py") @no_root @posix def test_pathtype_read_write_only_write(empty_directory): """A write-only file loaded with read/write needs both permissions.""" path = Path("foo.py") path.touch() try: path.chmod(0o222) with pytest.raises(ArgumentTypeError): _util.PathType("r+")("foo.py") finally: path.chmod(0o777) @no_root @posix def test_pathtype_read_write_only_read(empty_directory): """A read-only file loaded with read/write needs both permissions.""" path = Path("foo.py") path.touch() try: path.chmod(0o444) with pytest.raises(ArgumentTypeError): _util.PathType("r+")("foo.py") finally: path.chmod(0o777) def test_pathtype_write_not_exists(empty_directory): """Get a Path for a file that does not exist.""" result = _util.PathType("w")("foo.py") assert result == Path("foo.py") def test_pathtype_write_exists(fake_repository): """Get a Path for a file that exists.""" result = _util.PathType("w")("src/source_code.py") assert result == Path("src/source_code.py") def test_pathtype_write_directory(fake_repository): """Cannot write to directory.""" with pytest.raises(ArgumentTypeError): _util.PathType("w")("src") @no_root @posix def test_pathtype_write_exists_but_not_writeable(fake_repository): """Cannot get Path of file that exists but isn't writeable.""" os.chmod("src/source_code.py", 0o000) with pytest.raises(ArgumentTypeError): _util.PathType("w")("src/source_code.py") os.chmod("src/source_code.py", 0o777) @no_root @posix def test_pathtype_write_not_exist_but_directory_not_writeable(fake_repository): """Cannot get Path of file that does not exist but directory isn't writeable. """ os.chmod("src", 0o000) with pytest.raises(ArgumentTypeError): _util.PathType("w")("src/foo.py") os.chmod("src", 0o777) def test_pathtype_invalid_mode(empty_directory): """Only valid modes are 'r' and 'w'.""" with pytest.raises(ValueError): _util.PathType("o") def test_decoded_text_from_binary_simple(): """A unicode string encoded as bytes object decodes back correctly.""" text = "Hello, world ☺" encoded = text.encode("utf-8") assert _util.decoded_text_from_binary(BytesIO(encoded)) == text def test_decoded_text_from_binary_size(): """Only a given amount of bytes is decoded.""" text = "Hello, world ☺" encoded = text.encode("utf-8") assert _util.decoded_text_from_binary(BytesIO(encoded), size=5) == "Hello" def test_decoded_text_from_binary_crlf(): """Given CRLF line endings, convert to LF.""" text = "Hello\r\nworld" encoded = text.encode("utf-8") assert _util.decoded_text_from_binary(BytesIO(encoded)) == "Hello\nworld" def test_similar_spdx_identifiers_typo(): """Given a misspelt SPDX License Identifier, suggest a better one.""" result = _util.similar_spdx_identifiers("GPL-3.0-or-lter") assert "GPL-3.0-or-later" in result assert "AGPL-3.0-or-later" in result assert "LGPL-3.0-or-later" in result def test_similar_spdx_identifiers_prefix(): """Given an incomplete SPDX License Identifier, suggest a better one.""" result = _util.similar_spdx_identifiers("CC0") assert "CC0-1.0" in result def test_detect_line_endings_windows(): """Given a CRLF string, detect the line endings.""" assert _util.detect_line_endings("hello\r\nworld") == "\r\n" def test_detect_line_endings_mac(): """Given a CR string, detect the line endings.""" assert _util.detect_line_endings("hello\rworld") == "\r" def test_detect_line_endings_linux(): """Given a LF string, detect the line endings.""" assert _util.detect_line_endings("hello\nworld") == "\n" def test_detect_line_endings_no_newlines(): """Given a file without line endings, default to os.linesep.""" assert _util.detect_line_endings("hello world") == os.linesep # REUSE-IgnoreEnd reuse-tool-2.1.0/tests/test_vcs.py000066400000000000000000000016041445545121300171630ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2017 Free Software Foundation Europe e.V. # SPDX-FileCopyrightText: © 2020 Liferay, Inc. # SPDX-FileCopyrightText: 2022 Florian Snow # # SPDX-License-Identifier: GPL-3.0-or-later """Tests for reuse.vcs""" import os from pathlib import Path from reuse import vcs def test_find_root_in_git_repo(git_repository): """When using reuse from a child directory in a Git repo, always find the root directory. """ os.chdir("src") result = vcs.find_root() assert Path(result).absolute().resolve() == git_repository def test_find_root_in_hg_repo(hg_repository): """When using reuse from a child directory in a Mercurial repo, always find the root directory. """ os.chdir("src") result = vcs.find_root() assert Path(result).absolute().resolve() == hg_repository