From eff394ddc9f83bed8b5337db974092dc9f6a8c33 Mon Sep 17 00:00:00 2001 From: Chris Riccomini Date: Thu, 25 May 2023 10:38:10 -0700 Subject: [PATCH] Remove java --- .github/workflows/ci.yaml | 31 +- .gitignore | 134 ++++ python/DEVELOPER.md => DEVELOPER.md | 0 python/RELEASE.md => RELEASE.md | 0 java/.gitignore | 35 - java/pom.xml | 37 -- java/recap-core/pom.xml | 36 - .../src/main/java/build/recap/Client.java | 39 -- .../src/main/java/build/recap/Data.java | 42 -- .../src/main/java/build/recap/Type.java | 613 ------------------ .../src/test/java/build/recap/ClientTest.java | 65 -- .../src/test/java/build/recap/TypeTest.java | 84 --- java/recap-kafka/pom.xml | 29 - .../java/build/recap/kafka/Converter.java | 516 --------------- .../recap/kafka/logical/DateConverter.java | 56 -- .../recap/kafka/logical/DecimalConverter.java | 61 -- .../recap/kafka/logical/LogicalConverter.java | 11 - .../recap/kafka/logical/TimeConverter.java | 56 -- .../kafka/logical/TimestampConverter.java | 57 -- .../java/build/recap/kafka/ConverterTest.java | 183 ------ python/mkdocs.yml => mkdocs.yml | 0 python/pdm.lock => pdm.lock | 347 +++++----- python/pyproject.toml => pyproject.toml | 6 +- python/.gitignore | 133 ---- {python/recap => recap}/__init__.py | 0 {python/recap => recap}/catalog/__init__.py | 0 {python/recap => recap}/catalog/client.py | 0 {python/recap => recap}/catalog/crawler.py | 0 {python/recap => recap}/catalog/server.py | 0 {python/recap => recap}/catalog/storage.py | 0 {python/recap => recap}/cli.py | 0 {python/recap => recap}/config.py | 0 .../recap => recap}/converters/__init__.py | 0 .../recap => recap}/converters/converter.py | 0 .../converters/frictionless.py | 0 .../recap => recap}/converters/json_schema.py | 0 {python/recap => recap}/converters/recap.py | 0 .../recap => recap}/converters/sqlalchemy.py | 0 {python/recap => recap}/logging.py | 0 {python/recap => recap}/models.py | 0 {python/recap => recap}/readers/__init_.py | 0 {python/recap => recap}/readers/fsspec.py | 0 {python/recap => recap}/readers/readers.py | 0 {python/recap => recap}/readers/sqlalchemy.py | 0 {python/recap => recap}/types.py | 0 {python/tests => tests}/catalog/test_db.py | 0 .../converters/test_json_schema.py | 0 {python/tests => tests}/test_types.py | 0 48 files changed, 320 insertions(+), 2251 deletions(-) rename python/DEVELOPER.md => DEVELOPER.md (100%) rename python/RELEASE.md => RELEASE.md (100%) delete mode 100644 java/.gitignore delete mode 100644 java/pom.xml delete mode 100644 java/recap-core/pom.xml delete mode 100644 java/recap-core/src/main/java/build/recap/Client.java delete mode 100644 java/recap-core/src/main/java/build/recap/Data.java delete mode 100644 java/recap-core/src/main/java/build/recap/Type.java delete mode 100644 java/recap-core/src/test/java/build/recap/ClientTest.java delete mode 100644 java/recap-core/src/test/java/build/recap/TypeTest.java delete mode 100644 java/recap-kafka/pom.xml delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/Converter.java delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/logical/DateConverter.java delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/logical/DecimalConverter.java delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/logical/LogicalConverter.java delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/logical/TimeConverter.java delete mode 100644 java/recap-kafka/src/main/java/build/recap/kafka/logical/TimestampConverter.java delete mode 100644 java/recap-kafka/src/test/java/build/recap/kafka/ConverterTest.java rename python/mkdocs.yml => mkdocs.yml (100%) rename python/pdm.lock => pdm.lock (93%) rename python/pyproject.toml => pyproject.toml (93%) delete mode 100644 python/.gitignore rename {python/recap => recap}/__init__.py (100%) rename {python/recap => recap}/catalog/__init__.py (100%) rename {python/recap => recap}/catalog/client.py (100%) rename {python/recap => recap}/catalog/crawler.py (100%) rename {python/recap => recap}/catalog/server.py (100%) rename {python/recap => recap}/catalog/storage.py (100%) rename {python/recap => recap}/cli.py (100%) rename {python/recap => recap}/config.py (100%) rename {python/recap => recap}/converters/__init__.py (100%) rename {python/recap => recap}/converters/converter.py (100%) rename {python/recap => recap}/converters/frictionless.py (100%) rename {python/recap => recap}/converters/json_schema.py (100%) rename {python/recap => recap}/converters/recap.py (100%) rename {python/recap => recap}/converters/sqlalchemy.py (100%) rename {python/recap => recap}/logging.py (100%) rename {python/recap => recap}/models.py (100%) rename {python/recap => recap}/readers/__init_.py (100%) rename {python/recap => recap}/readers/fsspec.py (100%) rename {python/recap => recap}/readers/readers.py (100%) rename {python/recap => recap}/readers/sqlalchemy.py (100%) rename {python/recap => recap}/types.py (100%) rename {python/tests => tests}/catalog/test_db.py (100%) rename {python/tests => tests}/converters/test_json_schema.py (100%) rename {python/tests => tests}/test_types.py (100%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8209b71e..e4eb20fd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -8,13 +8,9 @@ on: branches: [ main ] jobs: - test-python: + test: runs-on: ubuntu-latest - defaults: - run: - working-directory: python - strategy: matrix: python-version: ['3.10'] @@ -54,28 +50,3 @@ jobs: run: | source venv/bin/activate pdm run pytest - - test-java: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: java - - strategy: - matrix: - java-version: ['11'] - - steps: - - uses: actions/checkout@v2 - - - name: Install dependencies - uses: actions/setup-java@v1 - with: - java-version: ${{ matrix.java-version }} - - - name: Build - run: mvn -B clean package - - - name: Run tests - run: mvn test diff --git a/.gitignore b/.gitignore index 722d5e71..66fd4bc6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,135 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# PDM +.pdm-python + +# VSCode .vscode diff --git a/python/DEVELOPER.md b/DEVELOPER.md similarity index 100% rename from python/DEVELOPER.md rename to DEVELOPER.md diff --git a/python/RELEASE.md b/RELEASE.md similarity index 100% rename from python/RELEASE.md rename to RELEASE.md diff --git a/java/.gitignore b/java/.gitignore deleted file mode 100644 index 3e403e30..00000000 --- a/java/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store diff --git a/java/pom.xml b/java/pom.xml deleted file mode 100644 index dae9d94e..00000000 --- a/java/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - build.recap - recap - 1.0-SNAPSHOT - pom - - recap-core - recap-kafka - - - 11 - 11 - - - - - org.apache.kafka - connect-api - 3.4.0 - - - build.recap - recap-core - 1.0-SNAPSHOT - - - junit - junit - 4.13.2 - - - - \ No newline at end of file diff --git a/java/recap-core/pom.xml b/java/recap-core/pom.xml deleted file mode 100644 index 572dcd15..00000000 --- a/java/recap-core/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - - build.recap - recap - 1.0-SNAPSHOT - - - - junit - junit - test - - - javax.json.bind - javax.json.bind-api - 1.0 - - - org.eclipse - yasson - 1.0.3 - test - - - org.glassfish - javax.json - 1.1.4 - test - - - recap-core - \ No newline at end of file diff --git a/java/recap-core/src/main/java/build/recap/Client.java b/java/recap-core/src/main/java/build/recap/Client.java deleted file mode 100644 index 9210130b..00000000 --- a/java/recap-core/src/main/java/build/recap/Client.java +++ /dev/null @@ -1,39 +0,0 @@ -package build.recap; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.http.HttpResponse.BodyHandlers; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; - -public class Client { - private HttpClient httpClient; - - public Client() { - this(HttpClient.newHttpClient()); - } - - public Client(HttpClient httpClient) { - this.httpClient = httpClient; - } - - public HttpResponse post(String url, Type type) throws Exception { - URI uri = URI.create(url); - HttpRequest request = HttpRequest.newBuilder() - .uri(uri) - .version(HttpClient.Version.HTTP_1_1) - .header("Content-Type", "application/json") - .PUT(HttpRequest.BodyPublishers.ofString(toJson(type))) - .build(); - - return httpClient.send(request, BodyHandlers.ofString()); - } - - private String toJson(Type type) throws Exception { - try (Jsonb jsonb = JsonbBuilder.create()) { - return jsonb.toJson(type.toTypeDescription()); - } - } -} diff --git a/java/recap-core/src/main/java/build/recap/Data.java b/java/recap-core/src/main/java/build/recap/Data.java deleted file mode 100644 index bc7a6c34..00000000 --- a/java/recap-core/src/main/java/build/recap/Data.java +++ /dev/null @@ -1,42 +0,0 @@ -package build.recap; - -import java.util.Objects; - -public class Data { - private final Type type; - private final Object object; - - public Data(Type type, Object object) { - this.type = type; - this.object = object; - } - - public Type getType() { - return type; - } - - public Object getObject() { - return object; - } - - @Override - public String toString() { - return "Data{" + - "type=" + type + - ", object=" + object + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Data data = (Data) o; - return Objects.equals(type, data.type) && Objects.equals(object, data.object); - } - - @Override - public int hashCode() { - return Objects.hash(type, object); - } -} diff --git a/java/recap-core/src/main/java/build/recap/Type.java b/java/recap-core/src/main/java/build/recap/Type.java deleted file mode 100644 index b1e7c6a4..00000000 --- a/java/recap-core/src/main/java/build/recap/Type.java +++ /dev/null @@ -1,613 +0,0 @@ -package build.recap; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -public class Type { - // TODO: Add alias support - protected String logicalType; - protected String docString; - protected Map extraAttributes; - - public Type() { - this(null, null, null); - } - - public Type(String logicalType, String docString, Map extraAttributes) { - this.logicalType = logicalType; - this.docString = docString; - this.extraAttributes = extraAttributes != null ? new HashMap<>(extraAttributes) : new HashMap<>(); - } - - public String getLogicalType() { - return logicalType; - } - - public String getDocString() { - return docString; - } - - public Map getExtraAttributes() { - return extraAttributes; - } - - public Map toTypeDescription() { - Map typeDescription = new HashMap<>(); - if (logicalType != null) { - typeDescription.put("logical", logicalType); - } - if (docString != null) { - typeDescription.put("doc", docString); - } - typeDescription.putAll(extraAttributes); - return typeDescription; - } - - @Override - public String toString() { - return "Type{" + - "logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Type type = (Type) o; - return Objects.equals(logicalType, type.logicalType) && Objects.equals(docString, type.docString) && Objects.equals(extraAttributes, type.extraAttributes); - } - - @Override - public int hashCode() { - return Objects.hash(logicalType, docString, extraAttributes); - } - - public static class Bool extends Type { - public Bool() { - this(null, null, null); - } - - public Bool(String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.put("type", "bool"); - return typeDescription; - } - } - - public static class Null extends Type { - public Null() { - this(null, null, null); - } - - public Null(String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.put("type", "null"); - return typeDescription; - } - } - - public static class Int extends Type { - private final int bits; - private final boolean signed; - - public Int(int bits, boolean signed) { - this(bits, signed, null, null, null); - } - - public Int(int bits, boolean signed, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.bits = bits; - this.signed = signed; - } - - public int getBits() { - return bits; - } - - public boolean isSigned() { - return signed; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "int", - "bits", bits, - "signed", signed - )); - return typeDescription; - } - - @Override - public String toString() { - return "Int{" + - "bits=" + bits + - ", signed=" + signed + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Int anInt = (Int) o; - return bits == anInt.bits && signed == anInt.signed; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), bits, signed); - } - } - - public static class Float extends Type { - private final int bits; - - public Float(int bits) { - this(bits, null, null, null); - } - - public Float(int bits, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.bits = bits; - } - - public int getBits() { - return bits; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "float", - "bits", bits - )); - return typeDescription; - } - - @Override - public String toString() { - return "Float{" + - "bits=" + bits + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Float aFloat = (Float) o; - return bits == aFloat.bits; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), bits); - } - } - - public static class String_ extends Type { - private final long bytes; - private final boolean variable; - - public String_(long bytes, boolean variable) { - this(bytes, variable, null, null, null); - } - - public String_(long bytes, boolean variable, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.bytes = bytes; - this.variable = variable; - } - - public long getBytes() { - return bytes; - } - - public boolean isVariable() { - return variable; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "string", - "bytes", bytes, - "variable", variable - )); - return typeDescription; - } - - @Override - public String toString() { - return "String_{" + - "bytes=" + bytes + - ", variable=" + variable + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - String_ string = (String_) o; - return bytes == string.bytes && variable == string.variable; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), bytes, variable); - } - } - - public static class Bytes extends Type { - private final long bytes; - private final boolean variable; - - public Bytes(long bytes, boolean variable) { - this(bytes, variable, null, null, null); - } - - public Bytes(long bytes, boolean variable, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.bytes = bytes; - this.variable = variable; - } - - public long getBytes() { - return bytes; - } - - public boolean isVariable() { - return variable; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "bytes", - "bytes", bytes, - "variable", variable - )); - return typeDescription; - } - - @Override - public String toString() { - return "Bytes{" + - "bytes=" + bytes + - ", variable=" + variable + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Bytes bytes1 = (Bytes) o; - return bytes == bytes1.bytes && variable == bytes1.variable; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), bytes, variable); - } - } - - public static class List_ extends Type { - private final Type valueType; - private final Integer length; - private final boolean variable; - - public List_(Type valueType) { - this(valueType, null, true); - } - - public List_(Type valueType, boolean variable) { - this(valueType, null, variable); - } - - public List_(Type valueType, Integer length, boolean variable) { - this(valueType, length, variable, null, null, null); - } - - public List_(Type valueType, Integer length, boolean variable, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.valueType = valueType; - this.length = length; - this.variable = variable; - } - - public Type getValueType() { - return valueType; - } - - public Integer getLength() { - return length; - } - - public boolean isVariable() { - return variable; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "list", - "variable", variable, - "values", valueType.toTypeDescription() - )); - if (length != null) { - typeDescription.put("length", length); - } - return typeDescription; - } - - @Override - public String toString() { - return "List_{" + - "valueType=" + valueType + - ", length=" + length + - ", variable=" + variable + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - List_ list = (List_) o; - return length == list.length && variable == list.variable && Objects.equals(valueType, list.valueType); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), valueType, length, variable); - } - } - - public static class Map_ extends Type { - private final Type keyType; - private final Type valueType; - - public Map_(Type keyType, Type valueType) { - this(keyType, valueType, null, null, null); - } - - public Map_(Type keyType, Type valueType, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.keyType = keyType; - this.valueType = valueType; - } - - public Type getKeyType() { - return keyType; - } - - public Type getValueType() { - return valueType; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "map", - "keys", keyType.toTypeDescription(), - "values", valueType.toTypeDescription() - )); - return typeDescription; - } - - @Override - public String toString() { - return "Map_{" + - "keyType=" + keyType + - ", valueType=" + valueType + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Map_ map = (Map_) o; - return Objects.equals(keyType, map.keyType) && Objects.equals(valueType, map.valueType); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), keyType, valueType); - } - } - - public static class Struct extends Type { - List fieldTypes; - - public Struct(List fieldTypes) { - this(fieldTypes, null, null, null); - } - - public Struct(List fieldTypes, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.fieldTypes = fieldTypes; - } - - public List getFieldTypes() { - return fieldTypes; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "struct", - "fields", fieldTypes - .stream() - .map(Type::toTypeDescription) - .collect(Collectors.toList()) - )); - return typeDescription; - } - - @Override - public String toString() { - return "Struct{" + - "fieldTypes=" + fieldTypes + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Struct struct = (Struct) o; - return Objects.equals(fieldTypes, struct.fieldTypes); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), fieldTypes); - } - } - - public static class Enum extends Type { - private final List symbols; - - public Enum(List symbols) { - this(symbols, null, null, null); - } - - public Enum(List symbols, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.symbols = symbols; - } - - public List getSymbols() { - return symbols; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "enum", - "symbols", symbols - )); - return typeDescription; - } - - @Override - public String toString() { - return "Enum{" + - "symbols=" + symbols + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Enum anEnum = (Enum) o; - return Objects.equals(symbols, anEnum.symbols); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), symbols); - } - } - - public static class Union extends Type { - private final List types; - - public Union(List types) { - this(types, null, null, null); - } - - public Union(List types, String logicalType, String docString, Map extraAttributes) { - super(logicalType, docString, extraAttributes); - this.types = types; - } - - public List getTypes() { - return types; - } - - public Map toTypeDescription() { - Map typeDescription = super.toTypeDescription(); - typeDescription.putAll(Map.of( - "type", "union", - "types", types - .stream() - .map(Type::toTypeDescription) - .collect(Collectors.toList()) - )); - return typeDescription; - } - - @Override - public String toString() { - return "Union{" + - "types=" + types + - ", logicalType='" + logicalType + '\'' + - ", docString='" + docString + '\'' + - ", extraAttributes=" + extraAttributes + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - Union union = (Union) o; - return Objects.equals(types, union.types); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), types); - } - } -} \ No newline at end of file diff --git a/java/recap-core/src/test/java/build/recap/ClientTest.java b/java/recap-core/src/test/java/build/recap/ClientTest.java deleted file mode 100644 index 7c4649d3..00000000 --- a/java/recap-core/src/test/java/build/recap/ClientTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package build.recap; - -import junit.framework.*; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.http.HttpResponse; - -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; -import com.sun.net.httpserver.HttpServer; - -public class ClientTest extends TestCase { - - private HttpServer server; - private String serverUrl; - private TestHttpHandler handler; - - protected void setUp() throws IOException { - handler = new TestHttpHandler(); - server = HttpServer.create(new InetSocketAddress(0), 0); - server.createContext("/test", handler); - server.start(); - serverUrl = "http://localhost:" + server.getAddress().getPort() + "/test"; - } - - protected void tearDown() { - server.stop(0); - } - - public void testPost() throws Exception { - Client client = new Client(); - Type type = new Type.Bool(); - HttpResponse response = client.post(serverUrl, type); - - assertNotNull(response); - assertEquals(200, response.statusCode()); - assertEquals("application/json", handler.getReceivedContentType()); - assertEquals("{\"type\":\"bool\"}", handler.getReceivedBody()); - } - - private static class TestHttpHandler implements HttpHandler { - private String receivedContentType; - private String receivedBody; - - @Override - public void handle(HttpExchange exchange) throws IOException { - receivedContentType = exchange.getRequestHeaders().getFirst("Content-Type"); - receivedBody = new String(exchange.getRequestBody().readAllBytes()); - exchange.sendResponseHeaders(200, 0); - try (OutputStream responseBody = exchange.getResponseBody()) { - responseBody.write(new byte[0]); - } - } - - public String getReceivedContentType() { - return receivedContentType; - } - - public String getReceivedBody() { - return receivedBody; - } - } -} diff --git a/java/recap-core/src/test/java/build/recap/TypeTest.java b/java/recap-core/src/test/java/build/recap/TypeTest.java deleted file mode 100644 index 37a92e43..00000000 --- a/java/recap-core/src/test/java/build/recap/TypeTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package build.recap; - -import junit.framework.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class TypeTest extends TestCase { - public void testTypeDescriptions() { - Type.Bool bool = new Type.Bool(null, null, Map.of("name", "bool")); - Type.Null null_ = new Type.Null(null, null, Map.of("name", "null")); - List fields = new ArrayList<>(); - fields.add(bool); - fields.add(null_); - fields.add(new Type.Int(32, true, "build.recap.Time", "A logical type test", Map.of("name", "int32"))); - fields.add(new Type.Float(64, null, null, Map.of("name", "double", "default", 32f))); - fields.add(new Type.String_(Integer.MAX_VALUE, true, null, null, Map.of("name", "string32"))); - fields.add(new Type.Bytes(Integer.MAX_VALUE, false, null, null, Map.of("name", "bytes32"))); - fields.add(new Type.List_(bool, Integer.MAX_VALUE, true, null, null, Map.of("name", "list32"))); - fields.add(new Type.Map_(bool, bool, null, null, Map.of("name", "map"))); - fields.add(new Type.Enum(List.of("red", "green", "blue"), null, null, Map.of("name", "enum"))); - fields.add(new Type.Union(List.of(null_, bool), null, null, Map.of("name", "union"))); - Type.Struct struct = new Type.Struct(fields); - Map description = struct.toTypeDescription(); - assertEquals("struct", description.get("type")); - assertTrue("Struct fields attribute should be a list", description.get("fields") instanceof List); - List> fieldDescriptions = (List>) description.get("fields"); - assertEquals(fields.size(), fieldDescriptions.size()); - Map boolDescription = Map.of("name", "bool", "type", "bool"); - Map nullDescription = Map.of("name", "null", "type", "null"); - assertEquals(boolDescription, fieldDescriptions.get(0)); - assertEquals(nullDescription, fieldDescriptions.get(1)); - assertEquals(Map.of( - "name", "int32", - "type", "int", - "bits", 32, - "signed", true, - "logical", "build.recap.Time", - "doc", "A logical type test" - ), fieldDescriptions.get(2)); - assertEquals(Map.of( - "name", "double", - "type", "float", - "bits", 64, - "default", 32f - ), fieldDescriptions.get(3)); - assertEquals(Map.of( - "name", "string32", - "type", "string", - "bytes", (long) Integer.MAX_VALUE, - "variable", true - ), fieldDescriptions.get(4)); - assertEquals(Map.of( - "name", "bytes32", - "type", "bytes", - "bytes", (long) Integer.MAX_VALUE, - "variable", false - ), fieldDescriptions.get(5)); - assertEquals(Map.of( - "name", "list32", - "type", "list", - "length", Integer.MAX_VALUE, - "variable", true, - "values", boolDescription - ), fieldDescriptions.get(6)); - assertEquals(Map.of( - "name", "map", - "type", "map", - "keys", boolDescription, - "values", boolDescription - ), fieldDescriptions.get(7)); - assertEquals(Map.of( - "name", "enum", - "type", "enum", - "symbols", List.of("red", "green", "blue") - ), fieldDescriptions.get(8)); - assertEquals(Map.of( - "name", "union", - "type", "union", - "types", List.of(nullDescription, boolDescription) - ), fieldDescriptions.get(9)); - } -} diff --git a/java/recap-kafka/pom.xml b/java/recap-kafka/pom.xml deleted file mode 100644 index fea7f76f..00000000 --- a/java/recap-kafka/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - build.recap - recap - 1.0-SNAPSHOT - - recap-kafka - - - org.apache.kafka - connect-api - compile - - - build.recap - recap-core - compile - - - junit - junit - test - - - \ No newline at end of file diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/Converter.java b/java/recap-kafka/src/main/java/build/recap/kafka/Converter.java deleted file mode 100644 index ab0ade2f..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/Converter.java +++ /dev/null @@ -1,516 +0,0 @@ -package build.recap.kafka; - -import build.recap.Data; -import build.recap.Type; -import build.recap.kafka.logical.DateConverter; -import build.recap.kafka.logical.DecimalConverter; -import build.recap.kafka.logical.LogicalConverter; -import build.recap.kafka.logical.TimeConverter; -import build.recap.kafka.logical.TimestampConverter; -import org.apache.kafka.connect.data.*; - -import java.util.*; -import java.util.stream.Collectors; - -public class Converter { - private final List logicalConverters; - - public Converter() { - this(List.of( - new DecimalConverter(), - new DateConverter(), - new TimeConverter(), - new TimestampConverter() - )); - } - - public Converter(List logicalConverters) { - this.logicalConverters = Collections.unmodifiableList(logicalConverters); - } - - public Data convert(SchemaAndValue connectSchemaAndValue) { - Data convertedData = null; - SchemaAndValue connectSchemaAndValueLogical = convertLogical(connectSchemaAndValue); - Schema connectSchema = connectSchemaAndValue.schema(); - - switch (connectSchema.type()) { - case STRING: - convertedData = convertString(connectSchemaAndValueLogical); - break; - case INT8: - case INT16: - case INT32: - case INT64: - convertedData = convertInt(connectSchemaAndValueLogical); - break; - case FLOAT32: - case FLOAT64: - convertedData = convertFloat(connectSchemaAndValueLogical); - break; - case BOOLEAN: - convertedData = convertBool(connectSchemaAndValueLogical); - break; - case BYTES: - convertedData = convertBytes(connectSchemaAndValueLogical); - break; - case STRUCT: - convertedData = convertStruct((Struct) connectSchemaAndValueLogical.value()); - break; - case ARRAY: - convertedData = convertList(connectSchemaAndValueLogical); - break; - case MAP: - convertedData = convertMap(connectSchemaAndValueLogical); - break; - } - - if (convertedData != null) { - if (connectSchema.isOptional()) { - Type optionalType = new Type.Union(Arrays.asList(new Type.Null(), convertedData.getType())); - // KC does not differentiate between null default and unset default. - // Always set default even if it's null, since we don't know if it's explicitly so or not. - optionalType.getExtraAttributes().put("default", connectSchema.defaultValue()); - convertedData = new Data(optionalType, convertedData.getObject()); - } - return convertedData; - } - - throw new RuntimeException("Unable to convert Kafka Connect data " + connectSchemaAndValue); - } - - public SchemaAndValue convert(Data data) { - Data dataLogical = convertLogical(data); - - if (dataLogical.getType() instanceof Type.String_) { - return convertString(dataLogical); - } else if (dataLogical.getType() instanceof Type.Int) { - return convertInt(dataLogical); - } else if (dataLogical.getType() instanceof Type.Float) { - return convertFloat(dataLogical); - } else if (dataLogical.getType() instanceof Type.Bytes) { - return convertBytes(dataLogical); - } else if (dataLogical.getType() instanceof Type.Bool) { - return convertBool(dataLogical); - } else if (dataLogical.getType() instanceof Type.Struct) { - return convertStruct(dataLogical); - } else if (dataLogical.getType() instanceof Type.List_) { - return convertList(dataLogical); - } else if (dataLogical.getType() instanceof Type.Map_) { - return convertMap(dataLogical); - } else if (dataLogical.getType() instanceof Type.Enum) { - return convertEnum(dataLogical); - } else if (dataLogical.getType() instanceof Type.Union) { - return convertUnion(dataLogical); - } - throw new UnsupportedOperationException("Unable to convert Recap data " + data); - } - - protected Data convertString(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - Type.String_ recapStringType = new Type.String_( - Integer.MAX_VALUE, - true, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapStringType, connectValue); - } - - protected SchemaAndValue convertString(Data data) { - Type.String_ recapStringType = (Type.String_) data.getType(); - Schema connectSchema = setStandardAttributes(SchemaBuilder.string(), recapStringType).build(); - if (recapStringType.getBytes() <= Integer.MAX_VALUE) { - return new SchemaAndValue( - connectSchema, - data.getObject() - ); - } - throw new RuntimeException("Unable to convert Recap string " + data); - } - - protected Data convertInt(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - Integer bits = null; - switch (connectSchema.type()) { - case INT8: - bits = 8; - break; - case INT16: - bits = 16; - break; - case INT32: - bits = 32; - break; - case INT64: - bits = 64; - break; - } - if (bits != null) { - Type.Int recapIntType = new Type.Int( - bits, - true, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapIntType, connectValue); - } - throw new RuntimeException("Unable to convert Kafka Connect integer " + connectSchemaAndValue); - } - - protected SchemaAndValue convertInt(Data data) { - Type.Int recapIntType = (Type.Int) data.getType(); - if (recapIntType.getBits() <= 8) { - if (recapIntType.isSigned()) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int8(), recapIntType).build(), - data.getObject()); - } else { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int16(), recapIntType).build(), - data.getObject()); - } - } else if (recapIntType.getBits() <= 16) { - if (recapIntType.isSigned()) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int16(), recapIntType).build(), - data.getObject()); - } else { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int32(), recapIntType).build(), - data.getObject()); - } - } else if (recapIntType.getBits() <= 32) { - if (recapIntType.isSigned()) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int32(), recapIntType).build(), - data.getObject()); - } else { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int64(), recapIntType).build(), - data.getObject()); - } - } else if (recapIntType.getBits() <= 64) { - if (recapIntType.isSigned()) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.int64(), recapIntType).build(), - data.getObject()); - } else { - return new SchemaAndValue( - setStandardAttributes(Decimal.builder(0), recapIntType).build(), - data.getObject()); - } - } - throw new RuntimeException("Unable to convert Recap integer " + data); - } - - protected Data convertFloat(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - Integer bits = null; - switch (connectSchema.type()) { - case FLOAT32: - bits = 32; - break; - case FLOAT64: - bits = 64; - break; - } - if (bits != null) { - Type.Float recapFloatType = new Type.Float( - bits, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapFloatType, connectValue); - } - throw new RuntimeException("Unable to convert Kafka Connect float " + connectSchemaAndValue); - } - - protected SchemaAndValue convertFloat(Data data) { - Type.Float recapFloatType = (Type.Float) data.getType(); - if (recapFloatType.getBits() <= 32) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.float32(), recapFloatType).build(), - data.getObject()); - } else if (recapFloatType.getBits() <= 64) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.float64(), recapFloatType).build(), - data.getObject()); - } - throw new RuntimeException("Unable to convert Recap float " + data); - } - - protected Data convertBytes(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - Type.Bytes recapBytesType = new Type.Bytes( - Integer.MAX_VALUE, - true, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapBytesType, connectValue); - } - - protected SchemaAndValue convertBytes(Data data) { - Type.Bytes recapBytesType = (Type.Bytes) data.getType(); - if (recapBytesType.getBytes() <= Integer.MAX_VALUE) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.bytes(), recapBytesType).build(), - data.getObject()); - } - throw new RuntimeException("Unable to convert Recap bytes " + data); - } - - protected Data convertBool(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - Type.Bool recapBoolType = new Type.Bool( - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapBoolType, connectValue); - } - - protected SchemaAndValue convertBool(Data data) { - return new SchemaAndValue( - setStandardAttributes(SchemaBuilder.bool(), data.getType()).build(), - data.getObject()); - } - - protected Data convertStruct(Struct connectStruct) { - // TODO: Need to handle null structs here. - Schema connectSchema = connectStruct.schema(); - Type[] recapFieldTypes = new Type[connectSchema.fields().size()]; - Map recapStructFields = new LinkedHashMap<>(); - for (Field connectField : connectSchema.fields()) { - Object connectFieldObject = connectStruct.get(connectField); - Data fieldData = convert(new SchemaAndValue(connectField.schema(), connectFieldObject)); - recapFieldTypes[connectField.index()] = fieldData.getType(); - recapFieldTypes[connectField.index()].getExtraAttributes().put("name", connectField.name()); - recapStructFields.put(connectField.name(), fieldData.getObject()); - } - Type.Struct recapStructType = new Type.Struct( - Arrays.asList(recapFieldTypes), - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapStructType, recapStructFields); - } - - protected SchemaAndValue convertStruct(Data data) { - Map connectStructFields = new LinkedHashMap<>(); - Map recapStructFields = (Map) data.getObject(); - Type.Struct recapStructType = (Type.Struct) data.getType(); - SchemaBuilder connectSchemaBuilder = setStandardAttributes(SchemaBuilder.struct(), data.getType()); - for (Type recapFieldType : recapStructType.getFieldTypes()) { - String fieldName = (String) recapFieldType.getExtraAttributes().get("name"); - assert fieldName != null : "Can't convert unnamed field to Kafka Connect field"; - // Allow null objects on non-null types like structs, so we can convert schemas for optional types. - Object recapFieldObject = recapStructFields != null ? recapStructFields.get(fieldName) : null; - Data fieldData = new Data(recapFieldType, recapFieldObject); - SchemaAndValue fieldSchemaAndValue = convert(fieldData); - connectStructFields.put(fieldName, fieldSchemaAndValue.value()); - connectSchemaBuilder.field(fieldName, fieldSchemaAndValue.schema()); - } - Struct connectStruct = new Struct(connectSchemaBuilder.build()); - for (Map.Entry connectStructField : connectStructFields.entrySet()) { - connectStruct.put(connectStructField.getKey(), connectStructField.getValue()); - } - return new SchemaAndValue(connectStruct.schema(), connectStruct); - } - - protected Data convertList(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Schema connectValueSchema = connectSchema.valueSchema(); - List connectList = connectSchemaAndValue.value() != null ? (List) connectSchemaAndValue.value() : Collections.emptyList(); - List recapList = new ArrayList<>(connectList.size()); - Type recapValueType = null; - for (Object valueObject : connectList) { - Data data = convert(new SchemaAndValue(connectValueSchema, valueObject)); - recapValueType = data.getType(); - recapList.add(data.getObject()); - } - if (recapValueType == null) { - // Assume an empty list or null list, so send a null object to get schema. - recapValueType = convert(new SchemaAndValue(connectValueSchema, null)).getType(); - } - Type.List_ recapListType = new Type.List_( - recapValueType, - null, - true, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapListType, recapList); - } - - protected SchemaAndValue convertList(Data data) { - Type.List_ recapListType = (Type.List_) data.getType(); - Type recapValueType = recapListType.getValueType(); - List recapList = data.getObject() != null ? (List) data.getObject() : Collections.emptyList(); - List connectList = new ArrayList<>(recapList.size()); - Schema connectValueSchema = null; - // Kafka Connect has no concept of fixed-size or length-limited arrays. - // Put all Recap lists into KC's standard array. - for (Object valueObject : recapList) { - SchemaAndValue schemaAndValue = convert(new Data(recapValueType, valueObject)); - connectValueSchema = schemaAndValue.schema(); - connectList.add(schemaAndValue.value()); - } - if (connectValueSchema == null) { - // Assume an empty list or null list, so send a null object to get schema. - connectValueSchema = convert(new Data(recapValueType, null)).schema(); - } - Schema connectListSchema = setStandardAttributes(SchemaBuilder.array(connectValueSchema), data.getType()).build(); - return new SchemaAndValue(connectListSchema, connectList); - } - - protected Data convertMap(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Schema connectKeySchema = connectSchema.keySchema(); - Schema connectValueSchema = connectSchema.valueSchema(); - Map connectMap = connectSchemaAndValue.value() != null ? (Map) connectSchemaAndValue.value() : Collections.emptyMap(); - Map recapMap = new LinkedHashMap<>(connectMap.size()); - Type recapKeyType = null; - Type recapValueType = null; - for (Map.Entry mapEntry : connectMap.entrySet()) { - Data keyData = convert(new SchemaAndValue(connectKeySchema, mapEntry.getKey())); - Data valueData = convert(new SchemaAndValue(connectValueSchema, mapEntry.getValue())); - recapKeyType = keyData.getType(); - recapValueType = valueData.getType(); - recapMap.put(keyData.getObject(), valueData.getObject()); - } - if (recapKeyType == null || recapValueType == null) { - assert recapValueType == recapKeyType : "Got null key type or value type, but not both. This is unexpected."; - // Assume an empty map or null map, so send a null object to get schemas. - recapKeyType = convert(new SchemaAndValue(connectKeySchema, null)).getType(); - recapValueType = convert(new SchemaAndValue(connectValueSchema, null)).getType(); - } - Type.Map_ recapMapType = new Type.Map_( - recapKeyType, - recapValueType, - connectSchema.name(), - connectSchema.doc(), - (Map) connectSchema.parameters() - ); - return new Data(recapMapType, recapMap); - } - - protected SchemaAndValue convertMap(Data data) { - Type.Map_ recapMapType = (Type.Map_) data.getType(); - Type recapKeyType = recapMapType.getKeyType(); - Type recapValueType = recapMapType.getValueType(); - Map recapMap = data.getObject() != null ? (Map) data.getObject() : Collections.emptyMap(); - Map connectMap = new LinkedHashMap<>(recapMap.size()); - Schema connectKeySchema = null; - Schema connectValueSchema = null; - for (Map.Entry mapEntry : recapMap.entrySet()) { - SchemaAndValue keySchemaAndValue = convert(new Data(recapKeyType, mapEntry.getKey())); - SchemaAndValue valueSchemaAndValue = convert(new Data(recapValueType, mapEntry.getValue())); - connectKeySchema = keySchemaAndValue.schema(); - connectValueSchema = valueSchemaAndValue.schema(); - connectMap.put(keySchemaAndValue.value(), valueSchemaAndValue.value()); - } - if (connectKeySchema == null || connectValueSchema == null) { - assert recapValueType == recapKeyType : "Got null key type or value type, but not both. This is unexpected."; - // Assume an empty map or null map, so send a null object to get schemas. - connectKeySchema = convert(new Data(recapKeyType, null)).schema(); - connectValueSchema = convert(new Data(recapValueType, null)).schema(); - } - Schema connectMapSchema = setStandardAttributes(SchemaBuilder.map(connectKeySchema, connectValueSchema), data.getType()).build(); - return new SchemaAndValue(connectMapSchema, connectMap); - } - - protected SchemaAndValue convertEnum(Data data) { - Schema connectSchema = setStandardAttributes(SchemaBuilder.string(), data.getType()).build(); - return new SchemaAndValue(connectSchema, data.getObject()); - } - - protected SchemaAndValue convertUnion(Data data) { - Type.Union recapUnionType = (Type.Union) data.getType(); - int recapNullTypeIndex = recapUnionType.getTypes().indexOf(new Type.Null()); - if (recapNullTypeIndex >= 0 && recapUnionType.getTypes().size() == 2) { - Type recapNonNullType = recapUnionType.getTypes().get(1 - recapNullTypeIndex); - SchemaAndValue schemaAndValue = convert(new Data(recapNonNullType, data.getObject())); - SchemaBuilder schemaBuilder = null; - // TODO: Figure out a better way to clone a schema and make it optional. - if (schemaAndValue.schema().type().equals(Schema.Type.ARRAY)) { - schemaBuilder = SchemaBuilder.array(schemaAndValue.schema().valueSchema()); - } else if (schemaAndValue.schema().type().equals(Schema.Type.MAP)) { - schemaBuilder = SchemaBuilder.map( - schemaAndValue.schema().keySchema(), - schemaAndValue.schema().valueSchema()); - } else if (schemaAndValue.schema().type().equals(Schema.Type.STRUCT)) { - schemaBuilder = SchemaBuilder.struct(); - for (Field structField : schemaAndValue.schema().fields()) { - schemaBuilder.field(structField.name(), structField.schema()); - } - } else { - schemaBuilder = SchemaBuilder.type(schemaAndValue.schema().type()); - } - Schema optionalConnectSchema = setStandardAttributes(schemaBuilder, data.getType()) - .optional() - .defaultValue(data.getType().getExtraAttributes().get("default")) - .build(); - return new SchemaAndValue(optionalConnectSchema, schemaAndValue.value()); - } - throw new RuntimeException("Unable to convert Recap union " + data); - } - - protected SchemaAndValue convertLogical(SchemaAndValue schemaAndValue) { - Schema connectSchema = schemaAndValue.schema(); - if (connectSchema.name() != null) { - for (LogicalConverter logicalConverter : logicalConverters) { - if (logicalConverter.canConvertToRecap(connectSchema.name(), connectSchema.version())) { - return logicalConverter.convert(schemaAndValue); - } - } - } - return schemaAndValue; - } - - protected Data convertLogical(Data data) { - String recapLogicalType = data.getType().getLogicalType(); - if (recapLogicalType != null) { - for (LogicalConverter logicalConverter : logicalConverters) { - if (logicalConverter.canConvertToConnect(recapLogicalType)) { - return logicalConverter.convert(data); - } - } - } - return data; - } - - public static SchemaBuilder setStandardAttributes(SchemaBuilder schemaBuilder, Type recapType) { - return schemaBuilder - .name(recapType.getLogicalType()) - .doc(recapType.getDocString()) - .parameters(convertExtraAttributes(recapType.getExtraAttributes())); - } - - public static Map convertExtraAttributes(Map recapExtraAttributes) { - if (recapExtraAttributes != null) { - return recapExtraAttributes - .entrySet() - .stream() - // Remove reserved field attributes (name and default) - .filter(e -> e.getValue() != null - && !"name".equals(e.getKey()) - && !"default".equals(e.getKey())) - .collect(Collectors.toMap( - Map.Entry::getKey, - e -> e.getValue().toString())); - } - return null; - } -} \ No newline at end of file diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/logical/DateConverter.java b/java/recap-kafka/src/main/java/build/recap/kafka/logical/DateConverter.java deleted file mode 100644 index d6359bb7..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/logical/DateConverter.java +++ /dev/null @@ -1,56 +0,0 @@ -package build.recap.kafka.logical; - -import build.recap.Data; -import build.recap.Type; -import build.recap.kafka.Converter; -import org.apache.kafka.connect.data.*; - -import java.util.Map; - -public class DateConverter implements LogicalConverter { - public static final String LOGICAL_TYPE = "build.recap.Date"; - public static final String UNIT_ATTRIBUTE = "unit"; - - public boolean canConvertToConnect(String recapLogicalType) { - return LOGICAL_TYPE.equals(recapLogicalType); - } - - public boolean canConvertToRecap(String connectSchemaName, Integer version) { - return Date.LOGICAL_NAME.equals(connectSchemaName) && Integer.valueOf(1).equals(version); - } - - public SchemaAndValue convert(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - assert connectValue instanceof java.util.Date : "Expected date type to be Date, but wasn't."; - assert connectSchema.version() == 1 : "Expected date logical type version to be 1 but wasn't."; - SchemaBuilder schemaBuilder = Converter.setStandardAttributes( - SchemaBuilder.int32(), - new Type( - LOGICAL_TYPE, - connectSchema.doc(), - (Map) connectSchema.parameters() - )) - .parameter(UNIT_ATTRIBUTE, "millisecond"); - if (connectSchema.isOptional()) { - schemaBuilder - .optional() - .defaultValue(connectSchema.defaultValue()); - } - return new SchemaAndValue(schemaBuilder, connectValue); - } - - public Data convert(Data data) { - Type.Int recapIntType = (Type.Int) data.getType(); - Object date = data.getObject(); - assert date instanceof java.util.Date : "Expected date type to be Date, but wasn't."; - Type.Int recapIntTypeWithKCLogical = new Type.Int( - 32, - true, - Date.LOGICAL_NAME, - recapIntType.getDocString(), - recapIntType.getExtraAttributes() - ); - return new Data(recapIntTypeWithKCLogical, date); - } -} diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/logical/DecimalConverter.java b/java/recap-kafka/src/main/java/build/recap/kafka/logical/DecimalConverter.java deleted file mode 100644 index ddec6052..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/logical/DecimalConverter.java +++ /dev/null @@ -1,61 +0,0 @@ -package build.recap.kafka.logical; - -import build.recap.Data; -import build.recap.Type; -import build.recap.kafka.Converter; -import org.apache.kafka.connect.data.Decimal; -import org.apache.kafka.connect.data.Schema; -import org.apache.kafka.connect.data.SchemaAndValue; -import org.apache.kafka.connect.data.SchemaBuilder; - -import java.math.BigDecimal; -import java.util.Map; - -public class DecimalConverter implements LogicalConverter { - public static final String LOGICAL_TYPE = "build.recap.Decimal"; - public static final String PRECISION_ATTRIBUTE = "precision"; - - public boolean canConvertToConnect(String recapLogicalType) { - return LOGICAL_TYPE.equals(recapLogicalType); - } - - public boolean canConvertToRecap(String connectSchemaName, Integer version) { - return Decimal.LOGICAL_NAME.equals(connectSchemaName) && Integer.valueOf(1).equals(version); - } - - public SchemaAndValue convert(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - assert connectValue instanceof BigDecimal : "Expected decimal type to be BigDecimal, but wasn't."; - assert connectSchema.version() == 1 : "Expected decimal logical type version to be 1 but wasn't."; - SchemaBuilder schemaBuilder = Converter.setStandardAttributes( - SchemaBuilder.bytes(), - new Type( - LOGICAL_TYPE, - connectSchema.doc(), - (Map) connectSchema.parameters() - )) - // BigDecimals are capped to a 2 gig limit in Java - .parameter(PRECISION_ATTRIBUTE, Integer.toString(Integer.MAX_VALUE)); - if (connectSchema.isOptional()) { - schemaBuilder - .optional() - .defaultValue(connectSchema.defaultValue()); - } - return new SchemaAndValue(schemaBuilder, connectValue); - } - - public Data convert(Data data) { - Type.Bytes recapBytesType = (Type.Bytes) data.getType(); - Object decimal = data.getObject(); - assert decimal instanceof BigDecimal : "Expected decimal type to be BigDecimal, but wasn't."; - Type.Bytes recapBytesTypeWithKCLogical = new Type.Bytes( - recapBytesType.getBytes(), - recapBytesType.isVariable(), - Decimal.LOGICAL_NAME, - recapBytesType.getDocString(), - recapBytesType.getExtraAttributes() - ); - return new Data(recapBytesTypeWithKCLogical, decimal); - } -} diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/logical/LogicalConverter.java b/java/recap-kafka/src/main/java/build/recap/kafka/logical/LogicalConverter.java deleted file mode 100644 index b383d871..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/logical/LogicalConverter.java +++ /dev/null @@ -1,11 +0,0 @@ -package build.recap.kafka.logical; - -import build.recap.Data; -import org.apache.kafka.connect.data.SchemaAndValue; - -public interface LogicalConverter { - boolean canConvertToConnect(String recapLogicalType); - boolean canConvertToRecap(String connectSchemaName, Integer version); - SchemaAndValue convert(SchemaAndValue connectSchemaAndValue); - Data convert(Data data); -} diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimeConverter.java b/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimeConverter.java deleted file mode 100644 index f438b226..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimeConverter.java +++ /dev/null @@ -1,56 +0,0 @@ -package build.recap.kafka.logical; - -import build.recap.Data; -import build.recap.Type; -import build.recap.kafka.Converter; -import org.apache.kafka.connect.data.*; - -import java.util.Map; - -public class TimeConverter implements LogicalConverter { - public static final String LOGICAL_TYPE = "build.recap.Time"; - public static final String UNIT_ATTRIBUTE = "unit"; - - public boolean canConvertToConnect(String recapLogicalType) { - return LOGICAL_TYPE.equals(recapLogicalType); - } - - public boolean canConvertToRecap(String connectSchemaName, Integer version) { - return Time.LOGICAL_NAME.equals(connectSchemaName) && Integer.valueOf(1).equals(version); - } - - public SchemaAndValue convert(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - assert connectValue instanceof java.util.Date : "Expected time type to be Date, but wasn't."; - assert connectSchema.version() == 1 : "Expected time logical type version to be 1 but wasn't."; - SchemaBuilder schemaBuilder = Converter.setStandardAttributes( - SchemaBuilder.int32(), - new Type( - LOGICAL_TYPE, - connectSchema.doc(), - (Map) connectSchema.parameters() - )) - .parameter(UNIT_ATTRIBUTE, "millisecond"); - if (connectSchema.isOptional()) { - schemaBuilder - .optional() - .defaultValue(connectSchema.defaultValue()); - } - return new SchemaAndValue(schemaBuilder, connectValue); - } - - public Data convert(Data data) { - Type.Int recapIntType = (Type.Int) data.getType(); - Object time = data.getObject(); - assert time instanceof java.util.Date : "Expected time type to be Date, but wasn't."; - Type.Int recapIntTypeWithKCLogical = new Type.Int( - 32, - true, - Time.LOGICAL_NAME, - recapIntType.getDocString(), - recapIntType.getExtraAttributes() - ); - return new Data(recapIntTypeWithKCLogical, time); - } -} diff --git a/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimestampConverter.java b/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimestampConverter.java deleted file mode 100644 index 654b1f27..00000000 --- a/java/recap-kafka/src/main/java/build/recap/kafka/logical/TimestampConverter.java +++ /dev/null @@ -1,57 +0,0 @@ -package build.recap.kafka.logical; - -import build.recap.Data; -import build.recap.Type; -import build.recap.kafka.Converter; -import org.apache.kafka.connect.data.*; - -import java.util.Map; - -public class TimestampConverter implements LogicalConverter { - public static final String LOGICAL_TYPE = "build.recap.Timestamp"; - public static final String UNIT_ATTRIBUTE = "unit"; - - public boolean canConvertToConnect(String recapLogicalType) { - return LOGICAL_TYPE.equals(recapLogicalType); - } - - public boolean canConvertToRecap(String connectSchemaName, Integer version) { - return Timestamp.LOGICAL_NAME.equals(connectSchemaName) && Integer.valueOf(1).equals(version); - } - - public SchemaAndValue convert(SchemaAndValue connectSchemaAndValue) { - Schema connectSchema = connectSchemaAndValue.schema(); - Object connectValue = connectSchemaAndValue.value(); - assert connectValue instanceof java.util.Date : "Expected timestamp type to be Date, but wasn't."; - assert connectSchema.version() == 1 : "Expected timestamp logical type version to be 1 but wasn't."; - SchemaBuilder schemaBuilder = Converter.setStandardAttributes( - SchemaBuilder.int64(), - new Type( - LOGICAL_TYPE, - connectSchema.doc(), - (Map) connectSchema.parameters() - )) - // "timezone" attribute isn't set because KC timestamps aren't zoned. - .parameter(UNIT_ATTRIBUTE, "millisecond"); - if (connectSchema.isOptional()) { - schemaBuilder - .optional() - .defaultValue(connectSchema.defaultValue()); - } - return new SchemaAndValue(schemaBuilder, connectValue); - } - - public Data convert(Data data) { - Type.Int recapIntType = (Type.Int) data.getType(); - Object timestamp = data.getObject(); - assert timestamp instanceof java.util.Date : "Expected timestamp type to be Date, but wasn't."; - Type.Int recapIntTypeWithKCLogical = new Type.Int( - 64, - true, - Timestamp.LOGICAL_NAME, - recapIntType.getDocString(), - recapIntType.getExtraAttributes() - ); - return new Data(recapIntTypeWithKCLogical, timestamp); - } -} \ No newline at end of file diff --git a/java/recap-kafka/src/test/java/build/recap/kafka/ConverterTest.java b/java/recap-kafka/src/test/java/build/recap/kafka/ConverterTest.java deleted file mode 100644 index f891dc47..00000000 --- a/java/recap-kafka/src/test/java/build/recap/kafka/ConverterTest.java +++ /dev/null @@ -1,183 +0,0 @@ -package build.recap.kafka; - -import build.recap.Data; -import build.recap.Type; -import junit.framework.*; -import org.apache.kafka.connect.data.*; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; - -public class ConverterTest extends TestCase { - public void testConverter() { - Schema addressSchema = SchemaBuilder.struct().name("build.recap.kafka.Address") - .field("number", Schema.INT8_SCHEMA) - .build(); - Schema personSchema = SchemaBuilder.struct().name("build.recap.kafka.Person") - .field("age", Schema.INT8_SCHEMA) - .field("address", addressSchema) - .build(); - Struct addressStruct = new Struct(addressSchema) - .put("number", (byte) 100); - Struct personStruct = new Struct(personSchema) - .put("age", (byte) 75) - .put("address", addressStruct); - - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(personStruct.schema(), personStruct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(personStruct, convertedConnectData.value()); - } - - public void testOptionalPrimitive() { - Schema addressSchema = SchemaBuilder.struct().name("build.recap.kafka.Address") - .field("number", Schema.OPTIONAL_INT8_SCHEMA) - .build(); - Schema personSchema = SchemaBuilder.struct().name("build.recap.kafka.Person") - .field("age", Schema.INT8_SCHEMA) - .field("address", addressSchema) - .build(); - Struct addressStruct = new Struct(addressSchema) - .put("number", (byte) 100); - Struct personStruct = new Struct(personSchema) - .put("age", (byte) 75) - .put("address", addressStruct); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(personStruct.schema(), personStruct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(personStruct, convertedConnectData.value()); - } - - public void testPrimitives() { - Schema schema = SchemaBuilder.struct() - .field("int8", Schema.INT8_SCHEMA) - .field("int16", Schema.INT16_SCHEMA) - .field("int32", Schema.INT32_SCHEMA) - .field("int64", Schema.INT64_SCHEMA) - .field("float32", Schema.FLOAT32_SCHEMA) - .field("float64", Schema.FLOAT64_SCHEMA) - .field("string", Schema.STRING_SCHEMA) - .field("bytes", Schema.BYTES_SCHEMA) - .field("bool", Schema.BOOLEAN_SCHEMA) - .build(); - Struct struct = new Struct(schema) - .put("int8", Byte.MAX_VALUE) - .put("int16", Short.MAX_VALUE) - .put("int32", Integer.MAX_VALUE) - .put("int64", Long.MAX_VALUE) - .put("float32", Float.MAX_VALUE) - .put("float64", Double.MAX_VALUE) - .put("string", "A string") - .put("bytes", new byte[] {0x1}) - .put("bool", false); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(struct, convertedConnectData.value()); - } - - public void testOptionalPrimitives() { - Schema schema = SchemaBuilder.struct() - .field("int8", Schema.OPTIONAL_INT8_SCHEMA) - .field("int16", Schema.OPTIONAL_INT16_SCHEMA) - .field("int32", Schema.OPTIONAL_INT32_SCHEMA) - .field("int64", Schema.OPTIONAL_INT64_SCHEMA) - .field("float32", Schema.OPTIONAL_FLOAT32_SCHEMA) - .field("float64", Schema.OPTIONAL_FLOAT64_SCHEMA) - .field("string", Schema.OPTIONAL_STRING_SCHEMA) - .field("bytes", Schema.OPTIONAL_BYTES_SCHEMA) - .field("bool", Schema.OPTIONAL_BOOLEAN_SCHEMA) - .build(); - // First test with unset values - Struct struct = new Struct(schema); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(struct, convertedConnectData.value()); - // Now test with values set to null - struct - .put("int8", null) - .put("int16", null) - .put("int32", null) - .put("int64", null) - .put("float32", null) - .put("float64", null) - .put("string", null) - .put("bytes", null) - .put("bool", null); - convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(struct, convertedConnectData.value()); - } - - public void testList() { - Schema nestedStructSchema = SchemaBuilder.struct().field("nested", Schema.INT32_SCHEMA).build(); - Schema listSchema = SchemaBuilder.array(nestedStructSchema).build(); - Schema structSchema = SchemaBuilder.struct().field("list", listSchema).build(); - Struct nestedStruct = new Struct(nestedStructSchema).put("nested", 123); - Struct struct = new Struct(structSchema) - .put("list", Collections.singletonList(nestedStruct)); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(struct, convertedConnectData.value()); - } - - public void testMap() { - Schema nestedStructSchema = SchemaBuilder.struct().field("nested", Schema.INT32_SCHEMA).build(); - Schema mapSchema = SchemaBuilder.map(Schema.STRING_SCHEMA, nestedStructSchema).build(); - Schema structSchema = SchemaBuilder.struct().field("map", mapSchema).build(); - Struct nestedStruct = new Struct(nestedStructSchema).put("nested", 123); - Struct struct = new Struct(structSchema) - .put("map", Collections.singletonMap("test", nestedStruct)); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - assertEquals(struct, convertedConnectData.value()); - } - - public void testEnum() { - Type.Enum recapEnumType = new Type.Enum( - Arrays.asList("red", "green", "blue"), - null, - null, - Collections.singletonMap("name", "enum")); - Type.Struct recapStructType = new Type.Struct(Collections.singletonList(recapEnumType)); - Map structMap = Collections.singletonMap("enum", "red"); - Converter connectConverter = new Converter(); - SchemaAndValue convertedConnectData = connectConverter.convert(new Data(recapStructType, structMap)); - Schema structSchema = SchemaBuilder.struct().field("enum", Schema.STRING_SCHEMA).build(); - Struct struct = new Struct(structSchema).put("enum", "red"); - assertEquals(struct, convertedConnectData.value()); - } - - public void testLogicals() { - Schema schema = SchemaBuilder.struct() - .field("date", Date.SCHEMA) - .field("decimal", Decimal.schema(3)) - .field("time", Time.SCHEMA) - .field("timestamp", Timestamp.SCHEMA) - .build(); - Struct struct = new Struct(schema) - .put("date", new java.util.Date(1234567890)) - .put("decimal", new BigDecimal("123.456")) - .put("time", new java.util.Date(12345L)) - .put("timestamp", new java.util.Date(12345678901234L)); - Converter connectConverter = new Converter(); - Data convertedRecapData = connectConverter.convert(new SchemaAndValue(struct.schema(), struct)); - SchemaAndValue convertedConnectData = connectConverter.convert(convertedRecapData); - // Can't do assertEquals(struct, convertedConnectData.value()); because convertedConnectData - // inherits the `precision` parameter from recap's decimal type, but that parameter isn't in the - // original struct schema. - for (Field field : schema.fields()) { - Type.Struct recapStructType = ((Type.Struct) convertedRecapData.getType()); - Type recapFieldType = recapStructType.getFieldTypes().get(field.index()); - assertTrue(recapFieldType.getLogicalType().startsWith("build.recap.")); - assertEquals(field.schema().name(), convertedConnectData.schema().field(field.name()).schema().name()); - assertEquals(field.schema().type(), convertedConnectData.schema().field(field.name()).schema().type()); - assertEquals(struct.get(field), ((Struct) convertedConnectData.value()).get(field)); - } - } -} diff --git a/python/mkdocs.yml b/mkdocs.yml similarity index 100% rename from python/mkdocs.yml rename to mkdocs.yml diff --git a/python/pdm.lock b/pdm.lock similarity index 93% rename from python/pdm.lock rename to pdm.lock index 863a2b32..d4cc72f7 100644 --- a/python/pdm.lock +++ b/pdm.lock @@ -60,7 +60,7 @@ summary = "Fast ASN.1 parser and serializer with definitions for private keys, p [[package]] name = "astroid" -version = "2.15.3" +version = "2.15.5" requires_python = ">=3.7.2" summary = "An abstract syntax tree for Python with inference support." dependencies = [ @@ -114,7 +114,7 @@ summary = "Extensible memoizing collections and decorators" [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." @@ -153,11 +153,6 @@ version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -[[package]] -name = "commonmark" -version = "0.9.1" -summary = "Python parser for the CommonMark Markdown spec" - [[package]] name = "cramjam" version = "2.6.2" @@ -193,12 +188,12 @@ summary = "Backport of PEP 654 (exception groups)" [[package]] name = "fastapi" -version = "0.95.1" +version = "0.95.2" requires_python = ">=3.7" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" dependencies = [ "pydantic!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0,>=1.6.2", - "starlette<0.27.0,>=0.26.1", + "starlette<0.28.0,>=0.27.0", ] [[package]] @@ -222,7 +217,7 @@ summary = "A platform independent file lock." [[package]] name = "frictionless" -version = "5.12.0" +version = "5.13.1" summary = "Data management framework for Python that provides functionality to describe, extract, validate, and transform tabular data" dependencies = [ "attrs>=22.2.0", @@ -249,12 +244,12 @@ dependencies = [ [[package]] name = "frictionless" -version = "5.12.0" +version = "5.13.1" extras = ["json", "parquet"] summary = "Data management framework for Python that provides functionality to describe, extract, validate, and transform tabular data" dependencies = [ "fastparquet>=0.8", - "frictionless==5.12.0", + "frictionless==5.13.1", "ijson>=3.0", "jsonlines>=1.2", ] @@ -267,7 +262,7 @@ summary = "A list-like structure which implements collections.abc.MutableSequenc [[package]] name = "fsspec" -version = "2023.4.0" +version = "2023.5.0" requires_python = ">=3.8" summary = "File-system specification" @@ -279,13 +274,13 @@ summary = "Clean single-source support for Python 3 and 2" [[package]] name = "gcsfs" -version = "2023.4.0" +version = "2023.5.0" requires_python = ">=3.8" summary = "Convenient Filesystem interface over GCS" dependencies = [ "aiohttp!=4.0.0a0,!=4.0.0a1", "decorator>4.1.2", - "fsspec==2023.4.0", + "fsspec==2023.5.0", "google-auth-oauthlib", "google-auth>=1.2", "google-cloud-storage", @@ -467,7 +462,7 @@ summary = "A collection of framework independent HTTP protocol utils." [[package]] name = "httpx" -version = "0.24.0" +version = "0.24.1" requires_python = ">=3.7" summary = "The next generation HTTP client." dependencies = [ @@ -554,6 +549,15 @@ version = "1.9.0" requires_python = ">=3.7" summary = "A fast and thorough lazy object proxy." +[[package]] +name = "markdown-it-py" +version = "2.2.0" +requires_python = ">=3.7" +summary = "Python port of markdown-it. Markdown parsing, done right!" +dependencies = [ + "mdurl~=0.1", +] + [[package]] name = "marko" version = "1.3.0" @@ -572,6 +576,12 @@ version = "0.7.0" requires_python = ">=3.6" summary = "McCabe checker, plugin for flake8" +[[package]] +name = "mdurl" +version = "0.1.2" +requires_python = ">=3.7" +summary = "Markdown URL utilities" + [[package]] name = "multidict" version = "6.0.4" @@ -712,7 +722,7 @@ summary = "Cryptographic library for Python" [[package]] name = "pydantic" -version = "1.10.7" +version = "1.10.8" requires_python = ">=3.7" summary = "Data validation and settings management using python type hints" dependencies = [ @@ -721,12 +731,12 @@ dependencies = [ [[package]] name = "pydantic" -version = "1.10.7" +version = "1.10.8" extras = ["dotenv"] requires_python = ">=3.7" summary = "Data validation and settings management using python type hints" dependencies = [ - "pydantic==1.10.7", + "pydantic==1.10.8", "python-dotenv>=0.10.4", ] @@ -744,11 +754,11 @@ summary = "JSON Web Token implementation in Python" [[package]] name = "pylint" -version = "2.17.2" +version = "2.17.4" requires_python = ">=3.7.2" summary = "python code static checker" dependencies = [ - "astroid<=2.17.0-dev0,>=2.15.2", + "astroid<=2.17.0-dev0,>=2.15.4", "colorama>=0.4.5; sys_platform == \"win32\"", "dill>=0.2; python_version < \"3.11\"", "isort<6,>=4.2.5", @@ -769,7 +779,7 @@ dependencies = [ [[package]] name = "pyright" -version = "1.1.304" +version = "1.1.310" requires_python = ">=3.7" summary = "Command line wrapper for pyright" dependencies = [ @@ -860,12 +870,12 @@ summary = "Validating URI References per RFC 3986" [[package]] name = "rich" -version = "12.6.0" -requires_python = ">=3.6.3,<4.0.0" +version = "13.3.5" +requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" dependencies = [ - "commonmark<0.10.0,>=0.9.0", - "pygments<3.0.0,>=2.6.0", + "markdown-it-py<3.0.0,>=2.2.0", + "pygments<3.0.0,>=2.13.0", ] [[package]] @@ -879,18 +889,18 @@ dependencies = [ [[package]] name = "s3fs" -version = "2023.4.0" +version = "2023.5.0" requires_python = ">= 3.8" summary = "Convenient Filesystem interface over S3" dependencies = [ "aiobotocore~=2.5.0", "aiohttp!=4.0.0a0,!=4.0.0a1", - "fsspec==2023.4.0", + "fsspec==2023.5.0", ] [[package]] name = "setuptools" -version = "67.7.1" +version = "67.8.0" requires_python = ">=3.7" summary = "Easily download, build, install, upgrade, and uninstall Python packages" @@ -953,7 +963,7 @@ dependencies = [ [[package]] name = "sqlalchemy" -version = "1.4.47" +version = "1.4.48" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" summary = "Database Abstraction Library" dependencies = [ @@ -978,7 +988,7 @@ dependencies = [ [[package]] name = "starlette" -version = "0.26.1" +version = "0.27.0" requires_python = ">=3.7" summary = "The little ASGI library that shines." dependencies = [ @@ -1015,24 +1025,25 @@ summary = "Style preserving TOML library" [[package]] name = "typer" -version = "0.7.0" +version = "0.9.0" requires_python = ">=3.6" summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." dependencies = [ "click<9.0.0,>=7.1.1", + "typing-extensions>=3.7.4.3", ] [[package]] name = "typer" -version = "0.7.0" +version = "0.9.0" extras = ["all"] requires_python = ">=3.6" summary = "Typer, build great CLIs. Easy to code. Based on Python type hints." dependencies = [ "colorama<0.5.0,>=0.4.3", - "rich<13.0.0,>=10.11.0", + "rich<14.0.0,>=10.11.0", "shellingham<2.0.0,>=1.3.0", - "typer==0.7.0", + "typer==0.9.0", ] [[package]] @@ -1055,7 +1066,7 @@ summary = "HTTP library with thread-safe connection pooling, file post, and more [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.22.0" requires_python = ">=3.7" summary = "The lightning-fast ASGI server." dependencies = [ @@ -1065,7 +1076,7 @@ dependencies = [ [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.22.0" extras = ["standard"] requires_python = ">=3.7" summary = "The lightning-fast ASGI server." @@ -1074,7 +1085,7 @@ dependencies = [ "httptools>=0.5.0", "python-dotenv>=0.13", "pyyaml>=5.1", - "uvicorn==0.21.1", + "uvicorn==0.22.0", "uvloop!=0.15.0,!=0.15.1,>=0.14.0; sys_platform != \"win32\" and (sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\")", "watchfiles>=0.13", "websockets>=10.4", @@ -1128,6 +1139,7 @@ dependencies = [ [metadata] lock_version = "4.2" +cross_platform = true groups = ["default", "dbs", "docs", "fss", "gcp", "style", "tests"] content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d077c1bd2" @@ -1241,9 +1253,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, {url = "https://files.pythonhosted.org/packages/de/cf/d547feed25b5244fcb9392e288ff9fdc3280b10260362fc45d37a798a6ee/asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, ] -"astroid 2.15.3" = [ - {url = "https://files.pythonhosted.org/packages/5b/bc/c7d66f43e10d5f42512993fb27dc2ffbe48d8231f8dc15a5220893927554/astroid-2.15.3.tar.gz", hash = "sha256:44224ad27c54d770233751315fa7f74c46fa3ee0fab7beef1065f99f09897efe"}, - {url = "https://files.pythonhosted.org/packages/df/fe/d3d4a321e5242cc05b71ff1e43bfbe0fb6ee72d21e7ee86c73f02969168d/astroid-2.15.3-py3-none-any.whl", hash = "sha256:f11e74658da0f2a14a8d19776a8647900870a63de71db83713a8e77a6af52662"}, +"astroid 2.15.5" = [ + {url = "https://files.pythonhosted.org/packages/6f/51/868921f570a1ad2ddefd04594e1f95aacd6208c85f6b0ab75401acf65cfb/astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, + {url = "https://files.pythonhosted.org/packages/e9/8d/338debdfc65383c2e1a0eaf336810ced0e8bc58a3f64d8f957cfb7b19e84/astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, ] "async-timeout 4.0.2" = [ {url = "https://files.pythonhosted.org/packages/54/6e/9678f7b2993537452710ffb1750c62d2c26df438aa621ad5fa9d1507a43a/async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, @@ -1288,9 +1300,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/4d/91/5837e9f9e77342bb4f3ffac19ba216eef2cd9b77d67456af420e7bafe51d/cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, {url = "https://files.pythonhosted.org/packages/db/14/2b48a834d349eee94677e8702ea2ef98b7c674b090153ea8d3f6a788584e/cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, ] -"certifi 2022.12.7" = [ - {url = "https://files.pythonhosted.org/packages/37/f7/2b1b0ec44fdc30a3d31dfebe52226be9ddc40cd6c0f34ffc8923ba423b69/certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, - {url = "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, +"certifi 2023.5.7" = [ + {url = "https://files.pythonhosted.org/packages/93/71/752f7a4dd4c20d6b12341ed1732368546bc0ca9866139fe812f6009d9ac7/certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {url = "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, ] "cffi 1.15.1" = [ {url = "https://files.pythonhosted.org/packages/00/05/23a265a3db411b0bfb721bf7a116c7cecaf3eb37ebd48a6ea4dfb0a3244d/cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, @@ -1374,10 +1386,6 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -"commonmark 0.9.1" = [ - {url = "https://files.pythonhosted.org/packages/60/48/a60f593447e8f0894ebb7f6e6c1f25dafc5e89c5879fdc9360ae93ff83f0/commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, - {url = "https://files.pythonhosted.org/packages/b1/92/dfd892312d822f36c55366118b95d914e5f16de11044a27cf10a7d71bbbf/commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, -] "cramjam 2.6.2" = [ {url = "https://files.pythonhosted.org/packages/01/d6/544cee6817571dfff0567c4c2572eff91a593163f6e1fe392f54eb036254/cramjam-2.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f45b2a6776637edd5017c5c1c6a167243a8d2250698e10971ce8da015ed43442"}, {url = "https://files.pythonhosted.org/packages/03/68/b6a79d363e2796012ad1f0aae9b452050509203e7b7b0ebb0eab97b2b48f/cramjam-2.6.2.tar.gz", hash = "sha256:1ffdc8d1381b5fee57b33b537e38fa7fd29e8d8f3b544dbab1d71dbfaaec3bef"}, @@ -1479,9 +1487,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/15/ab/dd27fb742b19a9d020338deb9ab9a28796524081bca880ac33c172c9a8f6/exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, {url = "https://files.pythonhosted.org/packages/e8/14/9c6a7e5f12294ccd6975a45e02899ed25468cd7c2c86f3d9725f387f9f5f/exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, ] -"fastapi 0.95.1" = [ - {url = "https://files.pythonhosted.org/packages/2e/84/d289e941ffec2f107d9097c8f7c2dbc874b0fc3fab9776aa3cc366d45ab2/fastapi-0.95.1-py3-none-any.whl", hash = "sha256:a870d443e5405982e1667dfe372663abf10754f246866056336d7f01c21dab07"}, - {url = "https://files.pythonhosted.org/packages/a9/7b/ec011cf46d78627159ab869556f246b5f823a6df8d94f7577e043a63fffd/fastapi-0.95.1.tar.gz", hash = "sha256:9569f0a381f8a457ec479d90fa01005cfddaae07546eb1f3fa035bc4797ae7d5"}, +"fastapi 0.95.2" = [ + {url = "https://files.pythonhosted.org/packages/4e/1a/04887c641b67e6649bde845b9a631f73a7abfbe3afda83957e09b95d88eb/fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, + {url = "https://files.pythonhosted.org/packages/75/e1/976b2e281bdfb0b6690b5d3c2d932d309729e49305ef5449be381e0672a3/fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, ] "fastparquet 2023.2.0" = [ {url = "https://files.pythonhosted.org/packages/01/35/a89e737358df747857c743bcb3317fded3a05122f4c01610929eebba047b/fastparquet-2023.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3197bf76a0bf294c3da2f61fa6d830aeff13afd3f30dd4eaf6c430cc56a491d"}, @@ -1522,8 +1530,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/0b/dc/eac02350f06c6ed78a655ceb04047df01b02c6b7ea3fc02d4df24ca87d24/filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, {url = "https://files.pythonhosted.org/packages/14/4c/b201d0292ca4e0950f0741212935eac9996f69cd66b92a3587e594999163/filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, ] -"frictionless 5.12.0" = [ - {url = "https://files.pythonhosted.org/packages/5c/ff/6c5666e9687ac51ecafd530247b2f436752ab169b198eedab4a528a3095b/frictionless-5.12.0-py2.py3-none-any.whl", hash = "sha256:a88205ec556cc06b115e01035158ae1502f88fb3f19a03e919b283025cd92026"}, +"frictionless 5.13.1" = [ + {url = "https://files.pythonhosted.org/packages/3d/00/067d25bda8d84804b87c6ba75a52f6ce56a20767e47fb87655ee653079f4/frictionless-5.13.1-py2.py3-none-any.whl", hash = "sha256:8e5afc7c08364d4563797944920e044a8d37970c767c0c6920ac804a05c5f1a9"}, + {url = "https://files.pythonhosted.org/packages/3f/70/b1eec97b15e22188e79d02a6e15ad03f29dd32090a6d6974d35d79244850/frictionless-5.13.1.tar.gz", hash = "sha256:78ee7c4ea784e85ef7117f17165baf4f2728790ba9406693df8370e812726c4a"}, ] "frozenlist 1.3.3" = [ {url = "https://files.pythonhosted.org/packages/01/a3/a3c18bfd7bd2a56831b985140f98eb6dda684a2d8b2a54b1077b45c7f9d9/frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, @@ -1601,16 +1610,16 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/fa/a1/d0822eb2f827f209c8fcf19ff1c9eb30ae08e25b710cf432b1013ea23429/frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, {url = "https://files.pythonhosted.org/packages/fd/b8/9ed4ed37b2c3269660a86a10a09b2fe49dbbd6973ac684804ece7b51b63f/frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, ] -"fsspec 2023.4.0" = [ - {url = "https://files.pythonhosted.org/packages/d6/30/db3078afe553e9a07c87534cbfb87a8c8ebb083fa0a8847ca5bdc86b51a7/fsspec-2023.4.0-py3-none-any.whl", hash = "sha256:f398de9b49b14e9d84d2c2d11b7b67121bc072fe97b930c4e5668ac3917d8307"}, - {url = "https://files.pythonhosted.org/packages/d8/c3/7eb5ace7aac24890fd6f3dbf49d547305237bd4002903f19b524061ce8ae/fsspec-2023.4.0.tar.gz", hash = "sha256:bf064186cd8808f0b2f6517273339ba0a0c8fb1b7048991c28bc67f58b8b67cd"}, +"fsspec 2023.5.0" = [ + {url = "https://files.pythonhosted.org/packages/4e/5f/faee1c6261997e5b0782f48db9d01dc8ce7aa817d2016dd5cd64c60b1d86/fsspec-2023.5.0.tar.gz", hash = "sha256:b3b56e00fb93ea321bc9e5d9cf6f8522a0198b20eb24e02774d329e9c6fb84ce"}, + {url = "https://files.pythonhosted.org/packages/ec/4e/397b234a369df06ec782666fcdf9791d125ca6de48729814b381af8c6c03/fsspec-2023.5.0-py3-none-any.whl", hash = "sha256:51a4ad01a5bb66fcc58036e288c0d53d3975a0df2a5dc59a93b59bade0391f2a"}, ] "future 0.18.3" = [ {url = "https://files.pythonhosted.org/packages/8f/2e/cf6accf7415237d6faeeebdc7832023c90e0282aa16fd3263db0eb4715ec/future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, ] -"gcsfs 2023.4.0" = [ - {url = "https://files.pythonhosted.org/packages/1d/45/c81d441ff5047a8115bb0b905b7be3e2db73f43aa4dcace2e32d7fc6220c/gcsfs-2023.4.0.tar.gz", hash = "sha256:30fc1ab3b9c14eae678d3258df43520b5dd750ea92d9e2fa67cefb34f2cbd041"}, - {url = "https://files.pythonhosted.org/packages/e0/03/188fd024d870747a50efcee5f676dee2517fb854e8c6ff154a3f1edd28a9/gcsfs-2023.4.0-py2.py3-none-any.whl", hash = "sha256:53d087fc7327af4b1684cbb29e513215b5b8af5ff4029bbf81a29230cf45c911"}, +"gcsfs 2023.5.0" = [ + {url = "https://files.pythonhosted.org/packages/7e/fd/286c393076e7a101af5a2ff621413800a0055c17f64975d5e185904c1400/gcsfs-2023.5.0.tar.gz", hash = "sha256:02a815e1cf28197ab4f57335e89dc5df8744a065c7c956d42692b50a9e8f1625"}, + {url = "https://files.pythonhosted.org/packages/89/49/b3dda60874673ce331bcff25f773aa8b823ffbc505f138e9a06a6b342985/gcsfs-2023.5.0-py2.py3-none-any.whl", hash = "sha256:4f2ebc41814de3f566f85dec208704cf19823b9d04a55fd12b3142aef9046525"}, ] "genson 1.2.2" = [ {url = "https://files.pythonhosted.org/packages/e1/71/fbd2f1ad9695c92ad756b91f5a570f809c4959d3bd82266788cf222e5c5c/genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, @@ -1885,9 +1894,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/fb/8b/64c6cd4af7af7e0044047fd9b95c29ee6306685b65d6b835e55c5e1f257b/httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, {url = "https://files.pythonhosted.org/packages/fe/24/abf869224c81d8136ca14221dfa90e71612ca723d8c02e975ef7987b8319/httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, ] -"httpx 0.24.0" = [ - {url = "https://files.pythonhosted.org/packages/4e/c1/692013f1e6115a061a14f6c7d05947515a1eb7b85ef6e9bf0ffbf0e92738/httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"}, - {url = "https://files.pythonhosted.org/packages/ae/23/f7beaf11a8b95fc173b8979c4bfd23ea7711c5ebd458d657d24a59df7e9f/httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"}, +"httpx 0.24.1" = [ + {url = "https://files.pythonhosted.org/packages/ec/91/e41f64f03d2a13aee7e8c819d82ee3aa7cdc484d18c0ae859742597d5aa0/httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {url = "https://files.pythonhosted.org/packages/f8/2a/114d454cb77657dbf6a293e69390b96318930ace9cd96b51b99682493276/httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, ] "humanize 4.6.0" = [ {url = "https://files.pythonhosted.org/packages/06/b1/9e491df2ee1c919d67ee328d8bc9f17b7a9af68e4077f3f5fac83a4488c9/humanize-4.6.0.tar.gz", hash = "sha256:5f1f22bc65911eb1a6ffe7659bd6598e33dcfeeb904eb16ee1e705a09bf75916"}, @@ -2043,6 +2052,10 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/fc/8d/8e0fbfeec6e51184326e0886443e44142ce22d89fa9e9c3152900e654fa0/lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, {url = "https://files.pythonhosted.org/packages/fe/bb/0fcc8585ffb7285df94382e20b54d54ca62a1bcf594f6f18d8feb3fc3b98/lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, ] +"markdown-it-py 2.2.0" = [ + {url = "https://files.pythonhosted.org/packages/bf/25/2d88e8feee8e055d015343f9b86e370a1ccbec546f2865c98397aaef24af/markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {url = "https://files.pythonhosted.org/packages/e4/c0/59bd6d0571986f72899288a95d9d6178d0eebd70b6650f1bb3f0da90f8f7/markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, +] "marko 1.3.0" = [ {url = "https://files.pythonhosted.org/packages/72/89/f00eb9e156580a7e359fde7bb3b0ead14be3b5490bceae4acc2556893dc4/marko-1.3.0-py3-none-any.whl", hash = "sha256:f5b03e68fa2fb76810d5e51a198d343e3b35e028d45e43c543c7c45e82170b66"}, {url = "https://files.pythonhosted.org/packages/7d/b9/57dccb43ff55652e756a8374ab833146abd11911ab976b6ae6095ed88a68/marko-1.3.0.tar.gz", hash = "sha256:8e52155860ebfb0394f92bc1ca7e5a30e4fca5392d71bf2af2b11971e8972667"}, @@ -2103,6 +2116,10 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +"mdurl 0.1.2" = [ + {url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] "multidict 6.0.4" = [ {url = "https://files.pythonhosted.org/packages/00/bb/1cdffe9b1ab01830bc9255a64524c34b71c20a4affe5d1000b223a41698d/multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, {url = "https://files.pythonhosted.org/packages/0a/a1/a0446805d76fd6ada6de501c90520c963f8b5bf1f5a7a75ad80ba076897d/multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, @@ -2379,43 +2396,43 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/d1/72/d9ed0f68dfdd7322c3e0e4bcb0139b172bb66159dd2a5a95c6e2ce6f7a23/pycryptodomex-3.17-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f854c8476512cebe6a8681cc4789e4fcff6019c17baa0fd72b459155dc605ab4"}, {url = "https://files.pythonhosted.org/packages/da/5f/4b904abe20347c88df413533ac88ad813e049639cc7e356673c8fe5fa450/pycryptodomex-3.17-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:caa937ff29d07a665dfcfd7a84f0d4207b2ebf483362fa9054041d67fdfacc20"}, ] -"pydantic 1.10.7" = [ - {url = "https://files.pythonhosted.org/packages/00/43/f15d991ce715a2e7a229ef7c2534527d6fe4e5d260a675bd06615a4ede82/pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, - {url = "https://files.pythonhosted.org/packages/05/4e/92a0c1fd305f764801dba26182b08ccf72026766fc4451d88186185467f2/pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, - {url = "https://files.pythonhosted.org/packages/07/3a/5bc906697c9aa0f0fc28f81ec25995315c999fb6df7b29e56a49b08009a3/pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, - {url = "https://files.pythonhosted.org/packages/14/60/08f4b0a87561f64305002dffc5db2078043d46ed213e730a92e16840b120/pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, - {url = "https://files.pythonhosted.org/packages/21/ab/d7d0f74be71041507fe7ab1a61a71b251fc7667e720323b1f51a039370bb/pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, - {url = "https://files.pythonhosted.org/packages/2e/97/e1e06d17f0f928083c660f6750b321797371ebd43aa16eda0ae80a4d3a7c/pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, - {url = "https://files.pythonhosted.org/packages/31/9e/32896df239096e0052e390e90eb0d374367e74bf7ce603a62841310c34c7/pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, - {url = "https://files.pythonhosted.org/packages/34/d8/fd31b8172643cbf2cfd42398cba1406ea47ca1268f5e7ba48227f06c61a6/pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, - {url = "https://files.pythonhosted.org/packages/38/cb/21afb81e5b3270cf5504543fb94a0d7734c4536b98c893701842602f9da0/pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, - {url = "https://files.pythonhosted.org/packages/42/dc/092da33080729a95805e73084abf7cc064de7ae64462d1081859b2c1b7e2/pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, - {url = "https://files.pythonhosted.org/packages/43/5f/e53a850fd32dddefc998b6bfcbda843d4ff5b0dcac02a92e414ba6c97d46/pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, - {url = "https://files.pythonhosted.org/packages/5e/06/a6b6a325b4085558d48f8804433b523bf31b62e8bcad6a9f8537418240d6/pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, - {url = "https://files.pythonhosted.org/packages/67/a9/f4fde01bb028c2afd0bd053ba440f7aeb609a9dc85f5d2d41a937526dbe8/pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, - {url = "https://files.pythonhosted.org/packages/67/ac/ff5f7eca22bf58dbecfd266597e15b1ec7ddc68b886157a2095a25eedb17/pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, - {url = "https://files.pythonhosted.org/packages/73/f9/860473019e228ac0b12e5cccecc086ce1f7e41d5f1482b64b9454a528e4f/pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, - {url = "https://files.pythonhosted.org/packages/7e/2f/05c7f8dbd1de1542d7560b5e7b5aeb7d58558af2262010f8de9abb466be1/pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, - {url = "https://files.pythonhosted.org/packages/81/1b/04ce5303aee97af30b94c45699ed228b8ba6ba64c972efac184fb9a566f3/pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, - {url = "https://files.pythonhosted.org/packages/83/f2/b86db67c476177ec73fce0ea87e3fa0fd686c0602efbd4e42e5ccdb2bab9/pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, - {url = "https://files.pythonhosted.org/packages/8a/64/db1aafc37fab0dad89e0a27f120a18f2316fca704e9f95096ade47b933ac/pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, - {url = "https://files.pythonhosted.org/packages/8a/9b/4a6e7f721e54269966be968b7672f23b69d396ff59af7be6ea2e7bc30d0b/pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, - {url = "https://files.pythonhosted.org/packages/8d/e1/d9219c4e4161a511158e531a84aa719087064d208c2bf87df5c58812f190/pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, - {url = "https://files.pythonhosted.org/packages/91/b8/e02d21709db955b92125059d6f80a1a543f9cc9f60ef212621514462b4e9/pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, - {url = "https://files.pythonhosted.org/packages/a0/ef/9b9a6c4f2e520c84c86908105bdec18a06449be0b2ec5c73526eba141402/pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, - {url = "https://files.pythonhosted.org/packages/a4/cb/16648745548e4c18f4b98b7e323bbac698e77cd8fc250a6b2ff83688c95f/pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, - {url = "https://files.pythonhosted.org/packages/aa/64/1b66f84ffe07562366c5ae87e83f0b3871afefd97f0632091629e6d5cfb2/pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, - {url = "https://files.pythonhosted.org/packages/b8/b7/158fb5bf629f5a97c997711757fb14e831825872c6d091a41a769c9c69e4/pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, - {url = "https://files.pythonhosted.org/packages/c8/70/8fe094a67a9431095069f6f9eb2a893e11fdaec8c1182016f53a535adfec/pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, - {url = "https://files.pythonhosted.org/packages/c8/f3/8b3d444bdce482d6c206ab2b3ad309ae699f3074fde3d5e54c786f22b8c0/pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, - {url = "https://files.pythonhosted.org/packages/d1/a1/0aa23b545299186f6eabc7a5d289a951e6c033852938ae6673d75846e611/pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, - {url = "https://files.pythonhosted.org/packages/d5/f0/a1bab22b297fc4333d496b34e0db42bc33c85c4b0e7e7a39da76fc65a643/pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, - {url = "https://files.pythonhosted.org/packages/d6/59/8082b963e077ea4bec5bb85e8c0fc636e4e7b3484e6a8ceac94e743e3b74/pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, - {url = "https://files.pythonhosted.org/packages/dc/01/03bb09fdb5c06075c5dc79d4c68885e87fdc7e8becf347d6a1ff8f890f79/pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, - {url = "https://files.pythonhosted.org/packages/f1/bd/0dad4908e5f693b7951b68f435139ec583f5eebb3d75505e1efa0f2284fe/pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, - {url = "https://files.pythonhosted.org/packages/f6/2d/0fc591686bc119d844f26268f503a7a504fbc9dd6a02e14aa42738c21fed/pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, - {url = "https://files.pythonhosted.org/packages/fa/c2/3df79cd00e65678fce12e59e8c95378a992a93d7b9f9510d4f1f65df1936/pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, - {url = "https://files.pythonhosted.org/packages/fd/66/3da2e7c0306251435bd61ae9da52db8a00672fdf2b2db1e3efe1692f41dd/pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, +"pydantic 1.10.8" = [ + {url = "https://files.pythonhosted.org/packages/05/43/e39c6bf32695f2d568ebb2f6a3dd843c8e2edb57c77a4a911d517b5675b2/pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"}, + {url = "https://files.pythonhosted.org/packages/0b/39/afbca0ea8e766ccf04f224520b95ca29d5a18b680c0780609a2c39293f8b/pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"}, + {url = "https://files.pythonhosted.org/packages/13/dc/54ceed364e733f81596a4f113de2098221b3d39b4eb7abbffa64e681f243/pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"}, + {url = "https://files.pythonhosted.org/packages/15/27/c35f6fefc782aebcff9991b28728f3855b1253ff757e6dee8e3ac3815cd0/pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"}, + {url = "https://files.pythonhosted.org/packages/23/65/2aa13873e9e0084ecaec00fbe6c6096b65e1ab99ba66bdbf7e4e7c4cc915/pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"}, + {url = "https://files.pythonhosted.org/packages/2d/a2/e3ac01dd929485a6280518d280d8cf313558c878c91d86b3a95b1702938b/pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"}, + {url = "https://files.pythonhosted.org/packages/36/60/b24bd42bdd385fee681cc1231ef1d423566d4e33e867df4d2bd08b531466/pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"}, + {url = "https://files.pythonhosted.org/packages/56/b5/903cd28ab9a3bf8cbfbe0a6a87d9463ceac7610193cd1d72bb1bdb276d01/pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"}, + {url = "https://files.pythonhosted.org/packages/57/ce/b3de85c397a03f1c8dadebe33fa81b195b6090c840a0333769fba00693fd/pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"}, + {url = "https://files.pythonhosted.org/packages/59/ab/1de0d5386a464ef527338d320216a2f41de416e204780e00baa0e5e3b807/pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"}, + {url = "https://files.pythonhosted.org/packages/6b/15/3504de0fcb90336680916ea3fde845d01fa846c95ab4342c28d985c0d29d/pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"}, + {url = "https://files.pythonhosted.org/packages/6c/32/0755046e707a468fe276fd40df11d492a72d1cbcfa344091e3a46120131c/pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"}, + {url = "https://files.pythonhosted.org/packages/6c/f9/5edecae1914fc7dc6a566809a5242c97d63acfb92253b0bb885d890eb953/pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"}, + {url = "https://files.pythonhosted.org/packages/6f/4d/7647a5f98fbcbb9bdb1e5a77eca931a1f83255c9aa14448794a0596b5a42/pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"}, + {url = "https://files.pythonhosted.org/packages/77/ea/2b96534811f867bb53edaf2a3ca5037d8bcbceb05d5930bac5caa1fba573/pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"}, + {url = "https://files.pythonhosted.org/packages/7a/ba/439e2bc693d3f464946159a76724efc570cef9f4e27303fa3b360b2f3ef7/pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"}, + {url = "https://files.pythonhosted.org/packages/98/20/52707fc7dc91b6e580dbd30c4a6b88e426f61af9f2547bb52e880f09e67d/pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"}, + {url = "https://files.pythonhosted.org/packages/a7/27/80672dfb14e47293cca421580141ec923a1e5fe7283f775079e006b0be28/pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"}, + {url = "https://files.pythonhosted.org/packages/b2/43/8eca9ebbfd861209365c5b9f982b113275eccd892e53ab7bde60a21439e8/pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"}, + {url = "https://files.pythonhosted.org/packages/b8/45/538d65960c489a1aa9cbf1f54d4b911e1e838d557d2d2ccd1b6c8fa10f3b/pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"}, + {url = "https://files.pythonhosted.org/packages/c1/37/d136df986c0a2d20f940d360fe472ae410fba46f55a73e872fd3168f4289/pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"}, + {url = "https://files.pythonhosted.org/packages/c4/f3/c5dc9f49783a6407487d20c9a32bca878ebf2df155b8d2858838d79b6d46/pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"}, + {url = "https://files.pythonhosted.org/packages/c5/58/71d48d4154e5845192f4ccc6c6ebcf6fa5286fa3bcb3c595aa18a5bf599d/pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"}, + {url = "https://files.pythonhosted.org/packages/ca/5b/8b2c49589c826bf2796fc523d77d46fed2e82585c87c812f289ce244c88b/pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"}, + {url = "https://files.pythonhosted.org/packages/cc/a4/354a73bb8a06df0df0bc74b5fbf3b9510ed4900185f86a00861dcfbe60c7/pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"}, + {url = "https://files.pythonhosted.org/packages/d8/7b/ca035af1833c6d047eeb328438a2ae402d03929be2055cd66294542a814d/pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"}, + {url = "https://files.pythonhosted.org/packages/dc/92/3a09ec18592ca6fc96223b42ad20c8711847a8d2e1800779f9206c2fa6a2/pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"}, + {url = "https://files.pythonhosted.org/packages/e2/21/e6f68631ec2f0470e28722d1ca352bac4f25aef6eb18b8e65ba3cd9ae8a2/pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"}, + {url = "https://files.pythonhosted.org/packages/e6/dd/6f9ef794df128746581bd5886c6382a19f1729ff39f3d65e66e3b6751c7a/pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"}, + {url = "https://files.pythonhosted.org/packages/e7/a3/329824b0e46edcb2c51f0fa73678f24aba083289697a0db3036f4f30e1ed/pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"}, + {url = "https://files.pythonhosted.org/packages/e8/b3/b748afd5f4fd8f640e08cf4828fa5c9da865353eade18b9c789726b1a0ce/pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"}, + {url = "https://files.pythonhosted.org/packages/e9/17/a840d0631a288a4400e23a9ec96d131bd07be820fe2c1d070995de6dfb61/pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"}, + {url = "https://files.pythonhosted.org/packages/fa/3b/279a13153350b688fb5eb557acf980059a21ffede20d9b6fbc5368778bf4/pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"}, + {url = "https://files.pythonhosted.org/packages/fb/46/723587abb4aecf82edcfaa213a827d61854ebcbf76b4818cbf59c8868f4e/pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"}, + {url = "https://files.pythonhosted.org/packages/fe/26/66c9ac1e21a3bda4f5c10785b3ff199e12e2d1e984780a8bfa796bb4e2f0/pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"}, + {url = "https://files.pythonhosted.org/packages/ff/b4/b56bd5f591969df63a260555a891bf953536eefcbe66b711b80f86acc3a4/pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"}, ] "pygments 2.14.0" = [ {url = "https://files.pythonhosted.org/packages/0b/42/d9d95cc461f098f204cd20c85642ae40fbff81f74c300341b8d0e0df14e0/Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, @@ -2425,17 +2442,17 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/40/46/505f0dd53c14096f01922bf93a7abb4e40e29a06f858abbaa791e6954324/PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, {url = "https://files.pythonhosted.org/packages/75/65/db64904a7f23e12dbf0565b53de01db04d848a497c6c9b87e102f74c9304/PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, ] -"pylint 2.17.2" = [ - {url = "https://files.pythonhosted.org/packages/00/06/24c4d02c247fbca313fc9fda9033996d337f93c29a02ccd4f031c7c80d5d/pylint-2.17.2.tar.gz", hash = "sha256:1b647da5249e7c279118f657ca28b6aaebb299f86bf92affc632acf199f7adbb"}, - {url = "https://files.pythonhosted.org/packages/05/c7/bccabc2b93c612d2921a229455fc0c1acfcad7e80ffeea6bf22d74b601d7/pylint-2.17.2-py3-none-any.whl", hash = "sha256:001cc91366a7df2970941d7e6bbefcbf98694e00102c1f121c531a814ddc2ea8"}, +"pylint 2.17.4" = [ + {url = "https://files.pythonhosted.org/packages/04/4c/3f7d42a1378c40813772bc5f25184144da09f00ffbe3f60ae985ffa7e10f/pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, + {url = "https://files.pythonhosted.org/packages/7e/d4/aba77d10841710fea016422f419dfe501dee05fa0fc3898dc048f7bf3f60/pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, ] "pyopenssl 22.1.0" = [ {url = "https://files.pythonhosted.org/packages/00/3f/ea5cfb789dddb327e6d2cf9377c36d9d8607af85530af0e7001165587ae7/pyOpenSSL-22.1.0-py3-none-any.whl", hash = "sha256:b28437c9773bb6c6958628cf9c3bebe585de661dba6f63df17111966363dd15e"}, {url = "https://files.pythonhosted.org/packages/e7/2f/c6d89edac75482f11e231b644e365d31d5479b7b727734e6a8f3d00decd5/pyOpenSSL-22.1.0.tar.gz", hash = "sha256:7a83b7b272dd595222d672f5ce29aa030f1fb837630ef229f62e72e395ce8968"}, ] -"pyright 1.1.304" = [ - {url = "https://files.pythonhosted.org/packages/40/dc/1cb8b90aae25a597fd5c17f29b49e3eadc751b353706234ba026a22793a1/pyright-1.1.304.tar.gz", hash = "sha256:87adec38081904c939e3657ab23d5fc40b7ccc22709be0af1859fc785ae4ea61"}, - {url = "https://files.pythonhosted.org/packages/8d/68/84f64dff33655a42dec9097a33f45eed8fd389a348c5070f60c30a192891/pyright-1.1.304-py3-none-any.whl", hash = "sha256:70021bbae07fc28ed16e435f5efa65cd71e06a1888d9ca998798c283d4b3d010"}, +"pyright 1.1.310" = [ + {url = "https://files.pythonhosted.org/packages/63/d6/db08be784685cb355d1aa52ad100142189509c41a9e9355acdce35880f42/pyright-1.1.310-py3-none-any.whl", hash = "sha256:55995ac76bf56cb7a44193b7b1ffafc573abab1f1dbc9f62d327f2a1768b3bda"}, + {url = "https://files.pythonhosted.org/packages/b1/1c/a67edbdf6b63006e4475cc9affcc71828040409431368d90251962fe7271/pyright-1.1.310.tar.gz", hash = "sha256:9e95335a678db2717eaa0c867d61f9399e916289f4a9f47d993e0df74e7d7391"}, ] "pyrsistent 0.19.3" = [ {url = "https://files.pythonhosted.org/packages/07/d2/0e72806d668c001d13885e8d7c78fefa5a649c34ad9d77b90eb472096ae7/pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, @@ -2540,21 +2557,21 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/79/30/5b1b6c28c105629cc12b33bdcbb0b11b5bb1880c6cfbd955f9e792921aa8/rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, {url = "https://files.pythonhosted.org/packages/c4/e5/63ca2c4edf4e00657584608bee1001302bbf8c5f569340b78304f2f446cb/rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, ] -"rich 12.6.0" = [ - {url = "https://files.pythonhosted.org/packages/11/23/814edf09ec6470d52022b9e95c23c1bef77f0bc451761e1504ebd09606d3/rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, - {url = "https://files.pythonhosted.org/packages/32/60/81ac2e7d1e3b861ab478a72e3b20fc91c4302acd2274822e493758941829/rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, +"rich 13.3.5" = [ + {url = "https://files.pythonhosted.org/packages/39/03/6de23bdd88f5ee7f8b03f94f6e88108f5d7ffe6d207e95cdb06d9aa4cd57/rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {url = "https://files.pythonhosted.org/packages/3d/0b/8dd34d20929c4b5e474db2e64426175469c2b7fea5ba71c6d4b3397a9729/rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, ] "rsa 4.9" = [ {url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, ] -"s3fs 2023.4.0" = [ - {url = "https://files.pythonhosted.org/packages/59/cf/fc3a89633285718f2a6d44ca10b32c84befac38414cd8a6c4f0659ede2f8/s3fs-2023.4.0.tar.gz", hash = "sha256:963ee2e070e03e2952d535dbc6fd2b341869fcd16006cf74b90bcf39fd26cded"}, - {url = "https://files.pythonhosted.org/packages/a8/f7/0225656c90c7cea36c38f7e15904e60033af58527c5cee48a0d477ef35d8/s3fs-2023.4.0-py3-none-any.whl", hash = "sha256:be0afe8f01c67951566d6e9b8a954eaf09b674a4a28002d08eecde29c74a3310"}, +"s3fs 2023.5.0" = [ + {url = "https://files.pythonhosted.org/packages/17/44/513d90e312d31d3f6ff9d171a411a6fbcf9f51a04d8cb600ee2d3a220835/s3fs-2023.5.0.tar.gz", hash = "sha256:106b5d9a1000e6af413f918156ba4b96789ac832b7e08c99d186eb08164e6981"}, + {url = "https://files.pythonhosted.org/packages/3a/04/c1ed8ae87a3ea12f7ccfe1376d7ae338f1bc1f03d1581b5db395776047d6/s3fs-2023.5.0-py3-none-any.whl", hash = "sha256:0d82c4fa43d1214117f56b239c3e03c9a2886f41c31000c1c967ac6030d20362"}, ] -"setuptools 67.7.1" = [ - {url = "https://files.pythonhosted.org/packages/01/18/73f7ca619f72b22300493451350214d3a035e7fa8f17ce31db2da24fe0c9/setuptools-67.7.1.tar.gz", hash = "sha256:bb16732e8eb928922eabaa022f881ae2b7cdcfaf9993ef1f5e841a96d32b8e0c"}, - {url = "https://files.pythonhosted.org/packages/47/6a/dfaf9838b6dd1f04537c0a66cf880dd24acd829f8a39d468c11fc0b7d8c6/setuptools-67.7.1-py3-none-any.whl", hash = "sha256:6f0839fbdb7e3cfef1fc38d7954f5c1c26bf4eebb155a55c9bf8faf997b9fb67"}, +"setuptools 67.8.0" = [ + {url = "https://files.pythonhosted.org/packages/03/20/630783571e76e5fa5f3e9f29398ca3ace377207b8196b54e0ffdf09f12c1/setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, + {url = "https://files.pythonhosted.org/packages/f5/2c/074ab1c5be9c7d523d8d6d69d1f46f450fe7f11713147dc9e779aa4ca4ea/setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, ] "shellingham 1.5.0.post1" = [ {url = "https://files.pythonhosted.org/packages/1f/13/fab0a3f512478bc387b66c51557ee715ede8e9811c77ce952f9b9a4d8ac1/shellingham-1.5.0.post1.tar.gz", hash = "sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28"}, @@ -2598,56 +2615,56 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/2f/fd/5551cd9d8d9473239cec8304c2847590ffcf6dc58da7a6ddc7b483394bd8/snowflake-sqlalchemy-1.4.7.tar.gz", hash = "sha256:64f0d5c0f73808ab5f52d7212698a5ec4cd63656f068fe6d4e9bddc05c0e367a"}, {url = "https://files.pythonhosted.org/packages/5f/56/80f12b51606b13d8768ea7837e3d32140c80468584ab8b1ec23a29b9afd9/snowflake_sqlalchemy-1.4.7-py2.py3-none-any.whl", hash = "sha256:0b8209fb3155f1c497f77909a9a02f5509433e69626b3577a40b1cb425020c2a"}, ] -"sqlalchemy 1.4.47" = [ - {url = "https://files.pythonhosted.org/packages/10/a6/ff0566e8225e28d22bfa357a6417a56beacef47e45567dadd82828f6bd97/SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, - {url = "https://files.pythonhosted.org/packages/14/3c/12881676d5e05366ff9bde9b8415a83487d3f49041d4545b3802542b01f7/SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, - {url = "https://files.pythonhosted.org/packages/2e/5f/9b85b02c10252bcba24eec6aff2e2f1ce128ac8a5ed7815369d3a2793c66/SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, - {url = "https://files.pythonhosted.org/packages/32/67/254ae35c568c132242f02d669b885cd22d03281f063c54b1b514374dc356/SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, - {url = "https://files.pythonhosted.org/packages/3b/75/631d0f0559de053c9486e1d9920c2295d7e7e70cbbc193b387e52c29ac78/SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, - {url = "https://files.pythonhosted.org/packages/3f/63/8e411418c583d81634ee87b2f5037a22952eaffc4ec7d7432291abc5fcef/SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, - {url = "https://files.pythonhosted.org/packages/4e/22/6758fbd40576fa33229ef8ee0a477abef48317b402f195617eaf23088c16/SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, - {url = "https://files.pythonhosted.org/packages/56/03/910e3eaa217f931b9921681a889a58fd8adb4700844b6517abfd5fb6ef2d/SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, - {url = "https://files.pythonhosted.org/packages/56/68/0fc16c12fbe16e159877876c3b90e3ecee0fa36864e649d0d3e928176652/SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, - {url = "https://files.pythonhosted.org/packages/5e/9f/d77d91aa2dba1df496969ecc9054a309bf21a4464e878f5be9cf5de93b92/SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, - {url = "https://files.pythonhosted.org/packages/61/ad/6e6a682c182459fa4a610530bff9ac48754285ca25475698c0ad478af807/SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, - {url = "https://files.pythonhosted.org/packages/6c/93/4d2f448a92852efc2b8518da6f25db2ea0f44f9f77c96c48c4f71d7b862f/SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, - {url = "https://files.pythonhosted.org/packages/6f/d1/1bcdd2f661d1bd63a8209c3fdaec9acf5f57de20c7da825afa41f2d8a245/SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, - {url = "https://files.pythonhosted.org/packages/70/2a/3444a79ba91c88ef4f5765c6b448aaed763c576f6aa5062ea1c21cd62214/SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, - {url = "https://files.pythonhosted.org/packages/79/16/e4039979ee8d9d85f4a642efe3a8e1208aaa3525929aad3bf36e96a25770/SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, - {url = "https://files.pythonhosted.org/packages/7b/3d/5b041e651cf58d29895aca46093cae2bf4b82a73678f538b335ed9b97158/SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, - {url = "https://files.pythonhosted.org/packages/7e/b3/876096a6895b1ee0da837896a7c5dbf38e371ce85bed3316fbd1fe4c1183/SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, - {url = "https://files.pythonhosted.org/packages/83/5a/34730ef7c315337b0125deecfb7173a397ef0a63ee6cac3c61762ff23210/SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, - {url = "https://files.pythonhosted.org/packages/87/42/5e606be4e27c12da5316bc69de316b6327dcb9157eaf65acf1b6d0b9dde8/SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, - {url = "https://files.pythonhosted.org/packages/8d/78/e4c2076e6d8cc8e4f27c6cfe19c9bd5b43399d4a7f55cf39f0c7d1307b84/SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, - {url = "https://files.pythonhosted.org/packages/92/42/4b21bd464be188cc6aac800b7b1e9517871d89c9099c2218e34317aa15f7/SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, - {url = "https://files.pythonhosted.org/packages/98/5a/52aaa9da3cecbb1ce141b70e228263dd48153d6a474069980ab63fb49d87/SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, - {url = "https://files.pythonhosted.org/packages/9d/5d/d03ccb046fa7245306d519195c458e94d71e0721678e3ff62094f5830e09/SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, - {url = "https://files.pythonhosted.org/packages/a0/08/3e8923b1094b61736960dc372633b0dfddbf2e12f5a0b8dd1203f7dcc8f7/SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, - {url = "https://files.pythonhosted.org/packages/aa/aa/53779d53ee049ec7cde65945898c5b20a8efb4f548d9483963f9390d4ddf/SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, - {url = "https://files.pythonhosted.org/packages/ae/65/b9f8ff373b418fed65932696afbf66b3facc05dab028d85dac3707452de6/SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, - {url = "https://files.pythonhosted.org/packages/ae/b4/7d016b07fad0aa9a77d4e08cba500035e934e525b911798e94806b4ee031/SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, - {url = "https://files.pythonhosted.org/packages/b0/99/c2a52342bbce18b5f164039cdc2b12f830ca0c6ba7e93f5bb030adbbf0ee/SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, - {url = "https://files.pythonhosted.org/packages/b3/a4/83e82039405186102842ccc7a522b67dcca7a500ccd5686467f53e32b9e3/SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, - {url = "https://files.pythonhosted.org/packages/b4/1f/3e759e8b30074478cf80c860bc644fd5d60f340d9ace0909ceadb967587a/SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, - {url = "https://files.pythonhosted.org/packages/bb/94/4e98fc6e59b4805296ce80977b8c9fdef6ffc302b52b285bd4d6dc6f8b52/SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, - {url = "https://files.pythonhosted.org/packages/bc/db/fbdc28811fa08b80a2e0ec50aaf27c47ebc1b98caed979ac8196013352a8/SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, - {url = "https://files.pythonhosted.org/packages/bc/ee/e7678a05310ebeba2655e4651426e3933cd3d076c57bf2df5e0a827ec3e6/SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, - {url = "https://files.pythonhosted.org/packages/ca/fa/d6c0f523a9f82c63860b49acfd4c6893ec54232c5a7abcecc30598f9226a/SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, - {url = "https://files.pythonhosted.org/packages/cb/c6/ce5fb8fc934dc3995e9e2e73f5493ab9e4c7e643f8c3765d875c09a8e77f/SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, - {url = "https://files.pythonhosted.org/packages/dd/50/19470f1df75b73e7fda397b8fbfc067fcd010a4080e603d36c9b3bf400ec/SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, - {url = "https://files.pythonhosted.org/packages/e7/aa/0387f229736bf2fefea425994ef473bb28cbef5dff9a83db26a3ff2cb0cb/SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, - {url = "https://files.pythonhosted.org/packages/ec/20/6088274a51b320db052ee0bb03f66d189cfcda170dae5ade876ea2bb76be/SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, - {url = "https://files.pythonhosted.org/packages/f4/79/d35283a9a335b83f2f0c45df1d4e187fdb239518f67cc81f2e9c0cd843ce/SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, - {url = "https://files.pythonhosted.org/packages/fa/42/4d20bc839294f99285ad20a6a3d9a751a70b2829f537e9191d61f32b5993/SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, - {url = "https://files.pythonhosted.org/packages/fb/1e/6fd721b58448a70d563c6adce617a6f26e538e3db7b568bb2c4e0aa3adfb/SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, +"sqlalchemy 1.4.48" = [ + {url = "https://files.pythonhosted.org/packages/02/27/bd153ccafb21cef8dc3c480985e30da903e3c29a854a19386af76d1e1b1b/SQLAlchemy-1.4.48-cp36-cp36m-win_amd64.whl", hash = "sha256:25887b4f716e085a1c5162f130b852f84e18d2633942c8ca40dfb8519367c14f"}, + {url = "https://files.pythonhosted.org/packages/02/7a/a3568442fcae49073caee663f9fe100090f46fd031393c5dbfe56124cf5d/SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b55252d2ca42a09bcd10a697fa041e696def9dfab0b78c0aaea1485551a08"}, + {url = "https://files.pythonhosted.org/packages/06/82/c273ae3003b427fa41df06b75d7665eb86199a92eb265c14bf63692cb873/SQLAlchemy-1.4.48-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:066c2b0413e8cb980e6d46bf9d35ca83be81c20af688fedaef01450b06e4aa5e"}, + {url = "https://files.pythonhosted.org/packages/10/d2/df7e401fd1fef661df29cedaf51cafb06694623b9cec84197d8448381806/SQLAlchemy-1.4.48-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1fc046756cf2a37d7277c93278566ddf8be135c6a58397b4c940abf837011f4"}, + {url = "https://files.pythonhosted.org/packages/1a/14/0e14f5ce169f961677077f67545c4eee6ccdb9f519477d520d54f1e38770/SQLAlchemy-1.4.48-cp310-cp310-win32.whl", hash = "sha256:d53cd8bc582da5c1c8c86b6acc4ef42e20985c57d0ebc906445989df566c5603"}, + {url = "https://files.pythonhosted.org/packages/1f/39/8f86e46cdbd7590671907ccd351bb8589677eb1cba9811cd64e38bc19d55/SQLAlchemy-1.4.48-cp39-cp39-win32.whl", hash = "sha256:eee09350fd538e29cfe3a496ec6f148504d2da40dbf52adefb0d2f8e4d38ccc4"}, + {url = "https://files.pythonhosted.org/packages/26/eb/365267460132cfe79822e9f2820323993c94189b69ced91a874b1f8ee517/SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0808ad34167f394fea21bd4587fc62f3bd81bba232a1e7fbdfa17e6cfa7cd7"}, + {url = "https://files.pythonhosted.org/packages/2e/5a/b16d79fc5c56dc2b038647449001cd8e69625b2f5f38d0121820dd4a2233/SQLAlchemy-1.4.48-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9af1db7a287ef86e0f5cd990b38da6bd9328de739d17e8864f1817710da2d217"}, + {url = "https://files.pythonhosted.org/packages/2f/56/807e68621d4947af55a17aac9887f50ed400a223ca9dcab30531cc25fdd2/SQLAlchemy-1.4.48-cp39-cp39-win_amd64.whl", hash = "sha256:7ad2b0f6520ed5038e795cc2852eb5c1f20fa6831d73301ced4aafbe3a10e1f6"}, + {url = "https://files.pythonhosted.org/packages/37/30/3225c70e4f61ab540b21e8cb94265dadd562c1919937420e3dc9d9396b1d/SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:68413aead943883b341b2b77acd7a7fe2377c34d82e64d1840860247cec7ff7c"}, + {url = "https://files.pythonhosted.org/packages/38/5f/6df9c80aea80ae427199714a007df609585c8e65da4fb39835bb7b9a4da2/SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99bf13e07140601d111a7c6f1fc1519914dd4e5228315bbda255e08412f61a4"}, + {url = "https://files.pythonhosted.org/packages/52/4c/8f2a0cdd0bd57370838a96bfd610d08f01b864d7b5c95690ae928e3bbbe4/SQLAlchemy-1.4.48-cp310-cp310-win_amd64.whl", hash = "sha256:4355e5915844afdc5cf22ec29fba1010166e35dd94a21305f49020022167556b"}, + {url = "https://files.pythonhosted.org/packages/56/a8/02127ba289999dff0701fdfc6acd030aea0fc02c3f940f3cb98b7eea9a85/SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:005e942b451cad5285015481ae4e557ff4154dde327840ba91b9ac379be3b6ce"}, + {url = "https://files.pythonhosted.org/packages/56/f9/6c75613201e50dbc5d438dbadc38a0a772208931b345fa7d16081433223e/SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:87609f6d4e81a941a17e61a4c19fee57f795e96f834c4f0a30cee725fc3f81d9"}, + {url = "https://files.pythonhosted.org/packages/5d/07/b8cbe6f4535fd2d1b84b9d07ef882d42864ceaee59ca03b6fff91a0a7f05/SQLAlchemy-1.4.48-cp36-cp36m-win32.whl", hash = "sha256:e3e98d4907805b07743b583a99ecc58bf8807ecb6985576d82d5e8ae103b5272"}, + {url = "https://files.pythonhosted.org/packages/61/df/4e0f3d9a442a8bb75aeffa2fd780af11b8a82cf0b5eeb8574eb747b4f241/SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8cfe951ed074ba5e708ed29c45397a95c4143255b0d022c7c8331a75ae61f3"}, + {url = "https://files.pythonhosted.org/packages/63/4b/f25378dfaddd294b7d0b893b833ed824dedcd31f6e99f480e449d984613b/SQLAlchemy-1.4.48-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4bac3aa3c3d8bc7408097e6fe8bf983caa6e9491c5d2e2488cfcfd8106f13b6a"}, + {url = "https://files.pythonhosted.org/packages/76/7a/0ab9f8204ffd422c4c385e4d86e071f0847d28a9bbb281c87736d64fe56c/SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6dab89874e72a9ab5462997846d4c760cdb957958be27b03b49cf0de5e5c327c"}, + {url = "https://files.pythonhosted.org/packages/78/57/572bfc630f5a60e631d7a35cd3f8e9f89bdb03d24fec2a686e75d3749195/SQLAlchemy-1.4.48-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ce7915eecc9c14a93b73f4e1c9d779ca43e955b43ddf1e21df154184f39748e5"}, + {url = "https://files.pythonhosted.org/packages/78/9c/8aeb443ebb829239b18a3668a7df5c51e10b2efdf77bd7efdbe2d0043c9b/SQLAlchemy-1.4.48-cp27-cp27m-win_amd64.whl", hash = "sha256:627e04a5d54bd50628fc8734d5fc6df2a1aa5962f219c44aad50b00a6cdcf965"}, + {url = "https://files.pythonhosted.org/packages/7a/62/d39a403944c41db87e29ee1b87304371d28930ba7086f8541f51c6381e83/SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d29a3fc6d9c45962476b470a81983dd8add6ad26fdbfae6d463b509d5adcda"}, + {url = "https://files.pythonhosted.org/packages/88/76/13d1f11a3bac70510ac4c5db61371d9bf2b3fa0b4c4d0beb2b4c0c9697e7/SQLAlchemy-1.4.48-cp27-cp27m-win32.whl", hash = "sha256:cbbe8b8bffb199b225d2fe3804421b7b43a0d49983f81dc654d0431d2f855543"}, + {url = "https://files.pythonhosted.org/packages/8c/2e/c3918f1717dc7c0e678afde023bcbf1c0df4f4995a45782eb8f164f033df/SQLAlchemy-1.4.48-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0817c181271b0ce5df1aa20949f0a9e2426830fed5ecdcc8db449618f12c2730"}, + {url = "https://files.pythonhosted.org/packages/8c/3a/da494335eadc2a2c6334fa657921476e78f698e3559c8170aab17989f22e/SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc2ab4d9f6d9218a5caa4121bdcf1125303482a1cdcfcdbd8567be8518969c0"}, + {url = "https://files.pythonhosted.org/packages/8c/56/e737235cbf33473c117d5aeb5aadf52b30654233388c7bd2742bb47d0a7c/SQLAlchemy-1.4.48-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:92e6133cf337c42bfee03ca08c62ba0f2d9695618c8abc14a564f47503157be9"}, + {url = "https://files.pythonhosted.org/packages/91/b3/5b869b774e2c9bd901d1857420f79bc18b118b6472f31990caef26ba2003/SQLAlchemy-1.4.48-cp311-cp311-win32.whl", hash = "sha256:49c312bcff4728bffc6fb5e5318b8020ed5c8b958a06800f91859fe9633ca20e"}, + {url = "https://files.pythonhosted.org/packages/96/d2/e6b6974af5f4e2eb56e521a006506b1b05a1bd1c3c0acb967e73a1c82b3d/SQLAlchemy-1.4.48-cp37-cp37m-win_amd64.whl", hash = "sha256:eb5464ee8d4bb6549d368b578e9529d3c43265007193597ddca71c1bae6174e6"}, + {url = "https://files.pythonhosted.org/packages/a7/f7/cba2ca9f8663d392727caee75ab5f0a853c5b1053d57de0590fb35aefb12/SQLAlchemy-1.4.48-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3509159e050bd6d24189ec7af373359f07aed690db91909c131e5068176c5a5d"}, + {url = "https://files.pythonhosted.org/packages/a9/8f/245ef21625d2c6f93f33eaca21d98935acbf15c4d93b4abbacf0e435cc03/SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f82d8efea1ca92b24f51d3aea1a82897ed2409868a0af04247c8c1e4fef5890"}, + {url = "https://files.pythonhosted.org/packages/b0/2c/decd44e3b1a792131a7e002d07d0daf19fefdad87404f40df27e8e18b094/SQLAlchemy-1.4.48-cp38-cp38-win_amd64.whl", hash = "sha256:2b562e9d1e59be7833edf28b0968f156683d57cabd2137d8121806f38a9d58f4"}, + {url = "https://files.pythonhosted.org/packages/b9/7a/6f075e189257f2b70cca85b6f3afeb7ca9cef80f0869e9f43b3e3eadd66d/SQLAlchemy-1.4.48.tar.gz", hash = "sha256:b47bc287096d989a0838ce96f7d8e966914a24da877ed41a7531d44b55cdb8df"}, + {url = "https://files.pythonhosted.org/packages/c0/54/cabea7d0f8205f94eb2b4d326263174d45bf3e4fa0b642428414c9678d73/SQLAlchemy-1.4.48-cp37-cp37m-win32.whl", hash = "sha256:11c6b1de720f816c22d6ad3bbfa2f026f89c7b78a5c4ffafb220e0183956a92a"}, + {url = "https://files.pythonhosted.org/packages/c3/e5/8e29370d82a4c19620b0d669297f8fd55df4cb57d902b787db731a3ba82b/SQLAlchemy-1.4.48-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbcae0e528d755f4522cad5842f0942e54b578d79f21a692c44d91352ea6d64e"}, + {url = "https://files.pythonhosted.org/packages/cf/4d/62ac13eef2cbad6f5f06900466a570df9a202f4e9f57e9f0da76fc2ba652/SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5381ddd09a99638f429f4cbe1b71b025bed318f6a7b23e11d65f3eed5e181c33"}, + {url = "https://files.pythonhosted.org/packages/d8/e1/a989b9638ee81e07f78bfaa21bd8d917e4366bb48f5f5c7b6cca30306609/SQLAlchemy-1.4.48-cp38-cp38-win32.whl", hash = "sha256:2b9af65cc58726129d8414fc1a1a650dcdd594ba12e9c97909f1f57d48e393d3"}, + {url = "https://files.pythonhosted.org/packages/d9/2a/d2a38c5b870cbd56c789f6d5eed6685d1b04af6b202a91f97ca65db70891/SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd8b5ee5a3acc4371f820934b36f8109ce604ee73cc668c724abb054cebcb6e"}, + {url = "https://files.pythonhosted.org/packages/dd/62/01343d46a0f8652bcff2528a8cc2eb6889a25cdcd9f4edd2ffeb3e7f8d66/SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1dd2562313dd9fe1778ed56739ad5d9aae10f9f43d9f4cf81d65b0c85168bb"}, + {url = "https://files.pythonhosted.org/packages/dd/a3/b4602b7593da6d9f68cdc8ea7938245aa213e09a95999c053ec7dfa06d25/SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee26276f12614d47cc07bc85490a70f559cba965fb178b1c45d46ffa8d73fda"}, + {url = "https://files.pythonhosted.org/packages/dd/cd/ca073049385c86d759900891962c6e10776f07cb3bae467b1a9248d1bff7/SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1ddbbcef9bcedaa370c03771ebec7e39e3944782bef49e69430383c376a250b"}, + {url = "https://files.pythonhosted.org/packages/e3/0c/817243f90e6614f7fd6a01370a590f6176a36a2e1f9ebf6226c160a5d8cb/SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbde5642104ac6e95f96e8ad6d18d9382aa20672008cf26068fe36f3004491df"}, + {url = "https://files.pythonhosted.org/packages/f7/1a/86055cc600d9b97b161270ae822488f6735daa5aeb5f456d4f12c1c24d99/SQLAlchemy-1.4.48-cp311-cp311-win_amd64.whl", hash = "sha256:cef2e2abc06eab187a533ec3e1067a71d7bbec69e582401afdf6d8cad4ba3515"}, ] "sqlalchemy-bigquery 1.6.1" = [ {url = "https://files.pythonhosted.org/packages/21/0d/dfb74d4d55c24fd5805b624359d6b0a8f8b9a27fbe59b6d1260d5d5d4ec1/sqlalchemy-bigquery-1.6.1.tar.gz", hash = "sha256:352fe5e1d2a9d2991a88c501a97624912e4b59b4b5c0d6a98c63b7228f37ea4e"}, {url = "https://files.pythonhosted.org/packages/63/13/691bdb7c0eecc2a848cc34882baf485331d86fe9bb37a9f57a66eca80e8b/sqlalchemy_bigquery-1.6.1-py2.py3-none-any.whl", hash = "sha256:e9ce790d5172fbcc867b4fc92ec5047ad5e906e0121691907aab86e8a69adb65"}, ] -"starlette 0.26.1" = [ - {url = "https://files.pythonhosted.org/packages/12/48/f9c1ec6bee313aba264fbc2483d9070f4e4526f2538e2b55b1e4a391d938/starlette-0.26.1-py3-none-any.whl", hash = "sha256:e87fce5d7cbdde34b76f0ac69013fd9d190d581d80681493016666e6f96c6d5e"}, - {url = "https://files.pythonhosted.org/packages/52/55/98746af96f57a0ff4f108c5ac84c130af3c4e291272acf446afc67d5d5d8/starlette-0.26.1.tar.gz", hash = "sha256:41da799057ea8620e4667a3e69a5b1923ebd32b1819c8fa75634bbe8d8bea9bd"}, +"starlette 0.27.0" = [ + {url = "https://files.pythonhosted.org/packages/06/68/559bed5484e746f1ab2ebbe22312f2c25ec62e4b534916d41a8c21147bf8/starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {url = "https://files.pythonhosted.org/packages/58/f8/e2cca22387965584a409795913b774235752be4176d276714e15e1a58884/starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, ] "stringcase 1.2.0" = [ {url = "https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, @@ -2668,9 +2685,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/2b/df/971fa5db3250bb022105d17f340339370f73d502e65e687a94ca1a4c4b1f/tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, {url = "https://files.pythonhosted.org/packages/ff/04/58b4c11430ed4b7b8f1723a5e4f20929d59361e9b17f0872d69681fd8ffd/tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, ] -"typer 0.7.0" = [ - {url = "https://files.pythonhosted.org/packages/0d/44/56c3f48d2bb83d76f5c970aef8e2c3ebd6a832f09e3621c5395371fe6999/typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, - {url = "https://files.pythonhosted.org/packages/e1/45/bcbc581f87c8d8f2a56b513eb994d07ea4546322818d95dc6a3caf2c928b/typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, +"typer 0.9.0" = [ + {url = "https://files.pythonhosted.org/packages/5b/49/39f10d0f75886439ab3dac889f14f8ad511982a754e382c9b6ca895b29e9/typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, + {url = "https://files.pythonhosted.org/packages/bf/0e/c68adf10adda05f28a6ed7b9f4cd7b8e07f641b44af88ba72d9c89e4de7a/typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, ] "typing-extensions 4.4.0" = [ {url = "https://files.pythonhosted.org/packages/0b/8e/f1a0a5a76cfef77e1eb6004cb49e5f8d72634da638420b9ea492ce8305e8/typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, @@ -2684,9 +2701,9 @@ content_hash = "sha256:db83ecbe0417a827f1dfa69c6b457c254574e90bffcf81e38b17380d0 {url = "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, {url = "https://files.pythonhosted.org/packages/fe/ca/466766e20b767ddb9b951202542310cba37ea5f2d792dae7589f1741af58/urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, ] -"uvicorn 0.21.1" = [ - {url = "https://files.pythonhosted.org/packages/8c/f1/7c45fe2a09133e103dcf0621831545c268cd3f7a5d58dc7e470be91b2cd0/uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, - {url = "https://files.pythonhosted.org/packages/ea/fa/362dc074f4c886e4bff1d994ed1929ed2c2a5ba85827d8f1d745fbe66de2/uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, +"uvicorn 0.22.0" = [ + {url = "https://files.pythonhosted.org/packages/ad/bd/d47ee02312640fcf26c7e1c807402d5c5eab468571153a94ec8f7ada0e46/uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {url = "https://files.pythonhosted.org/packages/c6/dd/0d3bab50ab4ef8bec849f89fec2adc2fabcc397018c30e57d9f0d4009c5e/uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, ] "uvloop 0.17.0" = [ {url = "https://files.pythonhosted.org/packages/04/e3/e8c6b6b2ece6b0ab6033c62344d3de1706ed773d10c1798ee8afb0007b8c/uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, diff --git a/python/pyproject.toml b/pyproject.toml similarity index 93% rename from python/pyproject.toml rename to pyproject.toml index 2590ffa7..b229e24a 100644 --- a/python/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ ] # < 3.12 for sqlalchemy-bigquery and < 3.11 for snowflake-connector-python requires-python = ">=3.10, <3.11" -readme = "../README.md" +readme = "README.md" license = {text = "MIT"} keywords = [ "metadata", @@ -36,8 +36,8 @@ keywords = [ ] [project.urls] -documentation = "https://docs.recap.cloud" -homepage = "https://github.com/recap-cloud/recap" +documentation = "https://recap.build" +homepage = "https://recap.build" repository = "https://github.com/recap-cloud/recap" [project.scripts] diff --git a/python/.gitignore b/python/.gitignore deleted file mode 100644 index 3feebce2..00000000 --- a/python/.gitignore +++ /dev/null @@ -1,133 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# PDM -.pdm-python - diff --git a/python/recap/__init__.py b/recap/__init__.py similarity index 100% rename from python/recap/__init__.py rename to recap/__init__.py diff --git a/python/recap/catalog/__init__.py b/recap/catalog/__init__.py similarity index 100% rename from python/recap/catalog/__init__.py rename to recap/catalog/__init__.py diff --git a/python/recap/catalog/client.py b/recap/catalog/client.py similarity index 100% rename from python/recap/catalog/client.py rename to recap/catalog/client.py diff --git a/python/recap/catalog/crawler.py b/recap/catalog/crawler.py similarity index 100% rename from python/recap/catalog/crawler.py rename to recap/catalog/crawler.py diff --git a/python/recap/catalog/server.py b/recap/catalog/server.py similarity index 100% rename from python/recap/catalog/server.py rename to recap/catalog/server.py diff --git a/python/recap/catalog/storage.py b/recap/catalog/storage.py similarity index 100% rename from python/recap/catalog/storage.py rename to recap/catalog/storage.py diff --git a/python/recap/cli.py b/recap/cli.py similarity index 100% rename from python/recap/cli.py rename to recap/cli.py diff --git a/python/recap/config.py b/recap/config.py similarity index 100% rename from python/recap/config.py rename to recap/config.py diff --git a/python/recap/converters/__init__.py b/recap/converters/__init__.py similarity index 100% rename from python/recap/converters/__init__.py rename to recap/converters/__init__.py diff --git a/python/recap/converters/converter.py b/recap/converters/converter.py similarity index 100% rename from python/recap/converters/converter.py rename to recap/converters/converter.py diff --git a/python/recap/converters/frictionless.py b/recap/converters/frictionless.py similarity index 100% rename from python/recap/converters/frictionless.py rename to recap/converters/frictionless.py diff --git a/python/recap/converters/json_schema.py b/recap/converters/json_schema.py similarity index 100% rename from python/recap/converters/json_schema.py rename to recap/converters/json_schema.py diff --git a/python/recap/converters/recap.py b/recap/converters/recap.py similarity index 100% rename from python/recap/converters/recap.py rename to recap/converters/recap.py diff --git a/python/recap/converters/sqlalchemy.py b/recap/converters/sqlalchemy.py similarity index 100% rename from python/recap/converters/sqlalchemy.py rename to recap/converters/sqlalchemy.py diff --git a/python/recap/logging.py b/recap/logging.py similarity index 100% rename from python/recap/logging.py rename to recap/logging.py diff --git a/python/recap/models.py b/recap/models.py similarity index 100% rename from python/recap/models.py rename to recap/models.py diff --git a/python/recap/readers/__init_.py b/recap/readers/__init_.py similarity index 100% rename from python/recap/readers/__init_.py rename to recap/readers/__init_.py diff --git a/python/recap/readers/fsspec.py b/recap/readers/fsspec.py similarity index 100% rename from python/recap/readers/fsspec.py rename to recap/readers/fsspec.py diff --git a/python/recap/readers/readers.py b/recap/readers/readers.py similarity index 100% rename from python/recap/readers/readers.py rename to recap/readers/readers.py diff --git a/python/recap/readers/sqlalchemy.py b/recap/readers/sqlalchemy.py similarity index 100% rename from python/recap/readers/sqlalchemy.py rename to recap/readers/sqlalchemy.py diff --git a/python/recap/types.py b/recap/types.py similarity index 100% rename from python/recap/types.py rename to recap/types.py diff --git a/python/tests/catalog/test_db.py b/tests/catalog/test_db.py similarity index 100% rename from python/tests/catalog/test_db.py rename to tests/catalog/test_db.py diff --git a/python/tests/converters/test_json_schema.py b/tests/converters/test_json_schema.py similarity index 100% rename from python/tests/converters/test_json_schema.py rename to tests/converters/test_json_schema.py diff --git a/python/tests/test_types.py b/tests/test_types.py similarity index 100% rename from python/tests/test_types.py rename to tests/test_types.py