diff --git a/flake.lock b/flake.lock index 50b7df5..35dbd76 100644 --- a/flake.lock +++ b/flake.lock @@ -1,20 +1,5 @@ { "nodes": { - "flake-utils": { - "locked": { - "lastModified": 1610051610, - "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1629618782, @@ -30,44 +15,9 @@ "type": "indirect" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1610729867, - "narHash": "sha256-bk/SBaBLqZX/PEqal27DMQwAHHl0dcZMp8NNksQr80s=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "04af07c659c6723a2259bb6bc00a47ec53330f20", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "poetry2nix": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1629413283, - "narHash": "sha256-DeyaGvtO/Nureis423Vu4s/X7r0I/h6/ELJLr0sHy2w=", - "owner": "nix-community", - "repo": "poetry2nix", - "rev": "f0ef3fee8053eb32207761d6d708e217e2aa3d02", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "poetry2nix", - "type": "github" - } - }, "root": { "inputs": { - "nixpkgs": "nixpkgs", - "poetry2nix": "poetry2nix" + "nixpkgs": "nixpkgs" } } }, diff --git a/flake.nix b/flake.nix index 3e88268..813b7cc 100644 --- a/flake.nix +++ b/flake.nix @@ -3,10 +3,9 @@ inputs = { nixpkgs = { url = "nixpkgs/nixos-unstable"; }; - poetry2nix = { url = "github:nix-community/poetry2nix"; }; }; - outputs = { self, nixpkgs, poetry2nix }: + outputs = { self, nixpkgs }: let systems = [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" ]; forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system); @@ -14,13 +13,12 @@ let pkgs = import nixpkgs { inherit system; - overlays = [ poetry2nix.overlay ]; + overlays = [ ]; }; in import path { inherit pkgs; }; packages = system: { - import_scripts = mkPackage ./import-scripts system; flake_info = mkPackage ./flake-info system; frontend = mkPackage ./. system; }; @@ -28,10 +26,6 @@ devShell = system: nixpkgs.legacyPackages.${system}.mkShell { inputsFrom = builtins.attrValues (packages system); - shellHook = '' - # undo import_scripts' shell hook - cd .. - ''; }; in { diff --git a/import-scripts/default.nix b/import-scripts/default.nix deleted file mode 100644 index 84c6df9..0000000 --- a/import-scripts/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ pkgs ? import { } -, version ? pkgs.lib.removeSuffix "\n" (builtins.readFile ./../VERSION) -}: -let - inherit (pkgs.poetry2nix) mkPoetryApplication overrides; -in -mkPoetryApplication { - projectDir = ./.; - overrides = overrides.withDefaults (self: super: { - pypandoc = super.pypandoc.overridePythonAttrs (old: { - postPatch = '' - sed -i '/^__pandoc_path = None$/c__pandoc_path = "${pkgs.pandoc}/bin/pandoc"' pypandoc/__init__.py - ''; - }); - }); - preferLocalBuild = true; - nativeBuildInputs = with pkgs; [ - poetry - fd - entr - nixStable - ]; - checkPhase = '' - export PYTHONPATH=$PWD:$PYTHONPATH - black --diff --check import_scripts/ tests/ - flake8 --ignore W503,E501,E265,E203 import_scripts/ tests/ - mypy import_scripts/ tests/ - pytest -vv tests/ - ''; - postInstall = '' - wrapProgram $out/bin/import-channel \ - --set INDEX_SCHEMA_VERSION "${version}" \ - --prefix PATH : "${pkgs.nixStable}/bin" - wrapProgram $out/bin/channel-diff \ - --set INDEX_SCHEMA_VERSION "${version}" \ - --prefix PATH : "${pkgs.nixStable}/bin" - - ''; - shellHook = '' - cd import-scripts/ - export PYTHONPATH=$PWD:$PYTHONPATH - ''; -} diff --git a/import-scripts/import_scripts/__init__.py b/import-scripts/import_scripts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/import-scripts/import_scripts/channel.py b/import-scripts/import_scripts/channel.py deleted file mode 100644 index fe18b3e..0000000 --- a/import-scripts/import_scripts/channel.py +++ /dev/null @@ -1,776 +0,0 @@ -import backoff # type: ignore -import boto3 # type: ignore -import botocore # type: ignore -import botocore.client # type: ignore -import botocore.exceptions # type: ignore -import click -import click_log # type: ignore -import dictdiffer # type: ignore -import elasticsearch # type: ignore -import elasticsearch.helpers # type: ignore -import import_scripts.nix # type: ignore -import json -import logging -import os -import os.path -import pypandoc # type: ignore -import re -import requests -import requests.exceptions -import shlex -import subprocess -import sys -import tqdm # type: ignore -import xml.etree.ElementTree - -logger = logging.getLogger("import-channel") -click_log.basic_config(logger) - - -S3_BUCKET = "nix-releases" -CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) -INDEX_SCHEMA_VERSION = os.environ.get("INDEX_SCHEMA_VERSION", 0) -DIFF_OUTPUT = ["json", "stats"] -CHANNELS = { - "unstable": "nixos/unstable/nixos-21.11pre", - "21.05": "nixos/21.05/nixos-21.05.", - "20.09": "nixos/20.09/nixos-20.09.", -} -ALLOWED_PLATFORMS = ["x86_64-linux", "aarch64-linux", "x86_64-darwin", "i686-linux"] -ANALYSIS = { - "normalizer": { - "lowercase": {"type": "custom", "char_filter": [], "filter": ["lowercase"]} - }, - "tokenizer": { - "edge": { - "type": "edge_ngram", - "min_gram": 2, - "max_gram": 50, - "token_chars": [ - "letter", - "digit", - # Either we use them or we would need to strip them before that. - "punctuation", - "symbol", - ], - }, - }, - "analyzer": { - "edge": {"tokenizer": "edge", "filter": ["lowercase"]}, - "lowercase": { - "type": "custom", - "tokenizer": "keyword", - "filter": ["lowercase"], - }, - }, -} -MAPPING = { - "properties": { - "type": {"type": "keyword"}, - # Package fields - "package_hydra_build": { - "type": "nested", - "properties": { - "build_id": {"type": "keyword"}, - "build_status": {"type": "keyword"}, - "platform": {"type": "keyword"}, - "project": {"type": "keyword"}, - "jobset": {"type": "keyword"}, - "job": {"type": "keyword"}, - "path": { - "type": "nested", - "properties": { - "output": {"type": "keyword"}, - "path": {"type": "keyword"}, - }, - }, - "drv_path": {"type": "keyword"}, - }, - }, - "package_attr_name": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_attr_name_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_attr_name_query": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_attr_name_query_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_attr_set": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_attr_set_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_pname": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_pname_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_pversion": {"type": "keyword"}, - "package_description": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_description_reverse": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_longDescription": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_longDescription_reverse": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "package_license": { - "type": "nested", - "properties": {"fullName": {"type": "text"}, "url": {"type": "text"}}, - }, - "package_license_set": {"type": "keyword"}, - "package_maintainers": { - "type": "nested", - "properties": { - "name": {"type": "text"}, - "email": {"type": "text"}, - "github": {"type": "text"}, - }, - }, - "package_maintainers_set": {"type": "keyword"}, - "package_platforms": {"type": "keyword"}, - "package_position": {"type": "text"}, - "package_homepage": {"type": "keyword"}, - "package_system": {"type": "keyword"}, - # Options fields - "option_name": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_name_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_name_query": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_name_query_reverse": { - "type": "keyword", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_description": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_description_reverse": { - "type": "text", - "analyzer": "english", - "fields": {"edge": {"type": "text", "analyzer": "edge"}}, - }, - "option_type": {"type": "keyword"}, - "option_default": {"type": "text"}, - "option_example": {"type": "text"}, - "option_source": {"type": "keyword"}, - }, -} - - -def string_reverse(text): - return text[::-1] - - -def field_reverse(field): - - if isinstance(field, str): - - if " " in field: - field = " ".join(map(field_reverse, field.split(" "))) - else: - field = string_reverse(field) - - elif isinstance(field, list): - field = list(map(field_reverse, field)) - - elif isinstance(field, tuple): - field = tuple(map(field_reverse, field)) - - elif field is None: - pass - - else: - raise NotImplementedError(f"Don't know how to reverse {field}") - - return field - - -def parse_query(text): - """Tokenize package attr_name - - Example package: - - python37Packages.test_name-test - = index: 0 - - python37Packages.test1_name-test2 - - python37Packages.test1_name - - python37Packages.test1 - - python37 - - python - = index: 1 - - test1_name-test2 - - test1_name - - test1 - = index: 2 - - name-test2 - - name - = index: 3 - - test2 - """ - tokens = [] - regex = re.compile( - ".+?(?:(?<=[a-z])(?=[1-9A-Z])|(?<=[1-9A-Z])(?=[A-Z][a-z])|[._-]|$)" - ) - parts = [m.group(0) for m in regex.finditer(text)] - for index in range(len(parts)): - prev_parts = "" - for part in parts[index:]: - tokens.append((prev_parts + part).rstrip("_.-")) - prev_parts += part - return tokens - - -@backoff.on_exception(backoff.expo, botocore.exceptions.ClientError) -def get_last_evaluation(prefix): - logger.debug(f"Retrieving last evaluation for {prefix} prefix.") - - s3 = boto3.client( - "s3", config=botocore.client.Config(signature_version=botocore.UNSIGNED) - ) - s3_result = s3.list_objects(Bucket=S3_BUCKET, Prefix=prefix, Delimiter="/",) - evaluations = [] - for item in s3_result.get("CommonPrefixes"): - if not item: - continue - logger.debug(f"get_last_evaluation: evaluation in raw {item}") - revisions_since_start, git_revision = ( - item["Prefix"][len(prefix) :].rstrip("/").split(".") - ) - evaluation = { - "revisions_since_start": int(revisions_since_start), - "git_revision": git_revision, - "prefix": item["Prefix"].rstrip("/"), - } - logger.debug(f"get_last_evaluation: evaluation {evaluation}") - evaluations.append(evaluation) - - logger.debug( - f"get_last_evaluation: {len(evaluations)} evaluations found for {prefix} prefix" - ) - evaluations = sorted(evaluations, key=lambda i: i["revisions_since_start"]) - - evaluation = evaluations[-1] - - result = s3.get_object(Bucket=S3_BUCKET, Key=f"{evaluation['prefix']}/src-url") - evaluation["id"] = ( - result.get("Body").read().decode()[len("https://hydra.nixos.org/eval/") :] - ) - - logger.debug(f"get_last_evaluation: last evaluation is: {evaluation}") - - return evaluation - - -@backoff.on_exception(backoff.expo, requests.exceptions.RequestException) -def get_evaluation_builds(evaluation_id): - logger.debug( - f"get_evaluation_builds: Retrieving list of builds for {evaluation_id} evaluation id" - ) - filename = f"eval-{evaluation_id}.json" - if not os.path.exists(filename): - url = f"https://hydra.nixos.org/eval/{evaluation_id}/builds" - logger.debug(f"get_evaluation_builds: Fetching builds from {url} url.") - headers = {"Content-Type": "application/json"} - r = requests.get(url, headers=headers, stream=True) - with tqdm.tqdm.wrapattr( - open(filename, "wb"), - "write", - miniters=1, - total=int(r.headers.get("content-length", 0)), - desc=filename, - ) as f: - for chunk in r.iter_content(chunk_size=4096): - f.write(chunk) - - with open(filename) as f: - builds = json.loads(f.read()) - - result = {} - for build in builds: - result.setdefault(build["nixname"], {}) - result[build["nixname"]][build["system"]] = build - - return result - - -def get_maintainer(maintainer): - maintainers = [] - - if type(maintainer) == str: - maintainers.append(dict(name=maintainer, email=None, github=None,)) - - elif type(maintainer) == dict: - maintainers.append( - dict( - name=maintainer.get("name"), - email=maintainer.get("email"), - github=maintainer.get("github"), - ) - ) - - elif type(maintainer) == list: - for item in maintainer: - maintainers += get_maintainer(item) - - else: - logger.error(f"maintainer can not be recognized from: {maintainer}") - sys.exit(1) - - return maintainers - - -def remove_attr_set(name): - # some package sets the prefix is included in pname - sets = [ - # Packages - "emscripten", - "lua", - "php", - "pure", - "python", - "lisp", - "perl", - "ruby", - # Plugins - "elasticsearch", - "graylog", - "tmuxplugin", - "vimplugin", - ] - # TODO: is this correct - if any([name.startswith(i) for i in sets]): - name = "-".join(name.split("-")[1:]) - - # node does things a bit different - elif name.startswith("node_"): - name = name[len("node_") :] - - return name - - -@backoff.on_exception(backoff.expo, subprocess.CalledProcessError) -def get_packages_raw(evaluation): - logger.debug( - f"get_packages_raw: Retrieving list of packages for '{evaluation['git_revision']}' revision" - ) - result = subprocess.run( - shlex.split( - f"nix-env -f '' -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/{evaluation['git_revision']}.tar.gz --arg config 'import {CURRENT_DIR}/packages-config.nix' -qa --json" - ), - stdout=subprocess.PIPE, - check=True, - ) - packages = json.loads(result.stdout).items() - return list(packages) - - -def get_packages(evaluation, evaluation_builds): - packages = list(get_packages_raw(evaluation)) - - def gen(): - for attr_name, data in packages: - licenses = data["meta"].get("license") - if licenses: - if type(licenses) == str: - licenses = [dict(fullName=licenses, url=None)] - elif type(licenses) == dict: - licenses = [licenses] - licenses = [ - type(license) == str - and dict(fullName=license, url=None) - or dict(fullName=license.get("fullName"), url=license.get("url"),) - for license in licenses - ] - else: - licenses = [dict(fullName="No license", url=None)] - - maintainers = get_maintainer(data["meta"].get("maintainers", [])) - if len(maintainers) == 0: - maintainers = [dict(name="No maintainers", email=None, github=None)] - - platforms = [ - platform - for platform in data["meta"].get("platforms", []) - if type(platform) == str and platform in ALLOWED_PLATFORMS - ] - - attr_set = "No package set" - if "." in attr_name: - maybe_attr_set = attr_name.split(".")[0] - if ( - maybe_attr_set.endswith("Packages") - or maybe_attr_set.endswith("Plugins") - or maybe_attr_set.endswith("Extensions") - ): - attr_set = maybe_attr_set - - hydra = None - if data["name"] in evaluation_builds: - hydra = [] - for platform, build in evaluation_builds[data["name"]].items(): - hydra.append( - { - "build_id": build["id"], - "build_status": build["buildstatus"], - "platform": build["system"], - "project": build["project"], - "jobset": build["jobset"], - "job": build["job"], - "path": [ - {"output": output, "path": item["path"]} - for output, item in build["buildoutputs"].items() - ], - "drv_path": build["drvpath"], - } - ) - - position = data["meta"].get("position") - if position and position.startswith("/nix/store"): - position = position.split("/", 4)[-1] - - package_attr_name_query = list(parse_query(attr_name)) - package_pname = remove_attr_set(data["pname"]) - package_description = data["meta"].get("description") - package_longDescription = data["meta"].get("longDescription", "") - - yield dict( - type="package", - package_hydra=hydra, - package_attr_name=attr_name, - package_attr_name_reverse=field_reverse(attr_name), - package_attr_name_query=package_attr_name_query, - package_attr_name_query_reverse=field_reverse(package_attr_name_query), - package_attr_set=attr_set, - package_attr_set_reverse=field_reverse(attr_set), - package_pname=package_pname, - package_pname_reverse=field_reverse(package_pname), - package_pversion=data["version"], - package_description=package_description, - package_description_reverse=field_reverse(package_description), - package_longDescription=package_longDescription, - package_longDescription_reverse=field_reverse(package_longDescription), - package_license=licenses, - package_license_set=[i["fullName"] for i in licenses], - package_maintainers=maintainers, - package_maintainers_set=[i["name"] for i in maintainers if i["name"]], - package_platforms=platforms, - package_position=position, - package_homepage=data["meta"].get("homepage"), - package_system=data["system"], - ) - - logger.debug(f"get_packages: Found {len(packages)} packages") - return len(packages), gen - - -@backoff.on_exception(backoff.expo, subprocess.CalledProcessError) -def get_options_raw(evaluation): - logger.debug( - f"get_options: Retrieving list of options for '{evaluation['git_revision']}' revision" - ) - result = subprocess.run( - shlex.split( - f"nix-build --no-out-link -A options -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/{evaluation['git_revision']}.tar.gz" - ), - stdout=subprocess.PIPE, - check=True, - ) - options = [] - options_file = result.stdout.strip().decode() - options_file = f"{options_file}/share/doc/nixos/options.json" - if os.path.exists(options_file): - with open(options_file) as f: - options = json.load(f).items() - return list(options) - - -def get_options(evaluation): - options = get_options_raw(evaluation) - - def gen(): - for name, option in options: - if "default" in option: - default = import_scripts.nix.prettyPrint(option.get("default")) - else: - default = None - - if "example" in option: - example = import_scripts.nix.prettyPrint(option.get("example")) - else: - example = None - - description = option.get("description") - if description is not None: - xml_description = ( - f'' - f"{description}" - f"" - ) - # we first check if there are some xml elements before using pypandoc - # since pypandoc calls are quite slow - root = xml.etree.ElementTree.fromstring(xml_description) - if len(list(root.find("para"))) > 0: - description = pypandoc.convert_text( - xml_description, "html", format="docbook", - ) - - option_name_query = parse_query(name) - - declarations = option.get("declarations", []) - option_source = declarations[0] if declarations else None - - yield dict( - type="option", - option_name=name, - option_name_reverse=field_reverse(name), - option_name_query=option_name_query, - option_name_query_reverse=field_reverse(option_name_query), - option_description=description, - option_description_reverse=field_reverse(description), - option_type=option.get("type"), - option_default=default, - option_example=example, - option_source=option_source, - ) - - return len(options), gen - - -def ensure_index(es, index, mapping, force=False): - if es.indices.exists(index): - logger.debug(f"ensure_index: index '{index}' already exists") - if not force: - return False - - logger.debug(f"ensure_index: Deleting index '{index}'") - es.indices.delete(index) - - es.indices.create( - index=index, - body={ - "settings": {"number_of_shards": 1, "analysis": ANALYSIS}, - "mappings": mapping, - }, - ) - logger.debug(f"ensure_index: index '{index}' was created") - - return True - - -def create_index_name(channel, evaluation): - evaluation_name = "-".join( - [ - evaluation["id"], - str(evaluation["revisions_since_start"]), - evaluation["git_revision"], - evaluation["id"], - str(evaluation["revisions_since_start"]), - evaluation["git_revision"], - ] - ) - return ( - f"latest-{INDEX_SCHEMA_VERSION}-{channel}", - f"evaluation-{INDEX_SCHEMA_VERSION}-{channel}-{evaluation_name}", - ) - - -def update_alias(es, name, index): - if es.indices.exists_alias(name=name): - indexes = set(es.indices.get_alias(name=name).keys()) - - # indexes to remove from alias - actions = [ - {"remove": {"index": item, "alias": name}} - for item in indexes.difference(set([index])) - ] - - # add index if does not exists in alias - if index not in indexes: - actions.append({"add": {"index": index, "alias": name}}) - - if actions: - es.indices.update_aliases({"actions": actions}) - else: - es.indices.put_alias(index=index, name=name) - - indexes = ", ".join(es.indices.get_alias(name=name).keys()) - logger.debug(f"'{name}' alias now points to '{indexes}' index") - - -def write(unit, es, index_name, number_of_items, item_generator): - if number_of_items: - click.echo(f"Indexing {unit}...") - progress = tqdm.tqdm(unit=unit, total=number_of_items) - successes = 0 - for ok, action in elasticsearch.helpers.streaming_bulk( - client=es, index=index_name, actions=item_generator() - ): - progress.update(1) - successes += ok - click.echo(f"Indexed {successes}/{number_of_items} {unit}") - - -def setup_logging(verbose): - logging_level = "CRITICAL" - if verbose == 1: - logging_level = "WARNING" - elif verbose >= 2: - logging_level = "DEBUG" - - logger.setLevel(getattr(logging, logging_level)) - logger.debug(f"Verbosity is {verbose}") - logger.debug(f"Logging set to {logging_level}") - - -@click.command() -@click.option("-u", "--es-url", help="Elasticsearch connection url.") -@click.option("-c", "--channel", type=click.Choice(CHANNELS.keys()), help="Channel.") -@click.option("-f", "--force", is_flag=True, help="Force channel recreation.") -@click.option("-v", "--verbose", count=True) -def run_import(es_url, channel, force, verbose): - setup_logging(verbose) - - evaluation = get_last_evaluation(CHANNELS[channel]) - evaluation_builds = dict() - # evaluation_builds = get_evaluation_builds(evaluation["id"]) - - es = elasticsearch.Elasticsearch([es_url]) - - alias_name, index_name = create_index_name(channel, evaluation) - index_created = ensure_index(es, index_name, MAPPING, force) - - if index_created: - write( - "packages", es, index_name, *get_packages(evaluation, evaluation_builds), - ) - write("options", es, index_name, *get_options(evaluation)) - - update_alias(es, alias_name, index_name) - - -def prepare_items(key, total, func): - logger.info(f"Preparing items ({key})...") - return {item[key]: item for item in func()} - - -def get_packages_diff(evaluation): - for attr_name, data in get_packages_raw(evaluation): - data_cmp = dict(attr_name=attr_name, version=data.get("version"),) - yield attr_name, data_cmp, data - - -def get_options_diff(evaluation): - for name, data in get_options_raw(evaluation): - data_cmp = dict(name=name, type=data.get("type"), default=data.get("default"),) - yield name, data_cmp, data - - -def create_diff(type_, items_from, items_to): - logger.debug(f"Starting to diff {type_}...") - return dict( - added=[item for key, item in items_to.items() if key not in items_from.keys()], - removed=[ - item for key, item in items_from.items() if key not in items_to.keys() - ], - updated=[ - ( - list(dictdiffer.diff(items_from[key][0], items_to[key][0])), - items_from[key], - items_to[key], - ) - for key in set(items_from.keys()).intersection(set(items_to.keys())) - if items_from[key][0] != items_to[key][0] - ], - ) - - -@click.command() -@click.option("-v", "--verbose", count=True) -@click.option("-o", "--output", default="stats", type=click.Choice(DIFF_OUTPUT)) -@click.argument("channel_from", type=click.Choice(CHANNELS.keys())) -@click.argument("channel_to", type=click.Choice(CHANNELS.keys())) -def run_diff(channel_from, channel_to, output, verbose): - setup_logging(verbose) - - # TODO: channel_from and channel_to should not be the same - - evaluation_from = get_last_evaluation(CHANNELS[channel_from]) - evaluation_to = get_last_evaluation(CHANNELS[channel_to]) - - packages_from = { - key: (item, item_raw) - for key, item, item_raw in get_packages_diff(evaluation_from) - } - packages_to = { - key: (item, item_raw) - for key, item, item_raw in get_packages_diff(evaluation_to) - } - - options_from = { - key: (item, item_raw) - for key, item, item_raw in get_options_diff(evaluation_from) - } - options_to = { - key: (item, item_raw) for key, item, item_raw in get_options_diff(evaluation_to) - } - - packages_diff = create_diff("packages", packages_from, packages_to) - options_diff = create_diff("options", options_from, options_to) - - if output == "stats": - click.echo("Packages:") - click.echo(f" All in {channel_from}: {len(packages_from)}") - click.echo(f" All in {channel_to}: {len(packages_to)}") - click.echo(f" Added: {len(packages_diff['added'])}") - click.echo(f" Removed: {len(packages_diff['removed'])}") - click.echo(f" Updated: {len(packages_diff['updated'])}") - click.echo("Options:") - click.echo(f" All in {channel_from}: {len(options_from)}") - click.echo(f" All in {channel_to}: {len(options_to)}") - click.echo(f" Added: {len(options_diff['added'])}") - click.echo(f" Removed: {len(options_diff['removed'])}") - click.echo(f" Updated: {len(options_diff['updated'])}") - elif output == "json": - click.echo(json.dumps(dict(packages=packages_diff, options=options_diff,))) - else: - click.echo(f"ERROR: unknown output {output}") - - -if __name__ == "__main__": - run_import() diff --git a/import-scripts/import_scripts/nix.py b/import-scripts/import_scripts/nix.py deleted file mode 100644 index 9b4b60f..0000000 --- a/import-scripts/import_scripts/nix.py +++ /dev/null @@ -1,72 +0,0 @@ -def prettyPrintAttrName(attr_name): - if "." in attr_name: - return prettyPrint(attr_name) - return attr_name - - -stringEscapes = str.maketrans({"\\": "\\\\", '"': '\\"'}) - - -def prettyPrint(item, level=""): - next_level = level + " " - - if item is None: - return "null" - - elif type(item) == bool: - if item: - return "true" - return "false" - - elif type(item) in (int, float): - return f"{item}" - - elif type(item) == str: - item = item.strip() - if "\n" in item: - return "".join( - [ - "''\n", - "".join( - [ - f"{next_level}{line}" - for line in item.splitlines(keepends=True) - ] - ), - f"\n{level}''", - ] - ) - return f'"{item.translate(stringEscapes)}"' - - elif type(item) == list: - if len(item) == 0: - return "[ ]" - return ( - "[\n" - + ("".join([f"{next_level}{prettyPrint(i, next_level)}\n" for i in item])) - + f"{level}]" - ) - - elif type(item) == dict: - if len(item) == 0: - return "{ }" - if item.get("_type") == "literalExample": - if type(item["text"]) == str: - return item["text"] - else: - return prettyPrint(item["text"], level) - return ( - "{\n" - + ( - "".join( - [ - f"{next_level}{prettyPrintAttrName(n)} = {prettyPrint(v, next_level)};\n" - for n, v in item.items() - ] - ) - ) - + f"{level}}}" - ) - - else: - raise NotImplementedError(item) diff --git a/import-scripts/import_scripts/packages-config.nix b/import-scripts/import_scripts/packages-config.nix deleted file mode 100644 index fcb2019..0000000 --- a/import-scripts/import_scripts/packages-config.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - # Ensures no aliases are in the results. - allowAliases = false; - - # Also list unfree packages - allowUnfree = true; - - # Enable recursion into attribute sets that nix-env normally doesn't look into - # so that we can get a more complete picture of the available packages for the - # purposes of the index. - packageOverrides = super: - let - recurseIntoAttrs = sets: - super.lib.genAttrs - (builtins.filter (set: builtins.hasAttr set super) sets) - (set: super.recurseIntoAttrs (builtins.getAttr set super)); - in recurseIntoAttrs [ - "roundcubePlugins" - "emscriptenfastcompPackages" - "fdbPackages" - "nodePackages_latest" - "nodePackages" - "platformioPackages" - "haskellPackages" - "haskell.compiler" - "idrisPackages" - "sconsPackages" - "gns3Packages" - "quicklispPackagesClisp" - "quicklispPackagesSBCL" - "rPackages" - "apacheHttpdPackages_2_4" - "zabbix44" - "zabbix40" - "zabbix30" - "fusePackages" - "nvidiaPackages" - "sourceHanPackages" - "atomPackages" - "emacs25Packages" - "emacs26Packages" - "emacs25.pkgs" - "emacs26.pkgs" - "emacs27.pkgs" - "steamPackages" - "ut2004Packages" - "zeroadPackages" - ]; -} diff --git a/import-scripts/poetry.lock b/import-scripts/poetry.lock deleted file mode 100644 index 79a6e26..0000000 --- a/import-scripts/poetry.lock +++ /dev/null @@ -1,1166 +0,0 @@ -[[package]] -category = "dev" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -name = "appdirs" -optional = false -python-versions = "*" -version = "1.4.4" - -[[package]] -category = "dev" -description = "Disable App Nap on OS X 10.9" -marker = "python_version >= \"3.4\" and sys_platform == \"darwin\"" -name = "appnope" -optional = false -python-versions = "*" -version = "0.1.0" - -[[package]] -category = "dev" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" -name = "atomicwrites" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" - -[[package]] -category = "dev" -description = "Classes Without Boilerplate" -name = "attrs" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.2.0" - -[package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] - -[[package]] -category = "dev" -description = "Specifications for callback functions passed in to an API" -marker = "python_version >= \"3.4\"" -name = "backcall" -optional = false -python-versions = "*" -version = "0.2.0" - -[[package]] -category = "main" -description = "Function decoration for backoff and retry" -name = "backoff" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.10.0" - -[[package]] -category = "dev" -description = "The uncompromising code formatter." -name = "black" -optional = false -python-versions = ">=3.6" -version = "19.10b0" - -[package.dependencies] -appdirs = "*" -attrs = ">=18.1.0" -click = ">=6.5" -pathspec = ">=0.6,<1" -regex = "*" -toml = ">=0.9.4" -typed-ast = ">=1.4.0" - -[package.extras] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -category = "main" -description = "The AWS SDK for Python" -name = "boto3" -optional = false -python-versions = "*" -version = "1.15.12" - -[package.dependencies] -botocore = ">=1.18.12,<1.19.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.3.0,<0.4.0" - -[[package]] -category = "dev" -description = "Type annotations for boto3 1.15.12, generated by mypy-boto3-buider 3.1.0" -name = "boto3-stubs" -optional = false -python-versions = ">=3.6" -version = "1.15.12.0" - -[package.extras] -accessanalyzer = ["mypy-boto3-accessanalyzer (1.15.12.0)"] -acm = ["mypy-boto3-acm (1.15.12.0)"] -acm-pca = ["mypy-boto3-acm-pca (1.15.12.0)"] -alexaforbusiness = ["mypy-boto3-alexaforbusiness (1.15.12.0)"] -all = ["mypy-boto3-accessanalyzer (1.15.12.0)", "mypy-boto3-acm (1.15.12.0)", "mypy-boto3-acm-pca (1.15.12.0)", "mypy-boto3-alexaforbusiness (1.15.12.0)", "mypy-boto3-amplify (1.15.12.0)", "mypy-boto3-apigateway (1.15.12.0)", "mypy-boto3-apigatewaymanagementapi (1.15.12.0)", "mypy-boto3-apigatewayv2 (1.15.12.0)", "mypy-boto3-appconfig (1.15.12.0)", "mypy-boto3-appflow (1.15.12.0)", "mypy-boto3-application-autoscaling (1.15.12.0)", "mypy-boto3-application-insights (1.15.12.0)", "mypy-boto3-appmesh (1.15.12.0)", "mypy-boto3-appstream (1.15.12.0)", "mypy-boto3-appsync (1.15.12.0)", "mypy-boto3-athena (1.15.12.0)", "mypy-boto3-autoscaling (1.15.12.0)", "mypy-boto3-autoscaling-plans (1.15.12.0)", "mypy-boto3-backup (1.15.12.0)", "mypy-boto3-batch (1.15.12.0)", "mypy-boto3-braket (1.15.12.0)", "mypy-boto3-budgets (1.15.12.0)", "mypy-boto3-ce (1.15.12.0)", "mypy-boto3-chime (1.15.12.0)", "mypy-boto3-cloud9 (1.15.12.0)", "mypy-boto3-clouddirectory (1.15.12.0)", "mypy-boto3-cloudformation (1.15.12.0)", "mypy-boto3-cloudfront (1.15.12.0)", "mypy-boto3-cloudhsm (1.15.12.0)", "mypy-boto3-cloudhsmv2 (1.15.12.0)", "mypy-boto3-cloudsearch (1.15.12.0)", "mypy-boto3-cloudsearchdomain (1.15.12.0)", "mypy-boto3-cloudtrail (1.15.12.0)", "mypy-boto3-cloudwatch (1.15.12.0)", "mypy-boto3-codeartifact (1.15.12.0)", "mypy-boto3-codebuild (1.15.12.0)", "mypy-boto3-codecommit (1.15.12.0)", "mypy-boto3-codedeploy (1.15.12.0)", "mypy-boto3-codeguru-reviewer (1.15.12.0)", "mypy-boto3-codeguruprofiler (1.15.12.0)", "mypy-boto3-codepipeline (1.15.12.0)", "mypy-boto3-codestar (1.15.12.0)", "mypy-boto3-codestar-connections (1.15.12.0)", "mypy-boto3-codestar-notifications (1.15.12.0)", "mypy-boto3-cognito-identity (1.15.12.0)", "mypy-boto3-cognito-idp (1.15.12.0)", "mypy-boto3-cognito-sync (1.15.12.0)", "mypy-boto3-comprehend (1.15.12.0)", "mypy-boto3-comprehendmedical (1.15.12.0)", "mypy-boto3-compute-optimizer (1.15.12.0)", "mypy-boto3-config (1.15.12.0)", "mypy-boto3-connect (1.15.12.0)", "mypy-boto3-connectparticipant (1.15.12.0)", "mypy-boto3-cur (1.15.12.0)", "mypy-boto3-dataexchange (1.15.12.0)", "mypy-boto3-datapipeline (1.15.12.0)", "mypy-boto3-datasync (1.15.12.0)", "mypy-boto3-dax (1.15.12.0)", "mypy-boto3-detective (1.15.12.0)", "mypy-boto3-devicefarm (1.15.12.0)", "mypy-boto3-directconnect (1.15.12.0)", "mypy-boto3-discovery (1.15.12.0)", "mypy-boto3-dlm (1.15.12.0)", "mypy-boto3-dms (1.15.12.0)", "mypy-boto3-docdb (1.15.12.0)", "mypy-boto3-ds (1.15.12.0)", "mypy-boto3-dynamodb (1.15.12.0)", "mypy-boto3-dynamodbstreams (1.15.12.0)", "mypy-boto3-ebs (1.15.12.0)", "mypy-boto3-ec2 (1.15.12.0)", "mypy-boto3-ec2-instance-connect (1.15.12.0)", "mypy-boto3-ecr (1.15.12.0)", "mypy-boto3-ecs (1.15.12.0)", "mypy-boto3-efs (1.15.12.0)", "mypy-boto3-eks (1.15.12.0)", "mypy-boto3-elastic-inference (1.15.12.0)", "mypy-boto3-elasticache (1.15.12.0)", "mypy-boto3-elasticbeanstalk (1.15.12.0)", "mypy-boto3-elastictranscoder (1.15.12.0)", "mypy-boto3-elb (1.15.12.0)", "mypy-boto3-elbv2 (1.15.12.0)", "mypy-boto3-emr (1.15.12.0)", "mypy-boto3-es (1.15.12.0)", "mypy-boto3-events (1.15.12.0)", "mypy-boto3-firehose (1.15.12.0)", "mypy-boto3-fms (1.15.12.0)", "mypy-boto3-forecast (1.15.12.0)", "mypy-boto3-forecastquery (1.15.12.0)", "mypy-boto3-frauddetector (1.15.12.0)", "mypy-boto3-fsx (1.15.12.0)", "mypy-boto3-gamelift (1.15.12.0)", "mypy-boto3-glacier (1.15.12.0)", "mypy-boto3-globalaccelerator (1.15.12.0)", "mypy-boto3-glue (1.15.12.0)", "mypy-boto3-greengrass (1.15.12.0)", "mypy-boto3-groundstation (1.15.12.0)", "mypy-boto3-guardduty (1.15.12.0)", "mypy-boto3-health (1.15.12.0)", "mypy-boto3-honeycode (1.15.12.0)", "mypy-boto3-iam (1.15.12.0)", "mypy-boto3-identitystore (1.15.12.0)", "mypy-boto3-imagebuilder (1.15.12.0)", "mypy-boto3-importexport (1.15.12.0)", "mypy-boto3-inspector (1.15.12.0)", "mypy-boto3-iot (1.15.12.0)", "mypy-boto3-iot-data (1.15.12.0)", "mypy-boto3-iot-jobs-data (1.15.12.0)", "mypy-boto3-iot1click-devices (1.15.12.0)", "mypy-boto3-iot1click-projects (1.15.12.0)", "mypy-boto3-iotanalytics (1.15.12.0)", "mypy-boto3-iotevents (1.15.12.0)", "mypy-boto3-iotevents-data (1.15.12.0)", "mypy-boto3-iotsecuretunneling (1.15.12.0)", "mypy-boto3-iotsitewise (1.15.12.0)", "mypy-boto3-iotthingsgraph (1.15.12.0)", "mypy-boto3-ivs (1.15.12.0)", "mypy-boto3-kafka (1.15.12.0)", "mypy-boto3-kendra (1.15.12.0)", "mypy-boto3-kinesis (1.15.12.0)", "mypy-boto3-kinesis-video-archived-media (1.15.12.0)", "mypy-boto3-kinesis-video-media (1.15.12.0)", "mypy-boto3-kinesis-video-signaling (1.15.12.0)", "mypy-boto3-kinesisanalytics (1.15.12.0)", "mypy-boto3-kinesisanalyticsv2 (1.15.12.0)", "mypy-boto3-kinesisvideo (1.15.12.0)", "mypy-boto3-kms (1.15.12.0)", "mypy-boto3-lakeformation (1.15.12.0)", "mypy-boto3-lambda (1.15.12.0)", "mypy-boto3-lex-models (1.15.12.0)", "mypy-boto3-lex-runtime (1.15.12.0)", "mypy-boto3-license-manager (1.15.12.0)", "mypy-boto3-lightsail (1.15.12.0)", "mypy-boto3-logs (1.15.12.0)", "mypy-boto3-machinelearning (1.15.12.0)", "mypy-boto3-macie (1.15.12.0)", "mypy-boto3-macie2 (1.15.12.0)", "mypy-boto3-managedblockchain (1.15.12.0)", "mypy-boto3-marketplace-catalog (1.15.12.0)", "mypy-boto3-marketplace-entitlement (1.15.12.0)", "mypy-boto3-marketplacecommerceanalytics (1.15.12.0)", "mypy-boto3-mediaconnect (1.15.12.0)", "mypy-boto3-mediaconvert (1.15.12.0)", "mypy-boto3-medialive (1.15.12.0)", "mypy-boto3-mediapackage (1.15.12.0)", "mypy-boto3-mediapackage-vod (1.15.12.0)", "mypy-boto3-mediastore (1.15.12.0)", "mypy-boto3-mediastore-data (1.15.12.0)", "mypy-boto3-mediatailor (1.15.12.0)", "mypy-boto3-meteringmarketplace (1.15.12.0)", "mypy-boto3-mgh (1.15.12.0)", "mypy-boto3-migrationhub-config (1.15.12.0)", "mypy-boto3-mobile (1.15.12.0)", "mypy-boto3-mq (1.15.12.0)", "mypy-boto3-mturk (1.15.12.0)", "mypy-boto3-neptune (1.15.12.0)", "mypy-boto3-networkmanager (1.15.12.0)", "mypy-boto3-opsworks (1.15.12.0)", "mypy-boto3-opsworkscm (1.15.12.0)", "mypy-boto3-organizations (1.15.12.0)", "mypy-boto3-outposts (1.15.12.0)", "mypy-boto3-personalize (1.15.12.0)", "mypy-boto3-personalize-events (1.15.12.0)", "mypy-boto3-personalize-runtime (1.15.12.0)", "mypy-boto3-pi (1.15.12.0)", "mypy-boto3-pinpoint (1.15.12.0)", "mypy-boto3-pinpoint-email (1.15.12.0)", "mypy-boto3-pinpoint-sms-voice (1.15.12.0)", "mypy-boto3-polly (1.15.12.0)", "mypy-boto3-pricing (1.15.12.0)", "mypy-boto3-qldb (1.15.12.0)", "mypy-boto3-qldb-session (1.15.12.0)", "mypy-boto3-quicksight (1.15.12.0)", "mypy-boto3-ram (1.15.12.0)", "mypy-boto3-rds (1.15.12.0)", "mypy-boto3-rds-data (1.15.12.0)", "mypy-boto3-redshift (1.15.12.0)", "mypy-boto3-redshift-data (1.15.12.0)", "mypy-boto3-rekognition (1.15.12.0)", "mypy-boto3-resource-groups (1.15.12.0)", "mypy-boto3-resourcegroupstaggingapi (1.15.12.0)", "mypy-boto3-robomaker (1.15.12.0)", "mypy-boto3-route53 (1.15.12.0)", "mypy-boto3-route53domains (1.15.12.0)", "mypy-boto3-route53resolver (1.15.12.0)", "mypy-boto3-s3 (1.15.12.0)", "mypy-boto3-s3control (1.15.12.0)", "mypy-boto3-s3outposts (1.15.12.0)", "mypy-boto3-sagemaker (1.15.12.0)", "mypy-boto3-sagemaker-a2i-runtime (1.15.12.0)", "mypy-boto3-sagemaker-runtime (1.15.12.0)", "mypy-boto3-savingsplans (1.15.12.0)", "mypy-boto3-schemas (1.15.12.0)", "mypy-boto3-sdb (1.15.12.0)", "mypy-boto3-secretsmanager (1.15.12.0)", "mypy-boto3-securityhub (1.15.12.0)", "mypy-boto3-serverlessrepo (1.15.12.0)", "mypy-boto3-service-quotas (1.15.12.0)", "mypy-boto3-servicecatalog (1.15.12.0)", "mypy-boto3-servicediscovery (1.15.12.0)", "mypy-boto3-ses (1.15.12.0)", "mypy-boto3-sesv2 (1.15.12.0)", "mypy-boto3-shield (1.15.12.0)", "mypy-boto3-signer (1.15.12.0)", "mypy-boto3-sms (1.15.12.0)", "mypy-boto3-sms-voice (1.15.12.0)", "mypy-boto3-snowball (1.15.12.0)", "mypy-boto3-sns (1.15.12.0)", "mypy-boto3-sqs (1.15.12.0)", "mypy-boto3-ssm (1.15.12.0)", "mypy-boto3-sso (1.15.12.0)", "mypy-boto3-sso-admin (1.15.12.0)", "mypy-boto3-sso-oidc (1.15.12.0)", "mypy-boto3-stepfunctions (1.15.12.0)", "mypy-boto3-storagegateway (1.15.12.0)", "mypy-boto3-sts (1.15.12.0)", "mypy-boto3-support (1.15.12.0)", "mypy-boto3-swf (1.15.12.0)", "mypy-boto3-synthetics (1.15.12.0)", "mypy-boto3-textract (1.15.12.0)", "mypy-boto3-timestream-query (1.15.12.0)", "mypy-boto3-timestream-write (1.15.12.0)", "mypy-boto3-transcribe (1.15.12.0)", "mypy-boto3-transfer (1.15.12.0)", "mypy-boto3-translate (1.15.12.0)", "mypy-boto3-waf (1.15.12.0)", "mypy-boto3-waf-regional (1.15.12.0)", "mypy-boto3-wafv2 (1.15.12.0)", "mypy-boto3-workdocs (1.15.12.0)", "mypy-boto3-worklink (1.15.12.0)", "mypy-boto3-workmail (1.15.12.0)", "mypy-boto3-workmailmessageflow (1.15.12.0)", "mypy-boto3-workspaces (1.15.12.0)", "mypy-boto3-xray (1.15.12.0)"] -amplify = ["mypy-boto3-amplify (1.15.12.0)"] -apigateway = ["mypy-boto3-apigateway (1.15.12.0)"] -apigatewaymanagementapi = ["mypy-boto3-apigatewaymanagementapi (1.15.12.0)"] -apigatewayv2 = ["mypy-boto3-apigatewayv2 (1.15.12.0)"] -appconfig = ["mypy-boto3-appconfig (1.15.12.0)"] -appflow = ["mypy-boto3-appflow (1.15.12.0)"] -application-autoscaling = ["mypy-boto3-application-autoscaling (1.15.12.0)"] -application-insights = ["mypy-boto3-application-insights (1.15.12.0)"] -appmesh = ["mypy-boto3-appmesh (1.15.12.0)"] -appstream = ["mypy-boto3-appstream (1.15.12.0)"] -appsync = ["mypy-boto3-appsync (1.15.12.0)"] -athena = ["mypy-boto3-athena (1.15.12.0)"] -autoscaling = ["mypy-boto3-autoscaling (1.15.12.0)"] -autoscaling-plans = ["mypy-boto3-autoscaling-plans (1.15.12.0)"] -backup = ["mypy-boto3-backup (1.15.12.0)"] -batch = ["mypy-boto3-batch (1.15.12.0)"] -braket = ["mypy-boto3-braket (1.15.12.0)"] -budgets = ["mypy-boto3-budgets (1.15.12.0)"] -ce = ["mypy-boto3-ce (1.15.12.0)"] -chime = ["mypy-boto3-chime (1.15.12.0)"] -cloud9 = ["mypy-boto3-cloud9 (1.15.12.0)"] -clouddirectory = ["mypy-boto3-clouddirectory (1.15.12.0)"] -cloudformation = ["mypy-boto3-cloudformation (1.15.12.0)"] -cloudfront = ["mypy-boto3-cloudfront (1.15.12.0)"] -cloudhsm = ["mypy-boto3-cloudhsm (1.15.12.0)"] -cloudhsmv2 = ["mypy-boto3-cloudhsmv2 (1.15.12.0)"] -cloudsearch = ["mypy-boto3-cloudsearch (1.15.12.0)"] -cloudsearchdomain = ["mypy-boto3-cloudsearchdomain (1.15.12.0)"] -cloudtrail = ["mypy-boto3-cloudtrail (1.15.12.0)"] -cloudwatch = ["mypy-boto3-cloudwatch (1.15.12.0)"] -codeartifact = ["mypy-boto3-codeartifact (1.15.12.0)"] -codebuild = ["mypy-boto3-codebuild (1.15.12.0)"] -codecommit = ["mypy-boto3-codecommit (1.15.12.0)"] -codedeploy = ["mypy-boto3-codedeploy (1.15.12.0)"] -codeguru-reviewer = ["mypy-boto3-codeguru-reviewer (1.15.12.0)"] -codeguruprofiler = ["mypy-boto3-codeguruprofiler (1.15.12.0)"] -codepipeline = ["mypy-boto3-codepipeline (1.15.12.0)"] -codestar = ["mypy-boto3-codestar (1.15.12.0)"] -codestar-connections = ["mypy-boto3-codestar-connections (1.15.12.0)"] -codestar-notifications = ["mypy-boto3-codestar-notifications (1.15.12.0)"] -cognito-identity = ["mypy-boto3-cognito-identity (1.15.12.0)"] -cognito-idp = ["mypy-boto3-cognito-idp (1.15.12.0)"] -cognito-sync = ["mypy-boto3-cognito-sync (1.15.12.0)"] -comprehend = ["mypy-boto3-comprehend (1.15.12.0)"] -comprehendmedical = ["mypy-boto3-comprehendmedical (1.15.12.0)"] -compute-optimizer = ["mypy-boto3-compute-optimizer (1.15.12.0)"] -config = ["mypy-boto3-config (1.15.12.0)"] -connect = ["mypy-boto3-connect (1.15.12.0)"] -connectparticipant = ["mypy-boto3-connectparticipant (1.15.12.0)"] -cur = ["mypy-boto3-cur (1.15.12.0)"] -dataexchange = ["mypy-boto3-dataexchange (1.15.12.0)"] -datapipeline = ["mypy-boto3-datapipeline (1.15.12.0)"] -datasync = ["mypy-boto3-datasync (1.15.12.0)"] -dax = ["mypy-boto3-dax (1.15.12.0)"] -detective = ["mypy-boto3-detective (1.15.12.0)"] -devicefarm = ["mypy-boto3-devicefarm (1.15.12.0)"] -directconnect = ["mypy-boto3-directconnect (1.15.12.0)"] -discovery = ["mypy-boto3-discovery (1.15.12.0)"] -dlm = ["mypy-boto3-dlm (1.15.12.0)"] -dms = ["mypy-boto3-dms (1.15.12.0)"] -docdb = ["mypy-boto3-docdb (1.15.12.0)"] -ds = ["mypy-boto3-ds (1.15.12.0)"] -dynamodb = ["mypy-boto3-dynamodb (1.15.12.0)"] -dynamodbstreams = ["mypy-boto3-dynamodbstreams (1.15.12.0)"] -ebs = ["mypy-boto3-ebs (1.15.12.0)"] -ec2 = ["mypy-boto3-ec2 (1.15.12.0)"] -ec2-instance-connect = ["mypy-boto3-ec2-instance-connect (1.15.12.0)"] -ecr = ["mypy-boto3-ecr (1.15.12.0)"] -ecs = ["mypy-boto3-ecs (1.15.12.0)"] -efs = ["mypy-boto3-efs (1.15.12.0)"] -eks = ["mypy-boto3-eks (1.15.12.0)"] -elastic-inference = ["mypy-boto3-elastic-inference (1.15.12.0)"] -elasticache = ["mypy-boto3-elasticache (1.15.12.0)"] -elasticbeanstalk = ["mypy-boto3-elasticbeanstalk (1.15.12.0)"] -elastictranscoder = ["mypy-boto3-elastictranscoder (1.15.12.0)"] -elb = ["mypy-boto3-elb (1.15.12.0)"] -elbv2 = ["mypy-boto3-elbv2 (1.15.12.0)"] -emr = ["mypy-boto3-emr (1.15.12.0)"] -es = ["mypy-boto3-es (1.15.12.0)"] -essential = ["mypy-boto3-cloudformation (1.15.12.0)", "mypy-boto3-dynamodb (1.15.12.0)", "mypy-boto3-ec2 (1.15.12.0)", "mypy-boto3-lambda (1.15.12.0)", "mypy-boto3-rds (1.15.12.0)", "mypy-boto3-s3 (1.15.12.0)", "mypy-boto3-sqs (1.15.12.0)"] -events = ["mypy-boto3-events (1.15.12.0)"] -firehose = ["mypy-boto3-firehose (1.15.12.0)"] -fms = ["mypy-boto3-fms (1.15.12.0)"] -forecast = ["mypy-boto3-forecast (1.15.12.0)"] -forecastquery = ["mypy-boto3-forecastquery (1.15.12.0)"] -frauddetector = ["mypy-boto3-frauddetector (1.15.12.0)"] -fsx = ["mypy-boto3-fsx (1.15.12.0)"] -gamelift = ["mypy-boto3-gamelift (1.15.12.0)"] -glacier = ["mypy-boto3-glacier (1.15.12.0)"] -globalaccelerator = ["mypy-boto3-globalaccelerator (1.15.12.0)"] -glue = ["mypy-boto3-glue (1.15.12.0)"] -greengrass = ["mypy-boto3-greengrass (1.15.12.0)"] -groundstation = ["mypy-boto3-groundstation (1.15.12.0)"] -guardduty = ["mypy-boto3-guardduty (1.15.12.0)"] -health = ["mypy-boto3-health (1.15.12.0)"] -honeycode = ["mypy-boto3-honeycode (1.15.12.0)"] -iam = ["mypy-boto3-iam (1.15.12.0)"] -identitystore = ["mypy-boto3-identitystore (1.15.12.0)"] -imagebuilder = ["mypy-boto3-imagebuilder (1.15.12.0)"] -importexport = ["mypy-boto3-importexport (1.15.12.0)"] -inspector = ["mypy-boto3-inspector (1.15.12.0)"] -iot = ["mypy-boto3-iot (1.15.12.0)"] -iot-data = ["mypy-boto3-iot-data (1.15.12.0)"] -iot-jobs-data = ["mypy-boto3-iot-jobs-data (1.15.12.0)"] -iot1click-devices = ["mypy-boto3-iot1click-devices (1.15.12.0)"] -iot1click-projects = ["mypy-boto3-iot1click-projects (1.15.12.0)"] -iotanalytics = ["mypy-boto3-iotanalytics (1.15.12.0)"] -iotevents = ["mypy-boto3-iotevents (1.15.12.0)"] -iotevents-data = ["mypy-boto3-iotevents-data (1.15.12.0)"] -iotsecuretunneling = ["mypy-boto3-iotsecuretunneling (1.15.12.0)"] -iotsitewise = ["mypy-boto3-iotsitewise (1.15.12.0)"] -iotthingsgraph = ["mypy-boto3-iotthingsgraph (1.15.12.0)"] -ivs = ["mypy-boto3-ivs (1.15.12.0)"] -kafka = ["mypy-boto3-kafka (1.15.12.0)"] -kendra = ["mypy-boto3-kendra (1.15.12.0)"] -kinesis = ["mypy-boto3-kinesis (1.15.12.0)"] -kinesis-video-archived-media = ["mypy-boto3-kinesis-video-archived-media (1.15.12.0)"] -kinesis-video-media = ["mypy-boto3-kinesis-video-media (1.15.12.0)"] -kinesis-video-signaling = ["mypy-boto3-kinesis-video-signaling (1.15.12.0)"] -kinesisanalytics = ["mypy-boto3-kinesisanalytics (1.15.12.0)"] -kinesisanalyticsv2 = ["mypy-boto3-kinesisanalyticsv2 (1.15.12.0)"] -kinesisvideo = ["mypy-boto3-kinesisvideo (1.15.12.0)"] -kms = ["mypy-boto3-kms (1.15.12.0)"] -lakeformation = ["mypy-boto3-lakeformation (1.15.12.0)"] -lambda = ["mypy-boto3-lambda (1.15.12.0)"] -lex-models = ["mypy-boto3-lex-models (1.15.12.0)"] -lex-runtime = ["mypy-boto3-lex-runtime (1.15.12.0)"] -license-manager = ["mypy-boto3-license-manager (1.15.12.0)"] -lightsail = ["mypy-boto3-lightsail (1.15.12.0)"] -logs = ["mypy-boto3-logs (1.15.12.0)"] -machinelearning = ["mypy-boto3-machinelearning (1.15.12.0)"] -macie = ["mypy-boto3-macie (1.15.12.0)"] -macie2 = ["mypy-boto3-macie2 (1.15.12.0)"] -managedblockchain = ["mypy-boto3-managedblockchain (1.15.12.0)"] -marketplace-catalog = ["mypy-boto3-marketplace-catalog (1.15.12.0)"] -marketplace-entitlement = ["mypy-boto3-marketplace-entitlement (1.15.12.0)"] -marketplacecommerceanalytics = ["mypy-boto3-marketplacecommerceanalytics (1.15.12.0)"] -mediaconnect = ["mypy-boto3-mediaconnect (1.15.12.0)"] -mediaconvert = ["mypy-boto3-mediaconvert (1.15.12.0)"] -medialive = ["mypy-boto3-medialive (1.15.12.0)"] -mediapackage = ["mypy-boto3-mediapackage (1.15.12.0)"] -mediapackage-vod = ["mypy-boto3-mediapackage-vod (1.15.12.0)"] -mediastore = ["mypy-boto3-mediastore (1.15.12.0)"] -mediastore-data = ["mypy-boto3-mediastore-data (1.15.12.0)"] -mediatailor = ["mypy-boto3-mediatailor (1.15.12.0)"] -meteringmarketplace = ["mypy-boto3-meteringmarketplace (1.15.12.0)"] -mgh = ["mypy-boto3-mgh (1.15.12.0)"] -migrationhub-config = ["mypy-boto3-migrationhub-config (1.15.12.0)"] -mobile = ["mypy-boto3-mobile (1.15.12.0)"] -mq = ["mypy-boto3-mq (1.15.12.0)"] -mturk = ["mypy-boto3-mturk (1.15.12.0)"] -neptune = ["mypy-boto3-neptune (1.15.12.0)"] -networkmanager = ["mypy-boto3-networkmanager (1.15.12.0)"] -opsworks = ["mypy-boto3-opsworks (1.15.12.0)"] -opsworkscm = ["mypy-boto3-opsworkscm (1.15.12.0)"] -organizations = ["mypy-boto3-organizations (1.15.12.0)"] -outposts = ["mypy-boto3-outposts (1.15.12.0)"] -personalize = ["mypy-boto3-personalize (1.15.12.0)"] -personalize-events = ["mypy-boto3-personalize-events (1.15.12.0)"] -personalize-runtime = ["mypy-boto3-personalize-runtime (1.15.12.0)"] -pi = ["mypy-boto3-pi (1.15.12.0)"] -pinpoint = ["mypy-boto3-pinpoint (1.15.12.0)"] -pinpoint-email = ["mypy-boto3-pinpoint-email (1.15.12.0)"] -pinpoint-sms-voice = ["mypy-boto3-pinpoint-sms-voice (1.15.12.0)"] -polly = ["mypy-boto3-polly (1.15.12.0)"] -pricing = ["mypy-boto3-pricing (1.15.12.0)"] -qldb = ["mypy-boto3-qldb (1.15.12.0)"] -qldb-session = ["mypy-boto3-qldb-session (1.15.12.0)"] -quicksight = ["mypy-boto3-quicksight (1.15.12.0)"] -ram = ["mypy-boto3-ram (1.15.12.0)"] -rds = ["mypy-boto3-rds (1.15.12.0)"] -rds-data = ["mypy-boto3-rds-data (1.15.12.0)"] -redshift = ["mypy-boto3-redshift (1.15.12.0)"] -redshift-data = ["mypy-boto3-redshift-data (1.15.12.0)"] -rekognition = ["mypy-boto3-rekognition (1.15.12.0)"] -resource-groups = ["mypy-boto3-resource-groups (1.15.12.0)"] -resourcegroupstaggingapi = ["mypy-boto3-resourcegroupstaggingapi (1.15.12.0)"] -robomaker = ["mypy-boto3-robomaker (1.15.12.0)"] -route53 = ["mypy-boto3-route53 (1.15.12.0)"] -route53domains = ["mypy-boto3-route53domains (1.15.12.0)"] -route53resolver = ["mypy-boto3-route53resolver (1.15.12.0)"] -s3 = ["mypy-boto3-s3 (1.15.12.0)"] -s3control = ["mypy-boto3-s3control (1.15.12.0)"] -s3outposts = ["mypy-boto3-s3outposts (1.15.12.0)"] -sagemaker = ["mypy-boto3-sagemaker (1.15.12.0)"] -sagemaker-a2i-runtime = ["mypy-boto3-sagemaker-a2i-runtime (1.15.12.0)"] -sagemaker-runtime = ["mypy-boto3-sagemaker-runtime (1.15.12.0)"] -savingsplans = ["mypy-boto3-savingsplans (1.15.12.0)"] -schemas = ["mypy-boto3-schemas (1.15.12.0)"] -sdb = ["mypy-boto3-sdb (1.15.12.0)"] -secretsmanager = ["mypy-boto3-secretsmanager (1.15.12.0)"] -securityhub = ["mypy-boto3-securityhub (1.15.12.0)"] -serverlessrepo = ["mypy-boto3-serverlessrepo (1.15.12.0)"] -service-quotas = ["mypy-boto3-service-quotas (1.15.12.0)"] -servicecatalog = ["mypy-boto3-servicecatalog (1.15.12.0)"] -servicediscovery = ["mypy-boto3-servicediscovery (1.15.12.0)"] -ses = ["mypy-boto3-ses (1.15.12.0)"] -sesv2 = ["mypy-boto3-sesv2 (1.15.12.0)"] -shield = ["mypy-boto3-shield (1.15.12.0)"] -signer = ["mypy-boto3-signer (1.15.12.0)"] -sms = ["mypy-boto3-sms (1.15.12.0)"] -sms-voice = ["mypy-boto3-sms-voice (1.15.12.0)"] -snowball = ["mypy-boto3-snowball (1.15.12.0)"] -sns = ["mypy-boto3-sns (1.15.12.0)"] -sqs = ["mypy-boto3-sqs (1.15.12.0)"] -ssm = ["mypy-boto3-ssm (1.15.12.0)"] -sso = ["mypy-boto3-sso (1.15.12.0)"] -sso-admin = ["mypy-boto3-sso-admin (1.15.12.0)"] -sso-oidc = ["mypy-boto3-sso-oidc (1.15.12.0)"] -stepfunctions = ["mypy-boto3-stepfunctions (1.15.12.0)"] -storagegateway = ["mypy-boto3-storagegateway (1.15.12.0)"] -sts = ["mypy-boto3-sts (1.15.12.0)"] -support = ["mypy-boto3-support (1.15.12.0)"] -swf = ["mypy-boto3-swf (1.15.12.0)"] -synthetics = ["mypy-boto3-synthetics (1.15.12.0)"] -textract = ["mypy-boto3-textract (1.15.12.0)"] -timestream-query = ["mypy-boto3-timestream-query (1.15.12.0)"] -timestream-write = ["mypy-boto3-timestream-write (1.15.12.0)"] -transcribe = ["mypy-boto3-transcribe (1.15.12.0)"] -transfer = ["mypy-boto3-transfer (1.15.12.0)"] -translate = ["mypy-boto3-translate (1.15.12.0)"] -waf = ["mypy-boto3-waf (1.15.12.0)"] -waf-regional = ["mypy-boto3-waf-regional (1.15.12.0)"] -wafv2 = ["mypy-boto3-wafv2 (1.15.12.0)"] -workdocs = ["mypy-boto3-workdocs (1.15.12.0)"] -worklink = ["mypy-boto3-worklink (1.15.12.0)"] -workmail = ["mypy-boto3-workmail (1.15.12.0)"] -workmailmessageflow = ["mypy-boto3-workmailmessageflow (1.15.12.0)"] -workspaces = ["mypy-boto3-workspaces (1.15.12.0)"] -xray = ["mypy-boto3-xray (1.15.12.0)"] - -[[package]] -category = "main" -description = "Low-level, data-driven core of boto 3." -name = "botocore" -optional = false -python-versions = "*" -version = "1.18.12" - -[package.dependencies] -jmespath = ">=0.7.1,<1.0.0" -python-dateutil = ">=2.1,<3.0.0" - -[package.dependencies.urllib3] -python = "<3.4.0 || >=3.5.0" -version = ">=1.20,<1.26" - -[[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." -name = "certifi" -optional = false -python-versions = "*" -version = "2020.6.20" - -[[package]] -category = "main" -description = "Universal encoding detector for Python 2 and 3" -name = "chardet" -optional = false -python-versions = "*" -version = "3.0.4" - -[[package]] -category = "main" -description = "Composable command line interface toolkit" -name = "click" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "7.1.2" - -[[package]] -category = "main" -description = "Logging integration for Click" -name = "click-log" -optional = false -python-versions = "*" -version = "0.3.2" - -[package.dependencies] -click = "*" - -[[package]] -category = "dev" -description = "Cross-platform colored terminal text." -marker = "python_version >= \"3.4\" and sys_platform == \"win32\" or sys_platform == \"win32\"" -name = "colorama" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" - -[[package]] -category = "dev" -description = "Decorators for Humans" -marker = "python_version >= \"3.4\"" -name = "decorator" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.2" - -[[package]] -category = "main" -description = "Dictdiffer is a library that helps you to diff and patch dictionaries." -name = "dictdiffer" -optional = false -python-versions = "*" -version = "0.8.1" - -[package.extras] -all = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)", "numpy (>=1.11.0)"] -docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"] -numpy = ["numpy (>=1.11.0)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)"] - -[[package]] -category = "main" -description = "Python client for Elasticsearch" -name = "elasticsearch" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" -version = "7.9.1" - -[package.dependencies] -certifi = "*" -urllib3 = ">=1.21.1" - -[package.extras] -async = ["aiohttp (>=3,<4)", "yarl"] -develop = ["requests (>=2.0.0,<3.0.0)", "coverage", "mock", "pyyaml", "pytest", "pytest-cov", "sphinx (<1.7)", "sphinx-rtd-theme", "black", "jinja2"] -docs = ["sphinx (<1.7)", "sphinx-rtd-theme"] -requests = ["requests (>=2.4.0,<3.0.0)"] - -[[package]] -category = "dev" -description = "the modular source code checker: pep8 pyflakes and co" -name = "flake8" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "3.8.4" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" - -[[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" -name = "idna" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" - -[[package]] -category = "dev" -description = "IPython-enabled pdb" -name = "ipdb" -optional = false -python-versions = ">=2.7" -version = "0.13.4" - -[package.dependencies] -setuptools = "*" - -[package.dependencies.ipython] -python = ">=3.4" -version = ">=5.1.0" - -[[package]] -category = "dev" -description = "IPython: Productive Interactive Computing" -marker = "python_version >= \"3.4\"" -name = "ipython" -optional = false -python-versions = ">=3.7" -version = "7.18.1" - -[package.dependencies] -appnope = "*" -backcall = "*" -colorama = "*" -decorator = "*" -jedi = ">=0.10" -pexpect = ">4.3" -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -setuptools = ">=18.5" -traitlets = ">=4.2" - -[package.extras] -all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] -doc = ["Sphinx (>=1.3)"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] - -[[package]] -category = "dev" -description = "Vestigial utilities from IPython" -marker = "python_version >= \"3.4\"" -name = "ipython-genutils" -optional = false -python-versions = "*" -version = "0.2.0" - -[[package]] -category = "dev" -description = "An autocompletion tool for Python that can be used for text editors." -marker = "python_version >= \"3.4\"" -name = "jedi" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.2" - -[package.dependencies] -parso = ">=0.7.0,<0.8.0" - -[package.extras] -qa = ["flake8 (3.7.9)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] - -[[package]] -category = "main" -description = "JSON Matching Expressions" -name = "jmespath" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.10.0" - -[[package]] -category = "dev" -description = "McCabe checker, plugin for flake8" -name = "mccabe" -optional = false -python-versions = "*" -version = "0.6.1" - -[[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -name = "more-itertools" -optional = false -python-versions = ">=3.5" -version = "8.5.0" - -[[package]] -category = "dev" -description = "Optional static typing for Python" -name = "mypy" -optional = false -python-versions = ">=3.5" -version = "0.780" - -[package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -typed-ast = ">=1.4.0,<1.5.0" -typing-extensions = ">=3.7.4" - -[package.extras] -dmypy = ["psutil (>=4.0)"] - -[[package]] -category = "dev" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -name = "mypy-extensions" -optional = false -python-versions = "*" -version = "0.4.3" - -[[package]] -category = "dev" -description = "Core utilities for Python packages" -name = "packaging" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.4" - -[package.dependencies] -pyparsing = ">=2.0.2" -six = "*" - -[[package]] -category = "dev" -description = "A Python Parser" -marker = "python_version >= \"3.4\"" -name = "parso" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.7.1" - -[package.extras] -testing = ["docopt", "pytest (>=3.0.7)"] - -[[package]] -category = "dev" -description = "Utility library for gitignore style pattern matching of file paths." -name = "pathspec" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.8.0" - -[[package]] -category = "dev" -description = "Pexpect allows easy control of interactive console applications." -marker = "python_version >= \"3.4\" and sys_platform != \"win32\"" -name = "pexpect" -optional = false -python-versions = "*" -version = "4.8.0" - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -category = "dev" -description = "Tiny 'shelve'-like database with concurrency support" -marker = "python_version >= \"3.4\"" -name = "pickleshare" -optional = false -python-versions = "*" -version = "0.7.5" - -[[package]] -category = "dev" -description = "plugin and hook calling mechanisms for python" -name = "pluggy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -category = "dev" -description = "Library for building powerful interactive command lines in Python" -marker = "python_version >= \"3.4\"" -name = "prompt-toolkit" -optional = false -python-versions = ">=3.6.1" -version = "3.0.7" - -[package.dependencies] -wcwidth = "*" - -[[package]] -category = "dev" -description = "Run a subprocess in a pseudo terminal" -marker = "python_version >= \"3.4\" and sys_platform != \"win32\"" -name = "ptyprocess" -optional = false -python-versions = "*" -version = "0.6.0" - -[[package]] -category = "dev" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -name = "py" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.9.0" - -[[package]] -category = "dev" -description = "Python style guide checker" -name = "pycodestyle" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.6.0" - -[[package]] -category = "dev" -description = "passive checker of Python programs" -name = "pyflakes" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.2.0" - -[[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." -marker = "python_version >= \"3.4\"" -name = "pygments" -optional = false -python-versions = ">=3.5" -version = "2.7.1" - -[[package]] -category = "main" -description = "Thin wrapper for pandoc." -name = "pypandoc" -optional = false -python-versions = "*" -version = "1.5" - -[package.dependencies] -pip = ">=8.1.0" -setuptools = "*" -wheel = ">=0.25.0" - -[[package]] -category = "dev" -description = "Python parsing module" -name = "pyparsing" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" - -[[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" -name = "pytest" -optional = false -python-versions = ">=3.5" -version = "5.4.3" - -[package.dependencies] -atomicwrites = ">=1.0" -attrs = ">=17.4.0" -colorama = "*" -more-itertools = ">=4.0.0" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" - -[package.extras] -checkqa-mypy = ["mypy (v0.761)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -category = "main" -description = "Extensions to the standard Python datetime module" -name = "python-dateutil" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" - -[package.dependencies] -six = ">=1.5" - -[[package]] -category = "dev" -description = "Alternative regular expression module, to replace re." -name = "regex" -optional = false -python-versions = "*" -version = "2020.9.27" - -[[package]] -category = "main" -description = "Python HTTP for Humans." -name = "requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" -idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" - -[package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] - -[[package]] -category = "main" -description = "An Amazon S3 Transfer Manager" -name = "s3transfer" -optional = false -python-versions = "*" -version = "0.3.3" - -[package.dependencies] -botocore = ">=1.12.36,<2.0a.0" - -[[package]] -category = "main" -description = "Python 2 and 3 compatibility utilities" -name = "six" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" - -[[package]] -category = "dev" -description = "Python Library for Tom's Obvious, Minimal Language" -name = "toml" -optional = false -python-versions = "*" -version = "0.10.1" - -[[package]] -category = "main" -description = "Fast, Extensible Progress Meter" -name = "tqdm" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.50.0" - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] - -[[package]] -category = "dev" -description = "Traitlets Python configuration system" -marker = "python_version >= \"3.4\"" -name = "traitlets" -optional = false -python-versions = ">=3.7" -version = "5.0.4" - -[package.dependencies] -ipython-genutils = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -category = "dev" -description = "a fork of Python 2 and 3 ast modules with type comment support" -name = "typed-ast" -optional = false -python-versions = "*" -version = "1.4.1" - -[[package]] -category = "dev" -description = "Backported and Experimental Type Hints for Python 3.5+" -name = "typing-extensions" -optional = false -python-versions = "*" -version = "3.7.4.3" - -[[package]] -category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." -name = "urllib3" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.10" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] - -[[package]] -category = "dev" -description = "Measures the displayed width of unicode strings in a terminal" -name = "wcwidth" -optional = false -python-versions = "*" -version = "0.2.5" - -[[package]] -category = "main" -description = "A built-package format for Python" -name = "wheel" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "0.35.1" - -[package.extras] -test = ["pytest (>=3.0.0)", "pytest-cov"] - -[metadata] -content-hash = "fdccd4ed5b12d959552f67bcb3f308ce70bb1d3f418ed1a18d8a8a483401dd05" -lock-version = "1.0" -python-versions = "^3.8" - -[metadata.files] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, - {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"}, - {file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -backoff = [ - {file = "backoff-1.10.0-py2.py3-none-any.whl", hash = "sha256:5e73e2cbe780e1915a204799dba0a01896f45f4385e636bcca7a0614d879d0cd"}, - {file = "backoff-1.10.0.tar.gz", hash = "sha256:b8fba021fac74055ac05eb7c7bfce4723aedde6cd0a504e5326bcb0bdd6d19a4"}, -] -black = [ - {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, - {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, -] -boto3 = [ - {file = "boto3-1.15.12-py2.py3-none-any.whl", hash = "sha256:cb3becf1b2f2cb5f58030fe947a6abd26f27c01df0403097ae2a52bfadefcf19"}, - {file = "boto3-1.15.12.tar.gz", hash = "sha256:de2bdcd9a8d638c2ef391ffc6d4b692ad701a6d8ad6e9d77d016059cf89b481a"}, -] -boto3-stubs = [ - {file = "boto3-stubs-1.15.12.0.tar.gz", hash = "sha256:4b2e56da82cf04e5de720e9b00c57beb669c4e50533a98e2b477e91c160bec7e"}, - {file = "boto3_stubs-1.15.12.0-py3-none-any.whl", hash = "sha256:292ae46227b3129bcdce9397059506228d675ef1eb93c5e0ebfff438d8714e34"}, -] -botocore = [ - {file = "botocore-1.18.12-py2.py3-none-any.whl", hash = "sha256:12b2381ee82ff32d5135c0887eadec18d38c8ff7fac06405ba6a8584f2159c3c"}, - {file = "botocore-1.18.12.tar.gz", hash = "sha256:368f85992b0c7fda95b216776d475791c59e4c4415325fda683a02c5c110cf35"}, -] -certifi = [ - {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, - {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, -] -chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -click-log = [ - {file = "click-log-0.3.2.tar.gz", hash = "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124"}, - {file = "click_log-0.3.2-py2.py3-none-any.whl", hash = "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c"}, -] -colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, -] -decorator = [ - {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, - {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, -] -dictdiffer = [ - {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"}, - {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"}, -] -elasticsearch = [ - {file = "elasticsearch-7.9.1-py2.py3-none-any.whl", hash = "sha256:8c7e2374f53ee1b891ff2804116e0c7fb517585d6d5788ba668686bbc9d82e2d"}, - {file = "elasticsearch-7.9.1.tar.gz", hash = "sha256:5e08776fbb30c6e92408c7fa8c37d939210d291475ae2f364f0497975918b6fe"}, -] -flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -ipdb = [ - {file = "ipdb-0.13.4.tar.gz", hash = "sha256:c85398b5fb82f82399fc38c44fe3532c0dde1754abee727d8f5cfcc74547b334"}, -] -ipython = [ - {file = "ipython-7.18.1-py3-none-any.whl", hash = "sha256:2e22c1f74477b5106a6fb301c342ab8c64bb75d702e350f05a649e8cb40a0fb8"}, - {file = "ipython-7.18.1.tar.gz", hash = "sha256:a331e78086001931de9424940699691ad49dfb457cea31f5471eae7b78222d5e"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -jedi = [ - {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, - {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -more-itertools = [ - {file = "more-itertools-8.5.0.tar.gz", hash = "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20"}, - {file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"}, -] -mypy = [ - {file = "mypy-0.780-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:d3b4941de44341227ece1caaf5b08b23e42ad4eeb8b603219afb11e9d4cfb437"}, - {file = "mypy-0.780-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1f3976a945ad7f0a0727aafdc5651c2d3278e3c88dee94e2bf75cd3386b7b2f4"}, - {file = "mypy-0.780-cp35-cp35m-win_amd64.whl", hash = "sha256:eadb865126da4e3c4c95bdb47fe1bb087a3e3ea14d39a3b13224b8a4d9f9a102"}, - {file = "mypy-0.780-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:75eed74d2faf2759f79c5f56f17388defd2fc994222312ec54ee921e37b31ad4"}, - {file = "mypy-0.780-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2f8c098f12b402c19b735aec724cc9105cc1a9eea405d08814eb4b14a6fb1a41"}, - {file = "mypy-0.780-cp36-cp36m-win_amd64.whl", hash = "sha256:62eb5dd4ea86bda8ce386f26684f7f26e4bfe6283c9f2b6ca6d17faf704dcfad"}, - {file = "mypy-0.780-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:00cb1964a7476e871d6108341ac9c1a857d6bd20bf5877f4773ac5e9d92cd3cd"}, - {file = "mypy-0.780-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:974bebe3699b9b46278a7f076635d219183da26e1a675c1f8243a69221758273"}, - {file = "mypy-0.780-cp37-cp37m-win_amd64.whl", hash = "sha256:64c36eb0936d0bfb7d8da49f92c18e312ad2e3ed46e5548ae4ca997b0d33bd59"}, - {file = "mypy-0.780-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d31291df31bafb997952dc0a17ebb2737f802c754aed31dd155a8bfe75112c57"}, - {file = "mypy-0.780-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a5e5bb12b7982b179af513dddb06fca12285f0316d74f3964078acbfcf4c68f2"}, - {file = "mypy-0.780-cp38-cp38-win_amd64.whl", hash = "sha256:5d142f219bf8c7894dfa79ebfb7d352c4c63a325e75f10dfb4c3db9417dcd135"}, - {file = "mypy-0.780-py3-none-any.whl", hash = "sha256:127de5a9b817a03a98c5ae8a0c46a20dc44442af6dcfa2ae7f96cb519b312efa"}, - {file = "mypy-0.780.tar.gz", hash = "sha256:4ef13b619a289aa025f2273e05e755f8049bb4eaba6d703a425de37d495d178d"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, -] -parso = [ - {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, - {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, -] -pathspec = [ - {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, - {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.7-py3-none-any.whl", hash = "sha256:83074ee28ad4ba6af190593d4d4c607ff525272a504eb159199b6dd9f950c950"}, - {file = "prompt_toolkit-3.0.7.tar.gz", hash = "sha256:822f4605f28f7d2ba6b0b09a31e25e140871e96364d1d377667b547bb3bf4489"}, -] -ptyprocess = [ - {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, - {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, -] -py = [ - {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, - {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, -] -pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, -] -pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, -] -pygments = [ - {file = "Pygments-2.7.1-py3-none-any.whl", hash = "sha256:307543fe65c0947b126e83dd5a61bd8acbd84abec11f43caebaf5534cbc17998"}, - {file = "Pygments-2.7.1.tar.gz", hash = "sha256:926c3f319eda178d1bd90851e4317e6d8cdb5e292a3386aac9bd75eca29cf9c7"}, -] -pypandoc = [ - {file = "pypandoc-1.5.tar.gz", hash = "sha256:14a49977ab1fbc9b14ef3087dcb101f336851837fca55ca79cf33846cc4976ff"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pytest = [ - {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, - {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -regex = [ - {file = "regex-2020.9.27-cp27-cp27m-win32.whl", hash = "sha256:d23a18037313714fb3bb5a94434d3151ee4300bae631894b1ac08111abeaa4a3"}, - {file = "regex-2020.9.27-cp27-cp27m-win_amd64.whl", hash = "sha256:84e9407db1b2eb368b7ecc283121b5e592c9aaedbe8c78b1a2f1102eb2e21d19"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f18875ac23d9aa2f060838e8b79093e8bb2313dbaaa9f54c6d8e52a5df097be"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae91972f8ac958039920ef6e8769277c084971a142ce2b660691793ae44aae6b"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9a02d0ae31d35e1ec12a4ea4d4cca990800f66a917d0fb997b20fbc13f5321fc"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ebbe29186a3d9b0c591e71b7393f1ae08c83cb2d8e517d2a822b8f7ec99dfd8b"}, - {file = "regex-2020.9.27-cp36-cp36m-win32.whl", hash = "sha256:4707f3695b34335afdfb09be3802c87fa0bc27030471dbc082f815f23688bc63"}, - {file = "regex-2020.9.27-cp36-cp36m-win_amd64.whl", hash = "sha256:9bc13e0d20b97ffb07821aa3e113f9998e84994fe4d159ffa3d3a9d1b805043b"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f1b3afc574a3db3b25c89161059d857bd4909a1269b0b3cb3c904677c8c4a3f7"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5533a959a1748a5c042a6da71fe9267a908e21eded7a4f373efd23a2cbdb0ecc"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:1fe0a41437bbd06063aa184c34804efa886bcc128222e9916310c92cd54c3b4c"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:c570f6fa14b9c4c8a4924aaad354652366577b4f98213cf76305067144f7b100"}, - {file = "regex-2020.9.27-cp37-cp37m-win32.whl", hash = "sha256:eda4771e0ace7f67f58bc5b560e27fb20f32a148cbc993b0c3835970935c2707"}, - {file = "regex-2020.9.27-cp37-cp37m-win_amd64.whl", hash = "sha256:60b0e9e6dc45683e569ec37c55ac20c582973841927a85f2d8a7d20ee80216ab"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux1_i686.whl", hash = "sha256:088afc8c63e7bd187a3c70a94b9e50ab3f17e1d3f52a32750b5b77dbe99ef5ef"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eaf548d117b6737df379fdd53bdde4f08870e66d7ea653e230477f071f861121"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:41bb65f54bba392643557e617316d0d899ed5b4946dccee1cb6696152b29844b"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8d69cef61fa50c8133382e61fd97439de1ae623fe943578e477e76a9d9471637"}, - {file = "regex-2020.9.27-cp38-cp38-win32.whl", hash = "sha256:f2388013e68e750eaa16ccbea62d4130180c26abb1d8e5d584b9baf69672b30f"}, - {file = "regex-2020.9.27-cp38-cp38-win_amd64.whl", hash = "sha256:4318d56bccfe7d43e5addb272406ade7a2274da4b70eb15922a071c58ab0108c"}, - {file = "regex-2020.9.27-cp39-cp39-manylinux1_i686.whl", hash = "sha256:84cada8effefe9a9f53f9b0d2ba9b7b6f5edf8d2155f9fdbe34616e06ececf81"}, - {file = "regex-2020.9.27-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:816064fc915796ea1f26966163f6845de5af78923dfcecf6551e095f00983650"}, - {file = "regex-2020.9.27-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:5d892a4f1c999834eaa3c32bc9e8b976c5825116cde553928c4c8e7e48ebda67"}, - {file = "regex-2020.9.27-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c9443124c67b1515e4fe0bb0aa18df640965e1030f468a2a5dc2589b26d130ad"}, - {file = "regex-2020.9.27-cp39-cp39-win32.whl", hash = "sha256:49f23ebd5ac073765ecbcf046edc10d63dcab2f4ae2bce160982cb30df0c0302"}, - {file = "regex-2020.9.27-cp39-cp39-win_amd64.whl", hash = "sha256:3d20024a70b97b4f9546696cbf2fd30bae5f42229fbddf8661261b1eaff0deb7"}, - {file = "regex-2020.9.27.tar.gz", hash = "sha256:a6f32aea4260dfe0e55dc9733ea162ea38f0ea86aa7d0f77b15beac5bf7b369d"}, -] -requests = [ - {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, - {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, -] -s3transfer = [ - {file = "s3transfer-0.3.3-py2.py3-none-any.whl", hash = "sha256:2482b4259524933a022d59da830f51bd746db62f047d6eb213f2f8855dcb8a13"}, - {file = "s3transfer-0.3.3.tar.gz", hash = "sha256:921a37e2aefc64145e7b73d50c71bb4f26f46e4c9f414dc648c6245ff92cf7db"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -toml = [ - {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, - {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, -] -tqdm = [ - {file = "tqdm-4.50.0-py2.py3-none-any.whl", hash = "sha256:2dd75fdb764f673b8187643496fcfbeac38348015b665878e582b152f3391cdb"}, - {file = "tqdm-4.50.0.tar.gz", hash = "sha256:93b7a6a9129fce904f6df4cf3ae7ff431d779be681a95c3344c26f3e6c09abfa"}, -] -traitlets = [ - {file = "traitlets-5.0.4-py3-none-any.whl", hash = "sha256:9664ec0c526e48e7b47b7d14cd6b252efa03e0129011de0a9c1d70315d4309c3"}, - {file = "traitlets-5.0.4.tar.gz", hash = "sha256:86c9351f94f95de9db8a04ad8e892da299a088a64fd283f9f6f18770ae5eae1b"}, -] -typed-ast = [ - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, - {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, - {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, - {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, - {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, - {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, - {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, -] -typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, -] -urllib3 = [ - {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, - {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -wheel = [ - {file = "wheel-0.35.1-py2.py3-none-any.whl", hash = "sha256:497add53525d16c173c2c1c733b8f655510e909ea78cc0e29d374243544b77a2"}, - {file = "wheel-0.35.1.tar.gz", hash = "sha256:99a22d87add3f634ff917310a3d87e499f19e663413a52eb9232c447aa646c9f"}, -] diff --git a/import-scripts/pyproject.toml b/import-scripts/pyproject.toml deleted file mode 100644 index 118d352..0000000 --- a/import-scripts/pyproject.toml +++ /dev/null @@ -1,37 +0,0 @@ -[tool.poetry] -name = "import-scripts" -version = "0.1.0" -description = "" -authors = ["Rok Garbas "] -include = [ - "import_scripts/packages-config.nix" -] - -[tool.poetry.scripts] -import-channel = 'import_scripts.channel:run_import' -channel-diff = 'import_scripts.channel:run_diff' - -[tool.poetry.dependencies] -python = "^3.8" -requests = "^2.24.0" -click = "^7.1.2" -click-log = "^0.3.2" -elasticsearch = "^7.8.0" -boto3 = "^1.14.5" -tqdm = "^4.46.1" -pypandoc = "^1.5" -dictdiffer = "^0.8.1" -backoff = "^1.10.0" - -[tool.poetry.dev-dependencies] -ipdb = "^0.13.2" -black = "^19.10b0" -flake8 = "^3.8.3" -mypy = "^0.780" -pytest = "^5.4.3" -setuptools = "^47.3.1" -boto3-stubs = "^1.14.6" - -[build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" diff --git a/import-scripts/tests/test_channel.py b/import-scripts/tests/test_channel.py deleted file mode 100644 index cba00a4..0000000 --- a/import-scripts/tests/test_channel.py +++ /dev/null @@ -1,83 +0,0 @@ -import pytest # type: ignore - - -@pytest.mark.parametrize( - "text,expected", - [ - ( - "services.nginx.extraConfig", - [ - "services.nginx.extraConfig", - "services.nginx.extra", - "services.nginx", - "services", - "nginx.extraConfig", - "nginx.extra", - "nginx", - "extraConfig", - "extra", - "Config", - ], - ), - ( - "python37Packages.test1_name-test2", - [ - "python37Packages.test1_name-test2", - "python37Packages.test1_name-test", - "python37Packages.test1_name", - "python37Packages.test1", - "python37Packages.test", - "python37Packages", - "python37", - "python", - "37Packages.test1_name-test2", - "37Packages.test1_name-test", - "37Packages.test1_name", - "37Packages.test1", - "37Packages.test", - "37Packages", - "37", - "Packages.test1_name-test2", - "Packages.test1_name-test", - "Packages.test1_name", - "Packages.test1", - "Packages.test", - "Packages", - "test1_name-test2", - "test1_name-test", - "test1_name", - "test1", - "test", - "1_name-test2", - "1_name-test", - "1_name", - "1", - "name-test2", - "name-test", - "name", - "test2", - "test", - "2", - ], - ), - ], -) -def test_parse_query(text, expected): - import import_scripts.channel - - assert sorted(import_scripts.channel.parse_query(text)) == sorted(expected) - - -@pytest.mark.parametrize( - "field,expected", - [ - ("example", "elpmaxe"), - ("example two", "elpmaxe owt"), - (["example", "three"], ["elpmaxe", "eerht"]), - (("example", "three"), ("elpmaxe", "eerht")), - ], -) -def test_field_reverse(field, expected): - import import_scripts.channel - - assert import_scripts.channel.field_reverse(field) == expected diff --git a/import-scripts/tests/test_nix.py b/import-scripts/tests/test_nix.py deleted file mode 100644 index 5687d0f..0000000 --- a/import-scripts/tests/test_nix.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest # type: ignore - - -@pytest.mark.parametrize( - "item,expected", - [ - (None, "null",), - (True, "true",), - ("text", '"text"',), - ( - "\nnew line is ignored at start and end\n", - '"new line is ignored at start and end"', - ), - ('"double quotes"', '"\\"double quotes\\""',), - ("multi\nline\ntext", "''\n multi\n line\n text\n''",), - ('"multi line\ndouble quotes"', "''\n \"multi line\n double quotes\"\n''",), - (123, "123",), - (123.123, "123.123",), - ( - [False, "text", "multi\nline\ntext"], - "".join( - [ - "[\n", - " false\n", - ' "text"\n', - " ''\n multi\n" " line\n" " text\n" " ''\n" "]", - ] - ), - ), - ( - {"name1": "value1", "name.2": True, "name3": [False, "text"]}, - ( - "{\n" - ' name1 = "value1";\n' - ' "name.2" = true;\n' - " name3 = [\n" - " false\n" - ' "text"\n' - " ];\n" - "}" - ), - ), - ( - [{"name1": ["value1", "value2"]}], - ( - "[\n" - " {\n" - " name1 = [\n" - ' "value1"\n' - ' "value2"\n' - " ];\n" - " }\n" - "]" - ), - ), - ], -) -def test_convert(item, expected): - import import_scripts.nix - - assert import_scripts.nix.prettyPrint(item) == expected