From f9a1ce2c4f73cf1bc0e38de8fdeea426b1cefe38 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 24 Aug 2023 09:27:57 -0700 Subject: [PATCH 01/16] Some updates to text --- pgml-sdks/rust/pgml/README.md | 138 ++-------------------------- pgml-sdks/rust/pgml/src/builtins.rs | 1 + pgml-sdks/rust/pgml/src/lib.rs | 8 +- pgml-sdks/rust/pgml/src/model.rs | 1 + pgml-sdks/rust/pgml/src/models.rs | 16 ++-- pgml-sdks/rust/pgml/src/pipeline.rs | 13 ++- pgml-sdks/rust/pgml/src/splitter.rs | 1 + 7 files changed, 33 insertions(+), 145 deletions(-) diff --git a/pgml-sdks/rust/pgml/README.md b/pgml-sdks/rust/pgml/README.md index 23ec719f3..b17bd641a 100644 --- a/pgml-sdks/rust/pgml/README.md +++ b/pgml-sdks/rust/pgml/README.md @@ -1,136 +1,14 @@ # Open Source Alternative for Building End-to-End Vector Search Applications without OpenAI & Pinecone -# How to use this crate -Here is a brief outline of how to use this crate and specifically add new Python classes. +# Suported Languages -There are three main macros to know about: -- `custom_derive` -- `custom_methods` -- `custom_into_py` +We support a number of different languages: +- [Python](/) +- [JavaScript](/) +- Rust -## custom_derive -`custom_derive` is used when defining a new struct that you want to be available as a Python class. This macro automatically creates a wrapper for the struct postfixing the name with `Python`. For example, the following code: -``` -#[derive(custom_derive, Debug, Clone)] -pub struct TestStruct { - pub name: String -} -``` +Our SDK is written completely in Rust and translated by Rust to our other supported languages. See each individual language for an overview and specification on how to use the SDK. -Creates another struct: +# Rust -``` -pub struct TestStructPython { - pub wrapped: TestStruct -} -``` - -You must currently implement `Debug` and `Clone` on the structs you use `custom_derive` on. - -## custom_methods -`custom_methods` is used on the impl block for a struct you want to be available as a Python class. This macro automatically creates methods that work seamlessly with pyO3. For example, the following code: -``` -#[custom_methods(new, get_name)] -impl TestStruct { - pub fn new(name: String) -> Self { - Self { name } - } - pub fn get_name(&self) -> String { - self.name.clone() - } -} -``` - -Produces similar code to the following: -``` -impl TestStruct { - pub fn new(name: String) -> Self { - Self { name } - } - pub fn get_name(&self) -> String { - self.name.clone() - } -} - -impl TestStructPython { - pub fn new<'a>(name: String, py: Python<'a>) -> PyResult { - let x = TestStruct::new(name); - Ok(TestStructPython::from(x)) - } - pub fn get_name<'a>(&self, py: Python<'a>) -> PyResult { - let x = self.wrapped.get_name(); - Ok(x) - } -} -``` - -Note that the macro only works on methods marked with `pub`; - -## custom_into_py -`custom_into_py` is used when we want to seamlessly return Rust structs as Python dictionaries. For example, let's say we have the following code: -``` -#[derive(custom_into_py, FromRow, Debug, Clone)] -pub struct Splitter { - pub id: i64, - pub created_at: DateTime, - pub name: String, - pub parameters: Json>, -} - -pub async fn get_text_splitters(&self) -> anyhow::Result> { - Ok(sqlx::query_as(&query_builder!( - "SELECT * from %s", - self.splitters_table_name - )) - .fetch_all(self.pool.borrow()) - .await?) -} - -``` - -The `custom_into_py` macro automatically generates the following code for us: -``` -impl IntoPy for Splitter { - fn into_py(self, py: Python<'_>) -> PyObject { - let dict = PyDict::new(py); - dict.set_item("id", self.id) - .expect("Error setting python value in custom_into_py proc_macro"); - dict.set_item("created_at", self.created_at.timestamp()) - .expect("Error setting python value in custom_into_py proc_macro"); - dict.set_item("name", self.name) - .expect("Error setting python value in custom_into_py proc_macro"); - dict.set_item("parameters", self.parameters.0) - .expect("Error setting python value in custom_into_py proc_macro"); - dict.into() - } - } -``` - -Implementing `IntoPy` allows pyo3 to seamlessly convert between Rust and python. Note that Python users calling `get_text_splitters` will receive a list of dictionaries. - -## Other Noteworthy Things - -Be aware that the only pyo3 specific code in this crate is the `pymodule` invocation in `lib.rs`. Everything else is handled by `pgml-macros`. If you want to expose a Python Class directly on the Python module you have to add it in the `pymodule` invocation. For example, if you wanted to expose `TestStruct` so Python module users could access it directly on `pgml`, you could do the following: -``` -#[pymodule] -fn pgml(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - Ok(()) -} -``` - -Now Python users can access it like so: -``` -import pgml - -t = pgml.TestStruct("test") -print(t.get_name()) - -``` - -For local development, install [maturin](https://github.com/PyO3/maturin) and run: -``` -maturin develop -``` - -You can now run the tests in `python/test.py`. +More information about our methodologies and Rust SDK coming soon. diff --git a/pgml-sdks/rust/pgml/src/builtins.rs b/pgml-sdks/rust/pgml/src/builtins.rs index 29cb573ae..0cce6e387 100644 --- a/pgml-sdks/rust/pgml/src/builtins.rs +++ b/pgml-sdks/rust/pgml/src/builtins.rs @@ -2,6 +2,7 @@ use pgml_macros::{custom_derive, custom_methods}; use sqlx::Row; use tracing::instrument; +/// Provides access to builtin database methods #[derive(custom_derive, Debug, Clone)] pub struct Builtins { pub database_url: Option, diff --git a/pgml-sdks/rust/pgml/src/lib.rs b/pgml-sdks/rust/pgml/src/lib.rs index 26fff5307..2d1ab506a 100644 --- a/pgml-sdks/rust/pgml/src/lib.rs +++ b/pgml-sdks/rust/pgml/src/lib.rs @@ -59,15 +59,15 @@ async fn get_or_initialize_pool(database_url: &Option) -> anyhow::Result } } -pub enum LogFormat { - JSON, +enum LogFormat { + Json, Pretty, } impl From<&str> for LogFormat { fn from(s: &str) -> Self { match s { - "JSON" => LogFormat::JSON, + "Json" => LogFormat::Json, _ => LogFormat::Pretty, } } @@ -87,7 +87,7 @@ fn init_logger(level: Option, format: Option) -> anyhow::Result< let format = format.unwrap_or_else(|| env::var("LOG_FORMAT").unwrap_or("".to_string())); match format.as_str().into() { - LogFormat::JSON => FmtSubscriber::builder() + LogFormat::Json => FmtSubscriber::builder() .json() .with_max_level(level) .try_init() diff --git a/pgml-sdks/rust/pgml/src/model.rs b/pgml-sdks/rust/pgml/src/model.rs index dc5484af4..9ca4ae7fb 100644 --- a/pgml-sdks/rust/pgml/src/model.rs +++ b/pgml-sdks/rust/pgml/src/model.rs @@ -54,6 +54,7 @@ pub(crate) struct ModelDatabaseData { pub created_at: DateTime, } +/// A model used for embedding, inference, etc... #[derive(custom_derive, Debug, Clone)] pub struct Model { pub name: String, diff --git a/pgml-sdks/rust/pgml/src/models.rs b/pgml-sdks/rust/pgml/src/models.rs index de5a922c5..2b735f5a0 100644 --- a/pgml-sdks/rust/pgml/src/models.rs +++ b/pgml-sdks/rust/pgml/src/models.rs @@ -5,7 +5,7 @@ use sqlx::FromRow; use crate::types::{DateTime, Json}; -/// A pipeline +// A pipeline #[enum_def] #[derive(FromRow)] pub struct Pipeline { @@ -18,7 +18,7 @@ pub struct Pipeline { pub parameters: Json, } -/// A model used to perform some task +// A model used to perform some task #[enum_def] #[derive(FromRow)] pub struct Model { @@ -28,7 +28,7 @@ pub struct Model { pub hyperparams: Json, } -/// A text splitter +// A text splitter #[enum_def] #[derive(FromRow)] pub struct Splitter { @@ -38,7 +38,7 @@ pub struct Splitter { pub parameters: Json, } -/// A pipeline with its model and splitter +// A pipeline with its model and splitter #[derive(FromRow, Clone)] pub struct PipelineWithModelAndSplitter { pub pipeline_id: i64, @@ -56,7 +56,7 @@ pub struct PipelineWithModelAndSplitter { pub splitter_parameters: Json, } -/// A document +// A document #[enum_def] #[derive(FromRow, Serialize)] pub struct Document { @@ -69,7 +69,7 @@ pub struct Document { pub text: String, } -/// A collection of documents +// A collection of documents #[enum_def] #[derive(FromRow)] pub struct Collection { @@ -80,7 +80,7 @@ pub struct Collection { pub project_id: i64, } -/// An embedding +// An embedding #[enum_def] #[derive(FromRow)] pub struct Embedding { @@ -90,7 +90,7 @@ pub struct Embedding { pub embedding: Vec, } -/// A chunk of split text +// A chunk of split text #[derive(FromRow)] pub struct Chunk { pub id: i64, diff --git a/pgml-sdks/rust/pgml/src/pipeline.rs b/pgml-sdks/rust/pgml/src/pipeline.rs index 594d05e57..aa0fb867c 100644 --- a/pgml-sdks/rust/pgml/src/pipeline.rs +++ b/pgml-sdks/rust/pgml/src/pipeline.rs @@ -47,9 +47,15 @@ impl From for Json { impl From for InvividualSyncStatus { fn from(value: Json) -> Self { Self { - synced: value["synced"].as_i64().expect("The synced field is not an integer"), - not_synced: value["not_synced"].as_i64().expect("The not_synced field is not an integer"), - total: value["total"].as_i64().expect("The total field is not an integer"), + synced: value["synced"] + .as_i64() + .expect("The synced field is not an integer"), + not_synced: value["not_synced"] + .as_i64() + .expect("The not_synced field is not an integer"), + total: value["total"] + .as_i64() + .expect("The total field is not an integer"), } } } @@ -90,6 +96,7 @@ pub struct PipelineDatabaseData { pub splitter_id: i64, } +/// A pipeline that processes documents #[derive(custom_derive, Debug, Clone)] pub struct Pipeline { pub name: String, diff --git a/pgml-sdks/rust/pgml/src/splitter.rs b/pgml-sdks/rust/pgml/src/splitter.rs index 7a745771a..bc8c5ca6d 100644 --- a/pgml-sdks/rust/pgml/src/splitter.rs +++ b/pgml-sdks/rust/pgml/src/splitter.rs @@ -21,6 +21,7 @@ pub(crate) struct SplitterDatabaseData { pub created_at: DateTime, } +/// A text splitter #[derive(custom_derive, Debug, Clone)] pub struct Splitter { pub name: String, From b47dc45076006c19e57f70cd8f665269af41a40f Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 24 Aug 2023 14:52:44 -0700 Subject: [PATCH 02/16] Massive updates to structure and renaming of pgml-macros --- pgml-sdks/{rust => }/pgml/.cargo/config.toml | 0 pgml-sdks/{rust => }/pgml/.gitignore | 0 pgml-sdks/{rust => }/pgml/Cargo.lock | 37 +- pgml-sdks/{rust => }/pgml/Cargo.toml | 7 +- pgml-sdks/{rust => }/pgml/README.md | 0 pgml-sdks/{rust => }/pgml/build.rs | 0 .../{rust => }/pgml/javascript/.npmignore | 0 .../{rust => }/pgml/javascript/README.md | 0 .../pgml/javascript/examples/README.md | 0 .../examples/extractive_question_answering.js | 0 .../examples/getting-started/README.md | 12 + .../examples/getting-started/index.js} | 0 .../examples/getting-started}/package.json | 0 .../javascript/examples/package-lock.json | 0 .../pgml/javascript/examples/package.json | 15 + .../javascript/examples/question_answering.js | 0 .../examples/question_answering_instructor.js | 0 .../javascript/examples/semantic_search.js | 54 + .../summarizing_question_answering.js | 0 pgml-sdks/{rust => }/pgml/javascript/index.js | 0 .../pgml/javascript/package-lock.json | 0 .../{rust => }/pgml/javascript/package.json | 0 .../pgml/javascript/tests/jest.config.js | 0 .../pgml/javascript/tests/package-lock.json | 0 .../pgml/javascript/tests/package.json | 0 .../pgml/javascript/tests/tsconfig.json | 0 .../javascript/tests/typescript-tests/test.ts | 0 pgml-sdks/{rust => }/pgml/poetry.lock | 0 pgml-sdks/{rust => }/pgml/pyproject.toml | 0 pgml-sdks/{rust => }/pgml/python/README.md | 0 .../{rust => }/pgml/python/examples/README.md | 0 .../examples/extractive_question_answering.py | 0 .../python/examples/question_answering.py | 0 .../examples/question_answering_instructor.py | 0 .../pgml/python/examples/semantic_search.py | 0 .../summarizing_question_answering.py | 0 .../examples/table_question_answering.py | 0 .../pgml/python/manual-build-deploy.sh | 0 .../{rust => }/pgml/python/pgml/__init__.py | 0 pgml-sdks/pgml/python/pgml/pgml.pyi | 5 + .../{rust => }/pgml/python/tests/test.py | 0 pgml-sdks/{rust => }/pgml/src/builtins.rs | 10 +- pgml-sdks/{rust => }/pgml/src/collection.rs | 14 +- .../{rust => }/pgml/src/filter_builder.rs | 0 pgml-sdks/pgml/src/languages/javascript.rs | 120 + .../{rust => }/pgml/src/languages/mod.rs | 1 - .../{rust => }/pgml/src/languages/python.rs | 95 +- pgml-sdks/{rust => }/pgml/src/lib.rs | 2 +- pgml-sdks/{rust => }/pgml/src/model.rs | 11 +- pgml-sdks/{rust => }/pgml/src/models.rs | 0 pgml-sdks/{rust => }/pgml/src/pipeline.rs | 15 +- pgml-sdks/{rust => }/pgml/src/queries.rs | 0 .../{rust => }/pgml/src/query_builder/mod.rs | 0 .../pgml/src/query_builder/query_builder.rs | 11 +- pgml-sdks/{rust => }/pgml/src/query_runner.rs | 11 +- .../{rust => }/pgml/src/remote_embeddings.rs | 0 pgml-sdks/{rust => }/pgml/src/splitter.rs | 11 +- pgml-sdks/{rust => }/pgml/src/types.rs | 7 +- pgml-sdks/{rust => }/pgml/src/utils.rs | 0 pgml-sdks/python/pgml/README.md | 290 -- pgml-sdks/python/pgml/docs/pgml/collection.md | 128 - pgml-sdks/python/pgml/docs/pgml/database.md | 34 - pgml-sdks/python/pgml/docs/pgml/dbutils.md | 48 - pgml-sdks/python/pgml/docs/pgml/index.md | 8 - pgml-sdks/python/pgml/examples/README.md | 19 - .../examples/extractive_question_answering.py | 78 - .../pgml/examples/fastapi-server/README.md | 80 - .../pgml/examples/fastapi-server/app/main.py | 102 - .../pgml/examples/fastapi-server/poetry.lock | 2706 ----------------- .../examples/fastapi-server/pyproject.toml | 20 - .../state_of_the_union_long.pdf | Bin 58285 -> 0 bytes .../state_of_the_union_short.pdf | Bin 21427 -> 0 bytes .../pgml/examples/question_answering.py | 48 - .../examples/question_answering_instructor.py | 70 - .../python/pgml/examples/semantic_search.py | 59 - .../pgml/examples/table_question_answering.py | 64 - pgml-sdks/rust-bridge/Cargo.lock | 191 ++ pgml-sdks/rust-bridge/Cargo.toml | 9 + pgml-sdks/rust-bridge/README.md | 126 + .../examples/readme-example/Cargo.lock | 651 ++++ .../examples/readme-example/Cargo.toml | 17 + .../examples/readme-example/src/main.rs | 21 + .../rust-bridge-macros}/Cargo.toml | 2 +- .../rust-bridge-macros}/src/common.rs | 0 .../rust-bridge-macros}/src/javascript.rs | 45 +- .../rust-bridge-macros}/src/lib.rs | 17 +- .../rust-bridge-macros}/src/python.rs | 66 +- .../rust-bridge-macros}/src/types.rs | 0 .../rust-bridge/rust-bridge-traits/Cargo.toml | 7 + .../rust-bridge-traits/src/javascript/mod.rs} | 154 +- .../rust-bridge/rust-bridge-traits/src/lib.rs | 3 + .../rust-bridge-traits/src/python/mod.rs | 93 + pgml-sdks/rust-bridge/rust-bridge/Cargo.toml | 10 + pgml-sdks/rust-bridge/rust-bridge/src/lib.rs | 5 + pgml-sdks/rust/pgml-macros/Cargo.lock | 54 - pgml-sdks/rust/pgml/python/pgml/pgml.pyi | 89 - 96 files changed, 1497 insertions(+), 4255 deletions(-) rename pgml-sdks/{rust => }/pgml/.cargo/config.toml (100%) rename pgml-sdks/{rust => }/pgml/.gitignore (100%) rename pgml-sdks/{rust => }/pgml/Cargo.lock (99%) rename pgml-sdks/{rust => }/pgml/Cargo.toml (83%) rename pgml-sdks/{rust => }/pgml/README.md (100%) rename pgml-sdks/{rust => }/pgml/build.rs (100%) rename pgml-sdks/{rust => }/pgml/javascript/.npmignore (100%) rename pgml-sdks/{rust => }/pgml/javascript/README.md (100%) rename pgml-sdks/{rust => }/pgml/javascript/examples/README.md (100%) rename pgml-sdks/{rust => }/pgml/javascript/examples/extractive_question_answering.js (100%) create mode 100644 pgml-sdks/pgml/javascript/examples/getting-started/README.md rename pgml-sdks/{rust/pgml/javascript/examples/semantic_search.js => pgml/javascript/examples/getting-started/index.js} (100%) rename pgml-sdks/{rust/pgml/javascript/examples => pgml/javascript/examples/getting-started}/package.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/examples/package-lock.json (100%) create mode 100644 pgml-sdks/pgml/javascript/examples/package.json rename pgml-sdks/{rust => }/pgml/javascript/examples/question_answering.js (100%) rename pgml-sdks/{rust => }/pgml/javascript/examples/question_answering_instructor.js (100%) create mode 100644 pgml-sdks/pgml/javascript/examples/semantic_search.js rename pgml-sdks/{rust => }/pgml/javascript/examples/summarizing_question_answering.js (100%) rename pgml-sdks/{rust => }/pgml/javascript/index.js (100%) rename pgml-sdks/{rust => }/pgml/javascript/package-lock.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/package.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/tests/jest.config.js (100%) rename pgml-sdks/{rust => }/pgml/javascript/tests/package-lock.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/tests/package.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/tests/tsconfig.json (100%) rename pgml-sdks/{rust => }/pgml/javascript/tests/typescript-tests/test.ts (100%) rename pgml-sdks/{rust => }/pgml/poetry.lock (100%) rename pgml-sdks/{rust => }/pgml/pyproject.toml (100%) rename pgml-sdks/{rust => }/pgml/python/README.md (100%) rename pgml-sdks/{rust => }/pgml/python/examples/README.md (100%) rename pgml-sdks/{rust => }/pgml/python/examples/extractive_question_answering.py (100%) rename pgml-sdks/{rust => }/pgml/python/examples/question_answering.py (100%) rename pgml-sdks/{rust => }/pgml/python/examples/question_answering_instructor.py (100%) rename pgml-sdks/{rust => }/pgml/python/examples/semantic_search.py (100%) rename pgml-sdks/{rust => }/pgml/python/examples/summarizing_question_answering.py (100%) rename pgml-sdks/{rust => }/pgml/python/examples/table_question_answering.py (100%) rename pgml-sdks/{rust => }/pgml/python/manual-build-deploy.sh (100%) rename pgml-sdks/{rust => }/pgml/python/pgml/__init__.py (100%) create mode 100644 pgml-sdks/pgml/python/pgml/pgml.pyi rename pgml-sdks/{rust => }/pgml/python/tests/test.py (100%) rename pgml-sdks/{rust => }/pgml/src/builtins.rs (91%) rename pgml-sdks/{rust => }/pgml/src/collection.rs (99%) rename pgml-sdks/{rust => }/pgml/src/filter_builder.rs (100%) create mode 100644 pgml-sdks/pgml/src/languages/javascript.rs rename pgml-sdks/{rust => }/pgml/src/languages/mod.rs (98%) rename pgml-sdks/{rust => }/pgml/src/languages/python.rs (64%) rename pgml-sdks/{rust => }/pgml/src/lib.rs (99%) rename pgml-sdks/{rust => }/pgml/src/model.rs (96%) rename pgml-sdks/{rust => }/pgml/src/models.rs (100%) rename pgml-sdks/{rust => }/pgml/src/pipeline.rs (98%) rename pgml-sdks/{rust => }/pgml/src/queries.rs (100%) rename pgml-sdks/{rust => }/pgml/src/query_builder/mod.rs (100%) rename pgml-sdks/{rust => }/pgml/src/query_builder/query_builder.rs (97%) rename pgml-sdks/{rust => }/pgml/src/query_runner.rs (91%) rename pgml-sdks/{rust => }/pgml/src/remote_embeddings.rs (100%) rename pgml-sdks/{rust => }/pgml/src/splitter.rs (95%) rename pgml-sdks/{rust => }/pgml/src/types.rs (90%) rename pgml-sdks/{rust => }/pgml/src/utils.rs (100%) delete mode 100644 pgml-sdks/python/pgml/README.md delete mode 100644 pgml-sdks/python/pgml/docs/pgml/collection.md delete mode 100644 pgml-sdks/python/pgml/docs/pgml/database.md delete mode 100644 pgml-sdks/python/pgml/docs/pgml/dbutils.md delete mode 100644 pgml-sdks/python/pgml/docs/pgml/index.md delete mode 100644 pgml-sdks/python/pgml/examples/README.md delete mode 100644 pgml-sdks/python/pgml/examples/extractive_question_answering.py delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/README.md delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/app/main.py delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/poetry.lock delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/pyproject.toml delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_long.pdf delete mode 100644 pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_short.pdf delete mode 100644 pgml-sdks/python/pgml/examples/question_answering.py delete mode 100644 pgml-sdks/python/pgml/examples/question_answering_instructor.py delete mode 100644 pgml-sdks/python/pgml/examples/semantic_search.py delete mode 100644 pgml-sdks/python/pgml/examples/table_question_answering.py create mode 100644 pgml-sdks/rust-bridge/Cargo.lock create mode 100644 pgml-sdks/rust-bridge/Cargo.toml create mode 100644 pgml-sdks/rust-bridge/README.md create mode 100644 pgml-sdks/rust-bridge/examples/readme-example/Cargo.lock create mode 100644 pgml-sdks/rust-bridge/examples/readme-example/Cargo.toml create mode 100644 pgml-sdks/rust-bridge/examples/readme-example/src/main.rs rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/Cargo.toml (91%) rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/src/common.rs (100%) rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/src/javascript.rs (93%) rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/src/lib.rs (66%) rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/src/python.rs (89%) rename pgml-sdks/{rust/pgml-macros => rust-bridge/rust-bridge-macros}/src/types.rs (100%) create mode 100644 pgml-sdks/rust-bridge/rust-bridge-traits/Cargo.toml rename pgml-sdks/{rust/pgml/src/languages/javascript.rs => rust-bridge/rust-bridge-traits/src/javascript/mod.rs} (63%) create mode 100644 pgml-sdks/rust-bridge/rust-bridge-traits/src/lib.rs create mode 100644 pgml-sdks/rust-bridge/rust-bridge-traits/src/python/mod.rs create mode 100644 pgml-sdks/rust-bridge/rust-bridge/Cargo.toml create mode 100644 pgml-sdks/rust-bridge/rust-bridge/src/lib.rs delete mode 100644 pgml-sdks/rust/pgml-macros/Cargo.lock delete mode 100644 pgml-sdks/rust/pgml/python/pgml/pgml.pyi diff --git a/pgml-sdks/rust/pgml/.cargo/config.toml b/pgml-sdks/pgml/.cargo/config.toml similarity index 100% rename from pgml-sdks/rust/pgml/.cargo/config.toml rename to pgml-sdks/pgml/.cargo/config.toml diff --git a/pgml-sdks/rust/pgml/.gitignore b/pgml-sdks/pgml/.gitignore similarity index 100% rename from pgml-sdks/rust/pgml/.gitignore rename to pgml-sdks/pgml/.gitignore diff --git a/pgml-sdks/rust/pgml/Cargo.lock b/pgml-sdks/pgml/Cargo.lock similarity index 99% rename from pgml-sdks/rust/pgml/Cargo.lock rename to pgml-sdks/pgml/Cargo.lock index e61b81510..db7b5d11f 100644 --- a/pgml-sdks/rust/pgml/Cargo.lock +++ b/pgml-sdks/pgml/Cargo.lock @@ -1130,11 +1130,11 @@ dependencies = [ "itertools", "md5", "neon", - "pgml-macros", "pyo3", "pyo3-asyncio", "regex", "reqwest", + "rust_bridge", "sea-query", "sea-query-binder", "serde", @@ -1146,16 +1146,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "pgml-macros" -version = "0.1.0" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1417,6 +1407,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "rust_bridge" +version = "0.1.0" +dependencies = [ + "rust_bridge_macros", + "rust_bridge_traits", +] + +[[package]] +name = "rust_bridge_macros" +version = "0.1.0" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.28", +] + +[[package]] +name = "rust_bridge_traits" +version = "0.1.0" +dependencies = [ + "neon", +] + [[package]] name = "rustix" version = "0.37.23" diff --git a/pgml-sdks/rust/pgml/Cargo.toml b/pgml-sdks/pgml/Cargo.toml similarity index 83% rename from pgml-sdks/rust/pgml/Cargo.toml rename to pgml-sdks/pgml/Cargo.toml index 25cfbf7c1..c854cb61b 100644 --- a/pgml-sdks/rust/pgml/Cargo.toml +++ b/pgml-sdks/pgml/Cargo.toml @@ -2,6 +2,11 @@ name = "pgml" version = "0.9.0" edition = "2021" +authors = ["PosgresML "] +homepage = "https://postgresml.org/" +repository = "" +license = "MIT" +keywords = ["postgres", "machine learning", "vector databases", "embeddings"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] @@ -9,7 +14,7 @@ name = "pgml" crate-type = ["lib", "cdylib"] [dependencies] -pgml-macros = {path = "../pgml-macros"} +rust_bridge = {path = "../rust-bridge/rust-bridge", version = "0.1.0"} sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "postgres", "json", "time", "uuid", "chrono"] } serde_json = "1.0.9" anyhow = "1.0.9" diff --git a/pgml-sdks/rust/pgml/README.md b/pgml-sdks/pgml/README.md similarity index 100% rename from pgml-sdks/rust/pgml/README.md rename to pgml-sdks/pgml/README.md diff --git a/pgml-sdks/rust/pgml/build.rs b/pgml-sdks/pgml/build.rs similarity index 100% rename from pgml-sdks/rust/pgml/build.rs rename to pgml-sdks/pgml/build.rs diff --git a/pgml-sdks/rust/pgml/javascript/.npmignore b/pgml-sdks/pgml/javascript/.npmignore similarity index 100% rename from pgml-sdks/rust/pgml/javascript/.npmignore rename to pgml-sdks/pgml/javascript/.npmignore diff --git a/pgml-sdks/rust/pgml/javascript/README.md b/pgml-sdks/pgml/javascript/README.md similarity index 100% rename from pgml-sdks/rust/pgml/javascript/README.md rename to pgml-sdks/pgml/javascript/README.md diff --git a/pgml-sdks/rust/pgml/javascript/examples/README.md b/pgml-sdks/pgml/javascript/examples/README.md similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/README.md rename to pgml-sdks/pgml/javascript/examples/README.md diff --git a/pgml-sdks/rust/pgml/javascript/examples/extractive_question_answering.js b/pgml-sdks/pgml/javascript/examples/extractive_question_answering.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/extractive_question_answering.js rename to pgml-sdks/pgml/javascript/examples/extractive_question_answering.js diff --git a/pgml-sdks/pgml/javascript/examples/getting-started/README.md b/pgml-sdks/pgml/javascript/examples/getting-started/README.md new file mode 100644 index 000000000..293b5a3ca --- /dev/null +++ b/pgml-sdks/pgml/javascript/examples/getting-started/README.md @@ -0,0 +1,12 @@ +# Getting Started with the PGML Javascript SDK + +In this example repo you will find a basic script that you can run to get started with the PGML Javascript SDK. This script will create a collection, add a pipeline, and run a vector search on the collection. + +## Steps to run the example + +1. Clone the repo +2. Install dependencies + `npm install` +3. Create a .env file and set `DATABASE_URL` to your Postgres connection string +4. Open index.js and check out the code +5. Run the script `node index.js` diff --git a/pgml-sdks/rust/pgml/javascript/examples/semantic_search.js b/pgml-sdks/pgml/javascript/examples/getting-started/index.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/semantic_search.js rename to pgml-sdks/pgml/javascript/examples/getting-started/index.js diff --git a/pgml-sdks/rust/pgml/javascript/examples/package.json b/pgml-sdks/pgml/javascript/examples/getting-started/package.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/package.json rename to pgml-sdks/pgml/javascript/examples/getting-started/package.json diff --git a/pgml-sdks/rust/pgml/javascript/examples/package-lock.json b/pgml-sdks/pgml/javascript/examples/package-lock.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/package-lock.json rename to pgml-sdks/pgml/javascript/examples/package-lock.json diff --git a/pgml-sdks/pgml/javascript/examples/package.json b/pgml-sdks/pgml/javascript/examples/package.json new file mode 100644 index 000000000..984886eb5 --- /dev/null +++ b/pgml-sdks/pgml/javascript/examples/package.json @@ -0,0 +1,15 @@ +{ + "name": "getting-started", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "dotenv": "^16.3.1", + "pgml": "^0.9.0" + } +} diff --git a/pgml-sdks/rust/pgml/javascript/examples/question_answering.js b/pgml-sdks/pgml/javascript/examples/question_answering.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/question_answering.js rename to pgml-sdks/pgml/javascript/examples/question_answering.js diff --git a/pgml-sdks/rust/pgml/javascript/examples/question_answering_instructor.js b/pgml-sdks/pgml/javascript/examples/question_answering_instructor.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/question_answering_instructor.js rename to pgml-sdks/pgml/javascript/examples/question_answering_instructor.js diff --git a/pgml-sdks/pgml/javascript/examples/semantic_search.js b/pgml-sdks/pgml/javascript/examples/semantic_search.js new file mode 100644 index 000000000..b1458e889 --- /dev/null +++ b/pgml-sdks/pgml/javascript/examples/semantic_search.js @@ -0,0 +1,54 @@ +const pgml = require("pgml"); +require("dotenv").config(); + +const main = async () => { + // Initialize the collection + const collection = pgml.newCollection("my_javascript_collection"); + + // Add a pipeline + const model = pgml.newModel(); + const splitter = pgml.newSplitter(); + const pipeline = pgml.newPipeline("my_javascript_pipeline", model, splitter); + await collection.add_pipeline(pipeline); + + // Upsert documents, these documents are automatically split into chunks and embedded by our pipeline + const documents = [ + { + id: "Document One", + text: "document one contents...", + }, + { + id: "Document Two", + text: "document two contents...", + }, + ]; + await collection.upsert_documents(documents); + + // Perform vector search + const queryResults = await collection + .query() + .vector_recall( + "Some user query that will match document one first", + pipeline, + ) + .limit(2) + .fetch_all(); + + // Convert the results to an array of objects + const results = queryResults.map((result) => { + const [similarity, text, metadata] = result; + return { + similarity, + text, + metadata, + }; + }); + + // Archive the collection + await collection.archive(); + return results; +}; + +main().then((results) => { + console.log("Vector search Results: \n", results); +}); diff --git a/pgml-sdks/rust/pgml/javascript/examples/summarizing_question_answering.js b/pgml-sdks/pgml/javascript/examples/summarizing_question_answering.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/examples/summarizing_question_answering.js rename to pgml-sdks/pgml/javascript/examples/summarizing_question_answering.js diff --git a/pgml-sdks/rust/pgml/javascript/index.js b/pgml-sdks/pgml/javascript/index.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/index.js rename to pgml-sdks/pgml/javascript/index.js diff --git a/pgml-sdks/rust/pgml/javascript/package-lock.json b/pgml-sdks/pgml/javascript/package-lock.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/package-lock.json rename to pgml-sdks/pgml/javascript/package-lock.json diff --git a/pgml-sdks/rust/pgml/javascript/package.json b/pgml-sdks/pgml/javascript/package.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/package.json rename to pgml-sdks/pgml/javascript/package.json diff --git a/pgml-sdks/rust/pgml/javascript/tests/jest.config.js b/pgml-sdks/pgml/javascript/tests/jest.config.js similarity index 100% rename from pgml-sdks/rust/pgml/javascript/tests/jest.config.js rename to pgml-sdks/pgml/javascript/tests/jest.config.js diff --git a/pgml-sdks/rust/pgml/javascript/tests/package-lock.json b/pgml-sdks/pgml/javascript/tests/package-lock.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/tests/package-lock.json rename to pgml-sdks/pgml/javascript/tests/package-lock.json diff --git a/pgml-sdks/rust/pgml/javascript/tests/package.json b/pgml-sdks/pgml/javascript/tests/package.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/tests/package.json rename to pgml-sdks/pgml/javascript/tests/package.json diff --git a/pgml-sdks/rust/pgml/javascript/tests/tsconfig.json b/pgml-sdks/pgml/javascript/tests/tsconfig.json similarity index 100% rename from pgml-sdks/rust/pgml/javascript/tests/tsconfig.json rename to pgml-sdks/pgml/javascript/tests/tsconfig.json diff --git a/pgml-sdks/rust/pgml/javascript/tests/typescript-tests/test.ts b/pgml-sdks/pgml/javascript/tests/typescript-tests/test.ts similarity index 100% rename from pgml-sdks/rust/pgml/javascript/tests/typescript-tests/test.ts rename to pgml-sdks/pgml/javascript/tests/typescript-tests/test.ts diff --git a/pgml-sdks/rust/pgml/poetry.lock b/pgml-sdks/pgml/poetry.lock similarity index 100% rename from pgml-sdks/rust/pgml/poetry.lock rename to pgml-sdks/pgml/poetry.lock diff --git a/pgml-sdks/rust/pgml/pyproject.toml b/pgml-sdks/pgml/pyproject.toml similarity index 100% rename from pgml-sdks/rust/pgml/pyproject.toml rename to pgml-sdks/pgml/pyproject.toml diff --git a/pgml-sdks/rust/pgml/python/README.md b/pgml-sdks/pgml/python/README.md similarity index 100% rename from pgml-sdks/rust/pgml/python/README.md rename to pgml-sdks/pgml/python/README.md diff --git a/pgml-sdks/rust/pgml/python/examples/README.md b/pgml-sdks/pgml/python/examples/README.md similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/README.md rename to pgml-sdks/pgml/python/examples/README.md diff --git a/pgml-sdks/rust/pgml/python/examples/extractive_question_answering.py b/pgml-sdks/pgml/python/examples/extractive_question_answering.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/extractive_question_answering.py rename to pgml-sdks/pgml/python/examples/extractive_question_answering.py diff --git a/pgml-sdks/rust/pgml/python/examples/question_answering.py b/pgml-sdks/pgml/python/examples/question_answering.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/question_answering.py rename to pgml-sdks/pgml/python/examples/question_answering.py diff --git a/pgml-sdks/rust/pgml/python/examples/question_answering_instructor.py b/pgml-sdks/pgml/python/examples/question_answering_instructor.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/question_answering_instructor.py rename to pgml-sdks/pgml/python/examples/question_answering_instructor.py diff --git a/pgml-sdks/rust/pgml/python/examples/semantic_search.py b/pgml-sdks/pgml/python/examples/semantic_search.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/semantic_search.py rename to pgml-sdks/pgml/python/examples/semantic_search.py diff --git a/pgml-sdks/rust/pgml/python/examples/summarizing_question_answering.py b/pgml-sdks/pgml/python/examples/summarizing_question_answering.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/summarizing_question_answering.py rename to pgml-sdks/pgml/python/examples/summarizing_question_answering.py diff --git a/pgml-sdks/rust/pgml/python/examples/table_question_answering.py b/pgml-sdks/pgml/python/examples/table_question_answering.py similarity index 100% rename from pgml-sdks/rust/pgml/python/examples/table_question_answering.py rename to pgml-sdks/pgml/python/examples/table_question_answering.py diff --git a/pgml-sdks/rust/pgml/python/manual-build-deploy.sh b/pgml-sdks/pgml/python/manual-build-deploy.sh similarity index 100% rename from pgml-sdks/rust/pgml/python/manual-build-deploy.sh rename to pgml-sdks/pgml/python/manual-build-deploy.sh diff --git a/pgml-sdks/rust/pgml/python/pgml/__init__.py b/pgml-sdks/pgml/python/pgml/__init__.py similarity index 100% rename from pgml-sdks/rust/pgml/python/pgml/__init__.py rename to pgml-sdks/pgml/python/pgml/__init__.py diff --git a/pgml-sdks/pgml/python/pgml/pgml.pyi b/pgml-sdks/pgml/python/pgml/pgml.pyi new file mode 100644 index 000000000..02895348d --- /dev/null +++ b/pgml-sdks/pgml/python/pgml/pgml.pyi @@ -0,0 +1,5 @@ + +def py_init_logger(level: Optional[str] = "", format: Optional[str] = "") -> None + +Json = Any +DateTime = int diff --git a/pgml-sdks/rust/pgml/python/tests/test.py b/pgml-sdks/pgml/python/tests/test.py similarity index 100% rename from pgml-sdks/rust/pgml/python/tests/test.py rename to pgml-sdks/pgml/python/tests/test.py diff --git a/pgml-sdks/rust/pgml/src/builtins.rs b/pgml-sdks/pgml/src/builtins.rs similarity index 91% rename from pgml-sdks/rust/pgml/src/builtins.rs rename to pgml-sdks/pgml/src/builtins.rs index 0cce6e387..3686c1c1b 100644 --- a/pgml-sdks/rust/pgml/src/builtins.rs +++ b/pgml-sdks/pgml/src/builtins.rs @@ -1,22 +1,20 @@ -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sqlx::Row; use tracing::instrument; /// Provides access to builtin database methods -#[derive(custom_derive, Debug, Clone)] +#[derive(alias, Debug, Clone)] pub struct Builtins { pub database_url: Option, } use crate::{get_or_initialize_pool, query_runner::QueryRunner, types::Json}; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; #[cfg(feature = "python")] -use crate::{languages::python::*, query_runner::QueryRunnerPython, types::JsonPython}; +use crate::{query_runner::QueryRunnerPython, types::JsonPython}; -#[custom_methods(new, query, transform)] +#[alias_methods(new, query, transform)] impl Builtins { pub fn new(database_url: Option) -> Self { Self { database_url } diff --git a/pgml-sdks/rust/pgml/src/collection.rs b/pgml-sdks/pgml/src/collection.rs similarity index 99% rename from pgml-sdks/rust/pgml/src/collection.rs rename to pgml-sdks/pgml/src/collection.rs index d680cac53..ba0a1af3e 100644 --- a/pgml-sdks/rust/pgml/src/collection.rs +++ b/pgml-sdks/pgml/src/collection.rs @@ -1,7 +1,7 @@ use anyhow::Context; use indicatif::MultiProgress; use itertools::Itertools; -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sqlx::postgres::PgPool; use sqlx::Executor; use sqlx::PgConnection; @@ -15,14 +15,8 @@ use crate::{ splitter::Splitter, types::DateTime, types::Json, utils, }; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{ - languages::python::*, pipeline::PipelinePython, query_builder::QueryBuilderPython, - types::JsonPython, -}; +use crate::{pipeline::PipelinePython, query_builder::QueryBuilderPython, types::JsonPython}; /// Our project tasks #[derive(Debug, Clone)] @@ -91,7 +85,7 @@ pub(crate) struct CollectionDatabaseData { } /// A collection of documents -#[derive(custom_derive, Debug, Clone)] +#[derive(alias, Debug, Clone)] pub struct Collection { pub name: String, pub database_url: Option, @@ -103,7 +97,7 @@ pub struct Collection { pub(crate) database_data: Option, } -#[custom_methods( +#[alias_methods( new, upsert_documents, get_documents, diff --git a/pgml-sdks/rust/pgml/src/filter_builder.rs b/pgml-sdks/pgml/src/filter_builder.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/filter_builder.rs rename to pgml-sdks/pgml/src/filter_builder.rs diff --git a/pgml-sdks/pgml/src/languages/javascript.rs b/pgml-sdks/pgml/src/languages/javascript.rs new file mode 100644 index 000000000..6465c408d --- /dev/null +++ b/pgml-sdks/pgml/src/languages/javascript.rs @@ -0,0 +1,120 @@ +use neon::prelude::*; +use rust_bridge::javascript::{IntoJsResult, FromJsType}; + +use crate::{ + pipeline::PipelineSyncData, + types::{DateTime, Json}, +}; + +//////////////////////////////////////////////////////////////////////////////// +// Rust to JS ////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +impl IntoJsResult for DateTime { + type Output = neon::types::JsDate; + fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( + self, + cx: &mut C, + ) -> JsResult<'b, Self::Output> { + let date = neon::types::JsDate::new(cx, self.0.timestamp_millis() as f64) + .expect("Error converting to JS Date"); + Ok(date) + } +} + +impl IntoJsResult for Json { + type Output = JsValue; + fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( + self, + cx: &mut C, + ) -> JsResult<'b, Self::Output> { + match self.0 { + serde_json::Value::Bool(x) => Ok(JsBoolean::new(cx, x).upcast()), + serde_json::Value::Number(x) => Ok(JsNumber::new( + cx, + x.as_f64() + .expect("Error converting to f64 in impl IntoJsResult for Json"), + ) + .upcast()), + serde_json::Value::String(x) => Ok(JsString::new(cx, &x).upcast()), + serde_json::Value::Array(x) => { + let js_array = JsArray::new(cx, x.len() as u32); + for (i, v) in x.into_iter().enumerate() { + let js_value = Json::into_js_result(Self(v), cx)?; + js_array.set(cx, i as u32, js_value)?; + } + Ok(js_array.upcast()) + } + serde_json::Value::Object(x) => { + let js_object = JsObject::new(cx); + for (k, v) in x.into_iter() { + let js_key = cx.string(k); + let js_value = Json::into_js_result(Self(v), cx)?; + js_object.set(cx, js_key, js_value)?; + } + Ok(js_object.upcast()) + } + _ => panic!("Unsupported type for JSON conversion"), + } + } +} + +impl IntoJsResult for PipelineSyncData { + type Output = JsValue; + fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( + self, + cx: &mut C, + ) -> JsResult<'b, Self::Output> { + Json::from(self).into_js_result(cx) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// JS To Rust ////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +impl FromJsType for Json { + type From = JsValue; + fn from_js_type<'a, C: Context<'a>>(cx: &mut C, arg: Handle) -> NeonResult { + if arg.is_a::(cx) { + let value: Handle = arg.downcast(cx).or_throw(cx)?; + let mut json = Vec::new(); + for item in value.to_vec(cx)? { + let item = Json::from_js_type(cx, item)?; + json.push(item.0); + } + Ok(Self(serde_json::Value::Array(json))) + } else if arg.is_a::(cx) { + let value: Handle = arg.downcast(cx).or_throw(cx)?; + let value = bool::from_js_type(cx, value)?; + let value = serde_json::Value::Bool(value); + Ok(Self(value)) + } else if arg.is_a::(cx) { + let value: Handle = arg.downcast(cx).or_throw(cx)?; + let value = String::from_js_type(cx, value)?; + let value = serde_json::Value::String(value); + Ok(Self(value)) + } else if arg.is_a::(cx) { + let value: Handle = arg.downcast(cx).or_throw(cx)?; + let value = f64::from_js_type(cx, value)?; + let value = serde_json::value::Number::from_f64(value) + .expect("Could not convert f64 to serde_json::Number"); + let value = serde_json::value::Value::Number(value); + Ok(Self(value)) + } else if arg.is_a::(cx) { + let value: Handle = arg.downcast(cx).or_throw(cx)?; + let mut json = serde_json::Map::new(); + let keys = value.get_own_property_names(cx)?.to_vec(cx)?; + for key in keys { + let key: Handle = key.downcast(cx).or_throw(cx)?; + let key: String = String::from_js_type(cx, key)?; + let json_value: Handle = value.get(cx, key.as_str())?; + let json_value = Json::from_js_type(cx, json_value)?; + json.insert(key, json_value.0); + } + Ok(Self(serde_json::Value::Object(json))) + } else { + panic!("Unsupported type for Json conversion"); + } + } +} diff --git a/pgml-sdks/rust/pgml/src/languages/mod.rs b/pgml-sdks/pgml/src/languages/mod.rs similarity index 98% rename from pgml-sdks/rust/pgml/src/languages/mod.rs rename to pgml-sdks/pgml/src/languages/mod.rs index a40f3de87..dda671ec1 100644 --- a/pgml-sdks/rust/pgml/src/languages/mod.rs +++ b/pgml-sdks/pgml/src/languages/mod.rs @@ -3,4 +3,3 @@ pub mod javascript; #[cfg(feature = "python")] pub mod python; - diff --git a/pgml-sdks/rust/pgml/src/languages/python.rs b/pgml-sdks/pgml/src/languages/python.rs similarity index 64% rename from pgml-sdks/rust/pgml/src/languages/python.rs rename to pgml-sdks/pgml/src/languages/python.rs index 5b74c46ae..728c2a0ce 100644 --- a/pgml-sdks/rust/pgml/src/languages/python.rs +++ b/pgml-sdks/pgml/src/languages/python.rs @@ -1,7 +1,8 @@ use pyo3::conversion::IntoPy; use pyo3::types::{PyDict, PyFloat, PyInt, PyList, PyString}; use pyo3::{prelude::*, types::PyBool}; -use std::collections::HashMap; + +use rust_bridge::python::CustomInto; use crate::{pipeline::PipelineSyncData, types::Json}; @@ -115,100 +116,8 @@ impl FromPyObject<'_> for PipelineSyncData { // Rust to Rust ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -macro_rules! gen_custom_into { - ($t1:ty) => { - impl CustomInto<$t1> for $t1 { - fn custom_into(self) -> $t1 { - self - } - } - }; - (($($T1:ident),+), ($($T2:ident),+), ($($C:tt),+)) => { - impl<$($T1, $T2: CustomInto<$T1>),+> CustomInto<($($T1),+,)> for ($($T2),+,) { - fn custom_into(self) -> ($($T1),+,) { - ($(self.$C.custom_into()),+,) - } - } - } -} - -/// Very similar to the `Into` trait, but we can implement it on foreign types -pub trait CustomInto { - fn custom_into(self) -> T; -} - impl CustomInto for PipelineSyncData { fn custom_into(self) -> Json { Json::from(self) } } - -impl> CustomInto> for Option { - fn custom_into(self) -> Option { - self.map(|s| s.custom_into()) - } -} - -impl> CustomInto> for Vec { - fn custom_into(self) -> Vec { - self.into_iter().map(|x| x.custom_into()).collect() - } -} - -impl, T2: CustomInto> - CustomInto> for HashMap -{ - fn custom_into(self) -> HashMap { - self.into_iter() - .map(|(k, v)| (k.custom_into(), v.custom_into())) - .collect() - } -} - -impl CustomInto<&'static str> for &str { - fn custom_into(self) -> &'static str { - // This is how we get around the liftime checker - unsafe { - let ptr = self as *const str; - let ptr = ptr as *mut str; - let boxed = Box::from_raw(ptr); - Box::leak(boxed) - } - } -} - -gen_custom_into!((T1), (TT2), (0)); -gen_custom_into!((T1, T2), (TT1, TT2), (0, 1)); -gen_custom_into!((T1, T2, T3), (TT1, TT2, TT3), (0, 1, 2)); -gen_custom_into!((T1, T2, T3, T4), (TT1, TT2, TT3, TT4), (0, 1, 2, 3)); -gen_custom_into!( - (T1, T2, T3, T4, T5), - (TT1, TT2, TT3, TT4, TT5), - (0, 1, 2, 3, 4) -); -gen_custom_into!( - (T1, T2, T3, T4, T5, T6), - (TT1, TT2, TT3, TT4, TT5, TT6), - (0, 1, 2, 3, 4, 5) -); - -// There are some restrictions I cannot figure out around conflicting trait -// implimentations so this is my solution for now -gen_custom_into!(String); - -gen_custom_into!(()); - -gen_custom_into!(bool); - -gen_custom_into!(i8); -gen_custom_into!(i16); -gen_custom_into!(i32); -gen_custom_into!(i64); - -gen_custom_into!(u8); -gen_custom_into!(u16); -gen_custom_into!(u32); -gen_custom_into!(u64); - -gen_custom_into!(f32); -gen_custom_into!(f64); diff --git a/pgml-sdks/rust/pgml/src/lib.rs b/pgml-sdks/pgml/src/lib.rs similarity index 99% rename from pgml-sdks/rust/pgml/src/lib.rs rename to pgml-sdks/pgml/src/lib.rs index 2d1ab506a..96ee99b6b 100644 --- a/pgml-sdks/rust/pgml/src/lib.rs +++ b/pgml-sdks/pgml/src/lib.rs @@ -145,7 +145,7 @@ fn pgml(_py: pyo3::Python, m: &pyo3::types::PyModule) -> pyo3::PyResult<()> { fn js_init_logger( mut cx: neon::context::FunctionContext, ) -> neon::result::JsResult { - use crate::languages::javascript::*; + use rust_bridge::javascript::{IntoJsResult, FromJsType}; let level = cx.argument_opt(0); let level = >::from_option_js_type(&mut cx, level)?; let format = cx.argument_opt(1); diff --git a/pgml-sdks/rust/pgml/src/model.rs b/pgml-sdks/pgml/src/model.rs similarity index 96% rename from pgml-sdks/rust/pgml/src/model.rs rename to pgml-sdks/pgml/src/model.rs index 9ca4ae7fb..54f3fc5a0 100644 --- a/pgml-sdks/rust/pgml/src/model.rs +++ b/pgml-sdks/pgml/src/model.rs @@ -1,5 +1,5 @@ use anyhow::Context; -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sqlx::postgres::PgPool; use tracing::instrument; @@ -9,11 +9,8 @@ use crate::{ types::{DateTime, Json}, }; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{languages::python::*, types::JsonPython}; +use crate::types::JsonPython; /// A few notes on the following enums: /// - Sqlx does provide type derivation for enums, but it's not very good @@ -55,7 +52,7 @@ pub(crate) struct ModelDatabaseData { } /// A model used for embedding, inference, etc... -#[derive(custom_derive, Debug, Clone)] +#[derive(alias, Debug, Clone)] pub struct Model { pub name: String, pub runtime: ModelRuntime, @@ -70,7 +67,7 @@ impl Default for Model { } } -#[custom_methods(new)] +#[alias_methods(new)] impl Model { /// Creates a new [Model] /// diff --git a/pgml-sdks/rust/pgml/src/models.rs b/pgml-sdks/pgml/src/models.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/models.rs rename to pgml-sdks/pgml/src/models.rs diff --git a/pgml-sdks/rust/pgml/src/pipeline.rs b/pgml-sdks/pgml/src/pipeline.rs similarity index 98% rename from pgml-sdks/rust/pgml/src/pipeline.rs rename to pgml-sdks/pgml/src/pipeline.rs index aa0fb867c..4e7b2d709 100644 --- a/pgml-sdks/rust/pgml/src/pipeline.rs +++ b/pgml-sdks/pgml/src/pipeline.rs @@ -1,6 +1,6 @@ use anyhow::Context; use indicatif::MultiProgress; -use pgml_macros::{custom_derive, custom_methods, pgml_alias}; +use rust_bridge::{alias, alias_manual, alias_methods}; use sqlx::{Executor, PgConnection, PgPool}; use std::sync::atomic::AtomicBool; use std::sync::atomic::Ordering::Relaxed; @@ -18,13 +18,8 @@ use crate::{ utils, }; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{ - languages::python::*, model::ModelPython, splitter::SplitterPython, types::JsonPython, -}; +use crate::{model::ModelPython, splitter::SplitterPython, types::JsonPython}; #[derive(Debug, Clone)] pub struct InvividualSyncStatus { @@ -60,7 +55,7 @@ impl From for InvividualSyncStatus { } } -#[derive(pgml_alias, Debug, Clone)] +#[derive(alias_manual, Debug, Clone)] pub struct PipelineSyncData { pub chunks_status: InvividualSyncStatus, pub embeddings_status: InvividualSyncStatus, @@ -97,7 +92,7 @@ pub struct PipelineDatabaseData { } /// A pipeline that processes documents -#[derive(custom_derive, Debug, Clone)] +#[derive(alias, Debug, Clone)] pub struct Pipeline { pub name: String, pub model: Option, @@ -107,7 +102,7 @@ pub struct Pipeline { pub(crate) database_data: Option, } -#[custom_methods(new, get_status, to_dict)] +#[alias_methods(new, get_status, to_dict)] impl Pipeline { /// Creates a new [Pipeline] /// diff --git a/pgml-sdks/rust/pgml/src/queries.rs b/pgml-sdks/pgml/src/queries.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/queries.rs rename to pgml-sdks/pgml/src/queries.rs diff --git a/pgml-sdks/rust/pgml/src/query_builder/mod.rs b/pgml-sdks/pgml/src/query_builder/mod.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/query_builder/mod.rs rename to pgml-sdks/pgml/src/query_builder/mod.rs diff --git a/pgml-sdks/rust/pgml/src/query_builder/query_builder.rs b/pgml-sdks/pgml/src/query_builder/query_builder.rs similarity index 97% rename from pgml-sdks/rust/pgml/src/query_builder/query_builder.rs rename to pgml-sdks/pgml/src/query_builder/query_builder.rs index f6e85ba04..9f70b49cc 100644 --- a/pgml-sdks/rust/pgml/src/query_builder/query_builder.rs +++ b/pgml-sdks/pgml/src/query_builder/query_builder.rs @@ -1,6 +1,6 @@ use anyhow::Context; use itertools::Itertools; -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sea_query::{ query::SelectStatement, Alias, CommonTableExpression, Expr, Func, Iden, JoinType, Order, PostgresQueryBuilder, Query, QueryStatementWriter, WithClause, @@ -13,11 +13,8 @@ use crate::{ remote_embeddings::build_remote_embeddings, types::Json, Collection, }; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{languages::python::*, pipeline::PipelinePython, types::JsonPython}; +use crate::{pipeline::PipelinePython, types::JsonPython}; #[derive(Clone)] enum SIden<'a> { @@ -55,7 +52,7 @@ impl IntoTableNameAndSchema for String { #[derive(Clone, Debug)] struct QueryBuilderState {} -#[derive(custom_derive, Clone, Debug)] +#[derive(alias, Clone, Debug)] pub struct QueryBuilder { query: SelectStatement, with: WithClause, @@ -65,7 +62,7 @@ pub struct QueryBuilder { query_parameters: Option, } -#[custom_methods(limit, filter, vector_recall, to_full_string, fetch_all)] +#[alias_methods(limit, filter, vector_recall, to_full_string, fetch_all)] impl QueryBuilder { pub fn new(collection: Collection) -> Self { Self { diff --git a/pgml-sdks/rust/pgml/src/query_runner.rs b/pgml-sdks/pgml/src/query_runner.rs similarity index 91% rename from pgml-sdks/rust/pgml/src/query_runner.rs rename to pgml-sdks/pgml/src/query_runner.rs index 1db1bd813..ff8f3fa8f 100644 --- a/pgml-sdks/rust/pgml/src/query_runner.rs +++ b/pgml-sdks/pgml/src/query_runner.rs @@ -1,15 +1,12 @@ -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sqlx::postgres::PgArguments; use sqlx::query::Query; use sqlx::{Postgres, Row}; use crate::{get_or_initialize_pool, types::Json}; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{languages::python::*, types::JsonPython}; +use crate::types::JsonPython; #[derive(Clone, Debug)] enum BindValue { @@ -20,14 +17,14 @@ enum BindValue { Json(Json), } -#[derive(custom_derive, Clone, Debug)] +#[derive(alias, Clone, Debug)] pub struct QueryRunner { query: String, bind_values: Vec, database_url: Option, } -#[custom_methods( +#[alias_methods( fetch_all, execute, bind_string, diff --git a/pgml-sdks/rust/pgml/src/remote_embeddings.rs b/pgml-sdks/pgml/src/remote_embeddings.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/remote_embeddings.rs rename to pgml-sdks/pgml/src/remote_embeddings.rs diff --git a/pgml-sdks/rust/pgml/src/splitter.rs b/pgml-sdks/pgml/src/splitter.rs similarity index 95% rename from pgml-sdks/rust/pgml/src/splitter.rs rename to pgml-sdks/pgml/src/splitter.rs index bc8c5ca6d..85e85e3a8 100644 --- a/pgml-sdks/rust/pgml/src/splitter.rs +++ b/pgml-sdks/pgml/src/splitter.rs @@ -1,5 +1,5 @@ use anyhow::Context; -use pgml_macros::{custom_derive, custom_methods}; +use rust_bridge::{alias, alias_methods}; use sqlx::postgres::{PgConnection, PgPool}; use tracing::instrument; @@ -9,11 +9,8 @@ use crate::{ types::{DateTime, Json}, }; -#[cfg(feature = "javascript")] -use crate::languages::javascript::*; - #[cfg(feature = "python")] -use crate::{languages::python::*, types::JsonPython}; +use crate::types::JsonPython; #[derive(Debug, Clone)] pub(crate) struct SplitterDatabaseData { @@ -22,7 +19,7 @@ pub(crate) struct SplitterDatabaseData { } /// A text splitter -#[derive(custom_derive, Debug, Clone)] +#[derive(alias, Debug, Clone)] pub struct Splitter { pub name: String, pub parameters: Json, @@ -36,7 +33,7 @@ impl Default for Splitter { } } -#[custom_methods(new)] +#[alias_methods(new)] impl Splitter { /// Creates a new [Splitter] /// diff --git a/pgml-sdks/rust/pgml/src/types.rs b/pgml-sdks/pgml/src/types.rs similarity index 90% rename from pgml-sdks/rust/pgml/src/types.rs rename to pgml-sdks/pgml/src/types.rs index aeeffcad4..fa390517e 100644 --- a/pgml-sdks/rust/pgml/src/types.rs +++ b/pgml-sdks/pgml/src/types.rs @@ -1,13 +1,10 @@ -use pgml_macros::pgml_alias; +use rust_bridge::alias_manual; use serde::Serialize; use std::ops::{Deref, DerefMut}; -#[cfg(feature = "python")] -use crate::languages::python::*; - /// A wrapper around serde_json::Value // #[derive(sqlx::Type, sqlx::FromRow, Debug)] -#[derive(pgml_alias, sqlx::Type, Debug, Clone)] +#[derive(alias_manual, sqlx::Type, Debug, Clone)] #[sqlx(transparent)] pub struct Json(pub serde_json::Value); diff --git a/pgml-sdks/rust/pgml/src/utils.rs b/pgml-sdks/pgml/src/utils.rs similarity index 100% rename from pgml-sdks/rust/pgml/src/utils.rs rename to pgml-sdks/pgml/src/utils.rs diff --git a/pgml-sdks/python/pgml/README.md b/pgml-sdks/python/pgml/README.md deleted file mode 100644 index 5309f5ccf..000000000 --- a/pgml-sdks/python/pgml/README.md +++ /dev/null @@ -1,290 +0,0 @@ -# Open Source Alternative for Building End-to-End Vector Search Applications without OpenAI & Pinecone - -## Table of Contents - -- [Overview](#overview) -- [Quickstart](#quickstart) -- [Usage](#usage) -- [Examples](./examples/README.md) -- [Developer setup](#developer-setup) -- [API Reference](#api-reference) -- [Roadmap](#roadmap) - -## Overview -Python SDK is designed to facilitate the development of scalable vector search applications on PostgreSQL databases. With this SDK, you can seamlessly manage various database tables related to documents, text chunks, text splitters, LLM (Language Model) models, and embeddings. By leveraging the SDK's capabilities, you can efficiently index LLM embeddings using PgVector for fast and accurate queries. - -### Key Features - -- **Automated Database Management**: With the SDK, you can easily handle the management of database tables related to documents, text chunks, text splitters, LLM models, and embeddings. This automated management system simplifies the process of setting up and maintaining your vector search application's data structure. - - -- **Embedding Generation from Open Source Models**: The Python SDK provides the ability to generate embeddings using hundreds of open source models. These models, trained on vast amounts of data, capture the semantic meaning of text and enable powerful analysis and search capabilities. - -- **Flexible and Scalable Vector Search**: The Python SDK empowers you to build flexible and scalable vector search applications. The Python SDK seamlessly integrates with PgVector, a PostgreSQL extension specifically designed for handling vector-based indexing and querying. By leveraging these indices, you can perform advanced searches, rank results by relevance, and retrieve accurate and meaningful information from your database. - -### Use Cases - -Embeddings, the core concept of the Python SDK, find applications in various scenarios, including: - -- Search: Embeddings are commonly used for search functionalities, where results are ranked by relevance to a query string. By comparing the embeddings of query strings and documents, you can retrieve search results in order of their similarity or relevance. - -- Clustering: With embeddings, you can group text strings by similarity, enabling clustering of related data. By measuring the similarity between embeddings, you can identify clusters or groups of text strings that share common characteristics. - -- Recommendations: Embeddings play a crucial role in recommendation systems. By identifying items with related text strings based on their embeddings, you can provide personalized recommendations to users. - -- Anomaly Detection: Anomaly detection involves identifying outliers or anomalies that have little relatedness to the rest of the data. Embeddings can aid in this process by quantifying the similarity between text strings and flagging outliers. - -- Classification: Embeddings are utilized in classification tasks, where text strings are classified based on their most similar label. By comparing the embeddings of text strings and labels, you can classify new text strings into predefined categories. - -### How the Python SDK Works -The Python SDK streamlines the development of vector search applications by abstracting away the complexities of database management and indexing. Here's an overview of how the SDK works: - -- **Document and Text Chunk Management**: The SDK provides a convenient interface to create, update, and delete documents and their corresponding text chunks. You can easily organize and structure your text data within the PostgreSQL database. - -- **Open Source Model Integration**: With the SDK, you can seamlessly incorporate a wide range of open source models to generate high-quality embeddings. These models capture the semantic meaning of text and enable powerful analysis and search capabilities. - -- **Embedding Indexing**: The Python SDK utilizes the PgVector extension to efficiently index the embeddings generated by the open source models. This indexing process optimizes search performance and allows for fast and accurate retrieval of relevant results. - -- **Querying and Search**: Once the embeddings are indexed, you can perform vector-based searches on the documents and text chunks stored in the PostgreSQL database. The SDK provides intuitive methods for executing queries and retrieving search results. - -## Quickstart -Follow the steps below to quickly get started with the Python SDK for building scalable vector search applications on PostgresML databases. - -### Prerequisites -Before you begin, make sure you have the following: - -- PostgresML Database: Ensure you have a PostgresML database version >`2.3.1`. You can spin up a database using [Docker](https://github.com/postgresml/postgresml#installation) or [sign up for a free GPU-powered database](https://postgresml.org/signup). Set the `PGML_CONNECTION` environment variable to the connection string of your PostgresML database. If not set, the SDK will use the default connection string for your local installation `postgres://postgres@127.0.0.1:5433/pgml_development`. - -- Python version >=3.8.1 - -- `postgresql` command line utility - - Ubuntu: `sudo apt install libpq-dev` - - Centos/Fedora/Cygwin/Babun: `sudo yum install libpq-devel` - - Mac: `brew install postgresql` - -### Installation - -To install the Python SDK, use pip: - -``` -pip install pgml -``` - -### Sample Code - -Once you have the Python SDK installed, you can use the following sample code as a starting point for your vector search application: - -```python -from pgml import Database -import os -import json -from datasets import load_dataset -from time import time -from rich import print as rprint -import asyncio - -async def main(): - local_pgml = "postgres://postgres@127.0.0.1:5433/pgml_development" - conninfo = os.environ.get("PGML_CONNECTION", local_pgml) - - db = Database(conninfo) - - collection_name = "test_collection" - collection = await db.create_or_get_collection(collection_name) -``` - -**Explanation:** - -- The code imports the necessary modules and packages, including pgml.Database, os, json, datasets, time, and rich.print. -- It defines the local_pgml variable with the default local connection string, and retrieves the connection information from the PGML_CONNECTION environment variable or uses the default if not set. -- An instance of the Database class is created by passing the connection information. -- The method [`create_or_get_collection`](#create-or-get-a-collection) collection with the name `test_pgml_sdk_1` is retrieved if it exists or a new collection is created. - -Continuing within `async def main():` - -```python - data = load_dataset("squad", split="train") - data = data.to_pandas() - data = data.drop_duplicates(subset=["context"]) - - documents = [ - {'id': r['id'], "text": r["context"], "title": r["title"]} - for r in data.to_dict(orient="records") - ] - - await collection.upsert_documents(documents[:200]) - await collection.generate_chunks() - await collection.generate_embeddings() -``` - -**Explanation:** - -- The code loads the "squad" dataset, converts it to a pandas DataFrame, and drops any duplicate context values. -- It creates a list of dictionaries representing the documents to be indexed, with each dictionary containing the document's ID, text, and title. -- The [`upsert_documents`](#upsert-documents) method is called to insert or update the first 200 documents in the collection. -- The [`generate_chunks`](#generate-chunks) method splits the documents into smaller text chunks for efficient indexing and search. -- The [`generate_embeddings`](#generate-embeddings) method generates embeddings for the documents in the collection. - -Continuing within `async def main():` -```python - start = time() - results = await collection.vector_search("Who won 20 grammy awards?", top_k=2) - rprint(json.dumps(results, indent=2)) - rprint("Query time: %0.3f seconds" % (time() - start)) - await db.archive_collection(collection_name) -``` - -**Explanation:** - -- The code initializes a timer using `time()` to measure the query time. -- The [`vector_search`](#vector-search) method is called to perform a vector-based search on the collection. The query string is `Who won 20 grammy awards?`, and the top 2 results are requested. -- The search results are printed using `rprint` and formatted as JSON with indentation. -- The query time is calculated by subtracting the start time from the current time. -- Finally, the `archive_collection` method is called to archive the collection and free up resources in the PostgresML database. - -Call `main` function in an async loop. - -```python -if __name__ == "__main__": - asyncio.run(main()) -``` -**Running the Code** - -Open a terminal or command prompt and navigate to the directory where the file is saved. - -Execute the following command: - -``` -python vector_search.py -``` -You should see the search results and the query time printed in the terminal. As you can see, our vector search engine found the right text chunk with the answer we are looking for. - -``` -[ - { - "score": 0.8423336843624225, - "chunk": "Beyonc\u00e9 has won 20 Grammy Awards, both as a solo artist and member of Destiny's Child, making her the second most honored female artist by the Grammys, behind Alison Krauss and the most nominated woman in Grammy Award -history with 52 nominations. \"Single Ladies (Put a Ring on It)\" won Song of the Year in 2010 while \"Say My Name\" and \"Crazy in Love\" had previously won Best R&B Song. Dangerously in Love, B'Day and I Am... Sasha Fierce have all won Best -Contemporary R&B Album. Beyonc\u00e9 set the record for the most Grammy awards won by a female artist in one night in 2010 when she won six awards, breaking the tie she previously held with Alicia Keys, Norah Jones, Alison Krauss, and Amy -Winehouse, with Adele equaling this in 2012. Following her role in Dreamgirls she was nominated for Best Original Song for \"Listen\" and Best Actress at the Golden Globe Awards, and Outstanding Actress in a Motion Picture at the NAACP Image -Awards. Beyonc\u00e9 won two awards at the Broadcast Film Critics Association Awards 2006; Best Song for \"Listen\" and Best Original Soundtrack for Dreamgirls: Music from the Motion Picture.", - "metadata": { - "title": "Beyonc\u00e9" - } - }, - { - "score": 0.8210568000806665, - "chunk": "A self-described \"modern-day feminist\", Beyonc\u00e9 creates songs that are often characterized by themes of love, relationships, and monogamy, as well as female sexuality and empowerment. On stage, her dynamic, highly -choreographed performances have led to critics hailing her as one of the best entertainers in contemporary popular music. Throughout a career spanning 19 years, she has sold over 118 million records as a solo artist, and a further 60 million -with Destiny's Child, making her one of the best-selling music artists of all time. She has won 20 Grammy Awards and is the most nominated woman in the award's history. The Recording Industry Association of America recognized her as the Top -Certified Artist in America during the 2000s decade. In 2009, Billboard named her the Top Radio Songs Artist of the Decade, the Top Female Artist of the 2000s and their Artist of the Millennium in 2011. Time listed her among the 100 most -influential people in the world in 2013 and 2014. Forbes magazine also listed her as the most powerful female musician of 2015.", - "metadata": { - "title": "Beyonc\u00e9" - } - } -] -``` -## Usage - -### High-level Description -The Python SDK provides a set of functionalities to build scalable vector search applications on PostgresQL databases. It enables users to create a collection, which represents a schema in the database, to store tables for documents, chunks, models, splitters, and embeddings. The Collection class in the SDK handles all operations related to these tables, allowing users to interact with the collection and perform various tasks. - -#### Connect to Database - -```python -local_pgml = "postgres://postgres@127.0.0.1:5433/pgml_development" - -conninfo = os.environ.get("PGML_CONNECTION", local_pgml) -db = Database(conninfo) -``` - -This initializes a connection pool to the DB and creates a table named `pgml.collections` if it does not already exist. By default it connects to local PostgresML database and at one connection maintained in the connection pool. - -#### Create or Get a Collection - -```python -collection_name = "test_collection" -collection = await db.create_or_get_collection(collection_name) -``` - -This creates a new schema in a PostgreSQL database if it does not already exist and creates tables and indices for documents, chunks, models, splitters, and embeddings. - -#### Upsert Documents - -```python -await collection.upsert_documents(documents) -``` - -The method is used to insert or update documents in a database table based on their ID, text, and metadata. - -#### Generate Chunks - -```python -await collection.generate_chunks(splitter_id = 1) -``` - -This method is used to generate chunks of text from unchunked documents using a specified text splitter. By default it uses `RecursiveCharacterTextSplitter` with default parameters. `splitter_id` is optional. You can pass a `splitter_id` corresponding to a new splitter that is registered. See below for `register_text_splitter`. - -#### Generate Embeddings - -```python -await collection.generate_embeddings(model_id = 1, splitter_id = 1) -``` - -This methods generates embeddings uing the chunks from the text. By default it uses `intfloat/e5-small` embeddings model. `model_id` is optional. You can pass a `model_id` corresponding to a new model that is registered and `splitter_id`. See below for `register_model`. - - -#### Vector Search - -```python -results = await collection.vector_search("Who won 20 grammy awards?", top_k=2, model_id = 1, splitter_id = 1) -``` - -This method converts the input query into embeddings and searches embeddings table for nearest match. You can change the number of results using `top_k`. You can also pass specific `splitter_id` and `model_id` that were used for chunking and generating embeddings. - -#### Register Model - -```python -await collection.register_model(model_name="hkunlp/instructor-xl", model_params={"instruction": "Represent the Wikipedia document for retrieval: "}) -``` - -This function allows for the registration of a model in a database, creating a record if it does not already exist. `model_name` is the name of the open source HuggingFace model being registered and `model_params` is a dictionary containing parameters for configuring the model. It can be empty if no parameters are needed. - -#### Register Text Splitter - -```python -await collection.register_text_splitter(splitter_name="recursive_character",splitter_params={"chunk_size": "100","chunk_overlap": "20"}) -``` - -This function allows for the registration of a text spliter in a database, creating a record if it doesn't already exist. Following [LangChain](https://python.langchain.com/en/latest/reference/modules/text_splitter.html) splitters are supported. - -``` -SPLITTERS = { - "character": CharacterTextSplitter, - "latex": LatexTextSplitter, - "markdown": MarkdownTextSplitter, - "nltk": NLTKTextSplitter, - "python": PythonCodeTextSplitter, - "recursive_character": RecursiveCharacterTextSplitter, - "spacy": SpacyTextSplitter, -} -``` - - -### Developer Setup -This Python library is generated from our core rust-sdk. Please check [rust-sdk documentation](../../rust/pgml/README.md) for developer setup. - -### API Reference - -- [Database](./docs/pgml/database.md) -- [Collection](./docs/pgml/collection.md) - -### Roadmap - -- Enable filters on document metadata in `vector_search`. [Issue](https://github.com/postgresml/postgresml/issues/663) -- `text_search` functionality on documents using Postgres text search. [Issue](https://github.com/postgresml/postgresml/issues/664) -- `hybrid_search` functionality that does a combination of `vector_search` and `text_search` in an order specified by the user. [Issue](https://github.com/postgresml/postgresml/issues/665) -- Ability to call and manage OpenAI embeddings for comparison purposes. [Issue](https://github.com/postgresml/postgresml/issues/666) -- Save `vector_search` history for downstream monitoring of model performance. [Issue](https://github.com/postgresml/postgresml/issues/667) -- Perform chunking on the DB with multiple langchain splitters. [Issue](https://github.com/postgresml/postgresml/issues/668) \ No newline at end of file diff --git a/pgml-sdks/python/pgml/docs/pgml/collection.md b/pgml-sdks/python/pgml/docs/pgml/collection.md deleted file mode 100644 index ec6f69273..000000000 --- a/pgml-sdks/python/pgml/docs/pgml/collection.md +++ /dev/null @@ -1,128 +0,0 @@ -Module pgml.collection -====================== - -Variables ---------- - - -`log` -: Collection class to store tables for documents, chunks, models, splitters, and embeddings - -Classes -------- - -`Collection(pool: psycopg_pool.pool.ConnectionPool, name: str)` -: The function initializes an object with a connection pool and a name, and creates several tables - while registering a text splitter and a model. - - :param pool: `pool` is an instance of `ConnectionPool` class which manages a pool of database - connections - :type pool: ConnectionPool - :param name: The `name` parameter is a string that represents the name of an object being - initialized. It is used as an identifier for the object within the code - :type name: str - - ### Methods - - `generate_chunks(self, splitter_id: int = 1) ‑> None` - : This function generates chunks of text from unchunked documents using a specified text splitter. - - :param splitter_id: The ID of the splitter to use for generating chunks, defaults to 1 - :type splitter_id: int (optional) - - `generate_embeddings(self, model_id: Optional[int] = 1, splitter_id: Optional[int] = 1) ‑> None` - : This function generates embeddings for chunks of text using a specified model and inserts them into - a database table. - - :param model_id: The ID of the model to use for generating embeddings, defaults to 1 - :type model_id: Optional[int] (optional) - :param splitter_id: The `splitter_id` parameter is an optional integer that specifies the ID of the - data splitter to use for generating embeddings. If not provided, it defaults to 1, defaults to 1 - :type splitter_id: Optional[int] (optional) - - `get_models(self) ‑> List[Dict[str, Any]]` - : The function retrieves a list of dictionaries containing information about models from a database - table. - :return: The function `get_models` is returning a list of dictionaries, where each dictionary - represents a model and contains the following keys: "id", "task", "name", and "parameters". The - values associated with these keys correspond to the respective fields in the database table - specified by `self.models_table`. - - `get_text_splitters(self) ‑> List[Dict[str, Any]]` - : This function retrieves a list of dictionaries containing information about text splitters from a - database. - :return: The function `get_text_splitters` is returning a list of dictionaries, where each - dictionary contains the `id`, `name`, and `parameters` of a text splitter. - - `register_model(self, task: Optional[str] = 'embedding', model_name: Optional[str] = 'intfloat/e5-small', model_params: Optional[Dict[str, Any]] = {}) ‑> None` - : This function registers a model in a database if it does not already exist. - - :param task: The type of task the model is being registered for, with a default value of - "embedding", defaults to embedding - :type task: Optional[str] (optional) - :param model_name: The name of the model being registered, defaults to intfloat/e5-small - :type model_name: Optional[str] (optional) - :param model_params: model_params is a dictionary that contains the parameters for the model being - registered. These parameters can be used to configure the model for a specific task. The dictionary - can be empty if no parameters are needed - :type model_params: Optional[Dict[str, Any]] - :return: the id of the registered model. - - `register_text_splitter(self, splitter_name: Optional[str] = 'RecursiveCharacterTextSplitter', splitter_params: Optional[Dict[str, Any]] = {}) ‑> None` - : This function registers a text splitter with a given name and parameters in a database table if it - does not already exist. - - :param splitter_name: The name of the text splitter being registered. It is an optional parameter - and defaults to "RecursiveCharacterTextSplitter" if not provided, defaults to - RecursiveCharacterTextSplitter - :type splitter_name: Optional[str] (optional) - :param splitter_params: splitter_params is a dictionary that contains parameters for a text - splitter. These parameters can be used to customize the behavior of the text splitter. The function - takes this dictionary as an optional argument and if it is not provided, an empty dictionary is used - as the default value - :type splitter_params: Optional[Dict[str, Any]] - :return: the id of the splitter that was either found in the database or inserted into the database. - - `upsert_documents(self, documents: List[Dict[str, Any]], text_key: Optional[str] = 'text', id_key: Optional[str] = 'id') ‑> None` - : The function `upsert_documents` inserts or updates documents in a database table based on their ID, - text, and metadata. - - :param documents: A list of dictionaries, where each dictionary represents a document to be upserted - into a database table. Each dictionary should contain metadata about the document, as well as the - actual text of the document - :type documents: List[Dict[str, Any]] - :param text_key: The key in the dictionary that corresponds to the text of the document, defaults to - text - :type text_key: Optional[str] (optional) - :param id_key: The `id_key` parameter is an optional string parameter that specifies the key in the - dictionary of each document that contains the unique identifier for that document. If this key is - present in the dictionary, its value will be used as the document ID. If it is not present, a hash - of the document, defaults to id - :type id_key: Optional[str] (optional) - :param verbose: A boolean parameter that determines whether or not to print verbose output during - the upsert process. If set to True, additional information will be printed to the console during the - upsert process. If set to False, only essential information will be printed, defaults to False - - `vector_search(self, query: str, query_parameters: Optional[Dict[str, Any]] = {}, top_k: int = 5, model_id: int = 1, splitter_id: int = 1) ‑> List[Dict[str, Any]]` - : This function performs a vector search on a database using a query and returns the top matching - results. - - :param query: The search query string - :type query: str - :param query_parameters: Optional dictionary of additional parameters to be used in generating - the query embeddings. These parameters are specific to the model being used and can be used to - fine-tune the search results. If no parameters are provided, default values will be used - :type query_parameters: Optional[Dict[str, Any]] - :param top_k: The number of search results to return, sorted by relevance score, defaults to 5 - :type top_k: int (optional) - :param model_id: The ID of the model to use for generating embeddings, defaults to 1 - :type model_id: int (optional) - :param splitter_id: The `splitter_id` parameter is an integer that identifies the specific - splitter used to split the documents into chunks. It is used to retrieve the embeddings table - associated with the specified splitter, defaults to 1 - :type splitter_id: int (optional) - :return: a list of dictionaries containing search results for a given query. Each dictionary - contains the following keys: "score", "text", and "metadata". The "score" key contains a float - value representing the similarity score between the query and the search result. The "text" key - contains the text of the search result, and the "metadata" key contains any metadata associated - with the search result \ No newline at end of file diff --git a/pgml-sdks/python/pgml/docs/pgml/database.md b/pgml-sdks/python/pgml/docs/pgml/database.md deleted file mode 100644 index aca3db50d..000000000 --- a/pgml-sdks/python/pgml/docs/pgml/database.md +++ /dev/null @@ -1,34 +0,0 @@ -Module pgml.database -==================== - -Classes -------- - -`Database(conninfo: str, min_connections: Optional[int] = 1)` -: This function initializes a connection pool and creates a table in a PostgreSQL database if it does - not already exist. - - :param conninfo: A string containing the connection information for the PostgreSQL database, such - as the host, port, database name, username, and password - :type conninfo: str - :param min_connections: The minimum number of connections that should be maintained in the - connection pool at all times. If there are no available connections in the pool when a new - connection is requested, a new connection will be created up to the maximum size of the pool, - defaults to 1 - :type min_connections: Optional[int] (optional) - - ### Methods - - `archive_collection(self, name: str) ‑> None` - : This function deletes a PostgreSQL schema if it exists. - - :param name: The name of the collection (or schema) to be deleted - :type name: str - - `create_or_get_collection(self, name: str) ‑> pgml.collection.Collection` - : This function creates a new collection in a PostgreSQL database if it does not already exist and - returns a Collection object. - - :param name: The name of the collection to be created - :type name: str - :return: A Collection object is being returned. \ No newline at end of file diff --git a/pgml-sdks/python/pgml/docs/pgml/dbutils.md b/pgml-sdks/python/pgml/docs/pgml/dbutils.md deleted file mode 100644 index 2acce516c..000000000 --- a/pgml-sdks/python/pgml/docs/pgml/dbutils.md +++ /dev/null @@ -1,48 +0,0 @@ -Module pgml.dbutils -=================== - -Functions ---------- - - -`run_create_or_insert_statement(conn: psycopg.Connection, statement: str, autocommit: bool = False) ‑> None` -: This function executes a SQL statement on a database connection and optionally commits the changes. - - :param conn: The `conn` parameter is a connection object that represents a connection to a database. - It is used to execute SQL statements and manage transactions - :type conn: Connection - - :param statement: The SQL statement to be executed - :type statement: str - - :param autocommit: A boolean parameter that determines whether the transaction should be - automatically committed after executing the statement. If set to True, the transaction will be - committed automatically. If set to False, the transaction will need to be manually committed using - the conn.commit() method, defaults to False - :type autocommit: bool (optional) - - -`run_drop_or_delete_statement(conn: psycopg.Connection, statement: str) ‑> None` -: This function executes a given SQL statement to drop or delete data from a database using a provided - connection object. - - :param conn: The parameter `conn` is of type `Connection`, which is likely a connection object to a - database. It is used to execute SQL statements on the database - :type conn: Connection - :param statement: The SQL statement to be executed on the database connection object - :type statement: str - - -`run_select_statement(conn: psycopg.Connection, statement: str) ‑> List[Any]` -: The function runs a select statement on a database connection and returns the results as a list of - dictionaries. - - :param conn: The `conn` parameter is a connection object that represents a connection to a database. - It is used to execute SQL statements and retrieve results from the database - :type conn: Connection - :param statement: The SQL SELECT statement to be executed on the database - :type statement: str - :return: The function `run_select_statement` returns a list of dictionaries, where each dictionary - represents a row of the result set of the SQL query specified in the `statement` parameter. The keys - of each dictionary are the column names of the result set, and the values are the corresponding - values of the row. \ No newline at end of file diff --git a/pgml-sdks/python/pgml/docs/pgml/index.md b/pgml-sdks/python/pgml/docs/pgml/index.md deleted file mode 100644 index 0fa32539c..000000000 --- a/pgml-sdks/python/pgml/docs/pgml/index.md +++ /dev/null @@ -1,8 +0,0 @@ -Module pgml -=========== - -Sub-modules ------------ -* pgml.collection -* pgml.database -* pgml.dbutils \ No newline at end of file diff --git a/pgml-sdks/python/pgml/examples/README.md b/pgml-sdks/python/pgml/examples/README.md deleted file mode 100644 index a77848eff..000000000 --- a/pgml-sdks/python/pgml/examples/README.md +++ /dev/null @@ -1,19 +0,0 @@ -## Examples - -### [Semantic Search](./semantic_search.py) -This is a basic example to perform semantic search on a collection of documents. It loads the Quora dataset, creates a collection in a PostgreSQL database, upserts documents, generates chunks and embeddings, and then performs a vector search on a query. Embeddings are created using `intfloat/e5-small` model. The results are are semantically similar documemts to the query. Finally, the collection is archived. - -### [Question Answering](./question_answering.py) -This is an example to find documents relevant to a question from the collection of documents. It loads the Stanford Question Answering Dataset (SQuAD) into the database, generates chunks and embeddings. Query is passed to vector search to retrieve documents that match closely in the embeddings space. A score is returned with each of the search result. - -### [Question Answering using Instructore Model](./question_answering_instructor.py) -In this example, we will use `hknlp/instructor-base` model to build text embeddings instead of the default `intfloat/e5-small` model. We will show how to use `register_model` method and use the `model_id` to build and query embeddings. - -### [Extractive Question Answering](./extractive_question_answering.py) -In this example, we will show how to use `vector_search` result as a `context` to a HuggingFace question answering model. We will use `pgml.transform` to run the model on the database. - -### [Table Question Answering](./table_question_answering.py) -In this example, we will use [Open Table-and-Text Question Answering (OTT-QA) -](https://github.com/wenhuchen/OTT-QA) dataset to run queries on tables. We will use `deepset/all-mpnet-base-v2-table` model that is trained for embedding tabular data for retrieval tasks. - - diff --git a/pgml-sdks/python/pgml/examples/extractive_question_answering.py b/pgml-sdks/python/pgml/examples/extractive_question_answering.py deleted file mode 100644 index fa3c95540..000000000 --- a/pgml-sdks/python/pgml/examples/extractive_question_answering.py +++ /dev/null @@ -1,78 +0,0 @@ -from pgml import Database -import os -import json -from datasets import load_dataset -from time import time -from dotenv import load_dotenv -from rich.console import Console -from psycopg_pool import ConnectionPool -import asyncio - -async def main(): - load_dotenv() - console = Console() - local_pgml = "postgres://postgres@127.0.0.1:5433/pgml_development" - conninfo = os.environ.get("PGML_CONNECTION", local_pgml) - db = Database(conninfo) - - collection_name = "squad_collection" - collection = await db.create_or_get_collection(collection_name) - - - data = load_dataset("squad", split="train") - data = data.to_pandas() - data = data.drop_duplicates(subset=["context"]) - - documents = [ - {"id": r["id"], "text": r["context"], "title": r["title"]} - for r in data.to_dict(orient="records") - ] - - console.print("Upserting documents ..") - await collection.upsert_documents(documents[:200]) - console.print("Generating chunks ..") - await collection.generate_chunks() - console.print("Generating embeddings ..") - await collection.generate_embeddings() - - console.print("Querying ..") - start = time() - query = "Who won more than 20 grammy awards?" - results = await collection.vector_search(query, top_k=5) - _end = time() - console.print("\nResults for '%s'" % (query), style="bold") - console.print(results) - console.print("Query time = %0.3f" % (_end - start)) - - # Get the context passage and use pgml.transform to get short answer to the question - - console.print("Getting context passage ..") - context = " ".join(results[0][1].strip().split()) - context = context.replace('"', '\\"').replace("'", "''") - - select_statement = """SELECT pgml.transform( - 'question-answering', - inputs => ARRAY[ - '{ - \"question\": \"%s\", - \"context\": \"%s\" - }' - ] - ) AS answer;""" % ( - query, - context, - ) - - pool = ConnectionPool(conninfo) - conn = pool.getconn() - cursor = conn.cursor() - cursor.execute(select_statement) - results = cursor.fetchall() - pool.putconn(conn) - - console.print("\nResults for query '%s'" % query) - console.print(results) - await db.archive_collection(collection_name) - -if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/README.md b/pgml-sdks/python/pgml/examples/fastapi-server/README.md deleted file mode 100644 index 77d9d0220..000000000 --- a/pgml-sdks/python/pgml/examples/fastapi-server/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# Documentation for FastAPI Example - -This document provides an overview of the available API endpoints `/ingest` and `/search`, how to use them, and how to run the server. - -## Run the Server - -To run the server, use the following command: - -```bash -poetry run python3 examples/fastapi-server/app/main.py -``` - - -## API Endpoints - -### `/ingest` Endpoint - -This endpoint allows you to ingest documents for processing. It expects a POST request with a JSON body that contains the details of the documents to be processed. - -#### Request - -- **URL:** `http://0.0.0.0:8888/ingest` -- **Method:** `POST` -- **Content-Type:** `application/json` -- **Body:** - -```json -{ - "collection_name": "", - "document_path": "" -} -``` - -#### Example - -You can use the following `curl` command as an example: - -```bash -curl --location 'http://0.0.0.0:8888/ingest' \ ---header 'Content-Type: application/json' \ ---data '{ - "collection_name": "test_collection", - "document_path": "~/path/to/pdf" -}' -``` - -### `/search` Endpoint - -This endpoint allows you to search within a given collection. It expects a POST request with a JSON body that contains the details of the search request. - - -#### Request - -- **URL:** `http://0.0.0.0:8888/search` -- **Method:** `POST` -- **Content-Type:** `application/json` -- **Body:** - -```json -{ - "collection_name": "", - "question": "", - "k": "", - "metadata_filter": "" -} -``` - -Note: The `k` and `metadata_filter` fields are optional. The `k` field is used to limit the number of search results, and the metadata_filter field is used to add additional filters on the metadata of the documents. - -### Example Request -You can use the following `curl` command as an example: - -```bash -curl --location 'http://0.0.0.0:8888/search' \ ---header 'Content-Type: application/json' \ ---data '{ - "collection_name": "testing", - "question": "What people did he met?" -}' -``` \ No newline at end of file diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/app/main.py b/pgml-sdks/python/pgml/examples/fastapi-server/app/main.py deleted file mode 100644 index 686703669..000000000 --- a/pgml-sdks/python/pgml/examples/fastapi-server/app/main.py +++ /dev/null @@ -1,102 +0,0 @@ -# Types -from typing import List -from pydantic import BaseModel - -from fastapi import FastAPI, HTTPException -from fastapi.middleware.cors import CORSMiddleware - -from pypdf import PdfReader -import os -import pgml -import uvicorn - -app = FastAPI() - - -@app.on_event("startup") -async def startup(): - local_pgml = "postgres://postgres@127.0.0.1:5433/pgml_development" - conninfo = os.environ.get("PGML_CONNECTION", local_pgml) - app.state.db: pgml.Database = pgml.Database(conninfo, min_connections=4) - - -class IngestionBody(BaseModel): - collection_name: str - document_path: str - - -class SearchBody(BaseModel): - question: str - collection_name: str - k: int = 5 - metadata_filter: dict = {} - - -@app.post("/ingest") -async def insert_documents(body: IngestionBody): - """ - Example: - curl --location 'http://0.0.0.0:8888/ingest' \ - --header 'Content-Type: application/json' \ - --data '{ - "collection_name": "test_collection", - "document_path": "~/path/to/pdf" - }' - """ - - try: - # # Get Db connection from pgml - db: pgml.Database = app.state.db - collection: pgml.Collection = db.create_or_get_collection(body.collection_name) - - # get documents, using Langchain Unstructored loader. - print("Loading Document") - # loader: List[Document] = UnstructuredFileLoader(body.document_path).load() - reader: PdfReader = PdfReader(body.document_path) - # Converting from Langchain Document to regular dict for pgml to process - documents: List[dict] = [ - { - "text": page.extract_text(), - "page": page_number, - "source": body.document_path, - } - for page_number, page in enumerate(reader.pages) - ] - - # fun stuff - collection.upsert_documents(documents) - collection.generate_chunks() - collection.generate_embeddings() - - return documents - - except Exception as e: - raise HTTPException(status_code=404, detail=str(e)) - - -@app.post("/search") -async def search_documents(body: SearchBody): - """ - Example: - curl --location 'http://0.0.0.0:8888/search' \ - --header 'Content-Type: application/json' \ - --data '{ - "collection_name": "testing", - "question": "What people did he met?" - }' - """ - - try: - # # Get Db connection from pgml - db: pgml.Database = app.state.db - collection: pgml.Collection = db.create_or_get_collection(body.collection_name) - return collection.vector_search( - body.question, top_k=body.k - ) - - except Exception as e: - raise HTTPException(status_code=404, detail=str(e)) - - -if __name__ == "__main__": - uvicorn.run(app, host="0.0.0.0", port=8888) diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/poetry.lock b/pgml-sdks/python/pgml/examples/fastapi-server/poetry.lock deleted file mode 100644 index 1508b2fa5..000000000 --- a/pgml-sdks/python/pgml/examples/fastapi-server/poetry.lock +++ /dev/null @@ -1,2706 +0,0 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.8.4" -description = "Async http client/server framework (asyncio)" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "anyio" -version = "3.7.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, -] - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - -[[package]] -name = "asttokens" -version = "2.2.1" -description = "Annotate AST trees with source code positions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -test = ["astroid", "pytest"] - -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - -[[package]] -name = "backports-zoneinfo" -version = "0.2.1" -description = "Backport of the standard library zoneinfo module" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, - {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, -] - -[package.extras] -tzdata = ["tzdata"] - -[[package]] -name = "black" -version = "23.3.0" -description = "The uncompromising code formatter." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.1.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "comm" -version = "0.1.3" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, -] - -[package.dependencies] -traitlets = ">=5.3" - -[package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] -test = ["pytest"] -typing = ["mypy (>=0.990)"] - -[[package]] -name = "dataclasses-json" -version = "0.5.8" -description = "Easily serialize dataclasses to and from JSON" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "dataclasses-json-0.5.8.tar.gz", hash = "sha256:6572ac08ad9340abcb74fd8c4c8e9752db2a182a402c8e871d0a8aa119e3804e"}, - {file = "dataclasses_json-0.5.8-py3-none-any.whl", hash = "sha256:65b167c15fdf9bde27569c09ac18dd39bf1cc5b7998525024cb4678d2653946c"}, -] - -[package.dependencies] -marshmallow = ">=3.3.0,<4.0.0" -marshmallow-enum = ">=1.5.1,<2.0.0" -typing-inspect = ">=0.4.0" - -[package.extras] -dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "simplejson", "types-dataclasses"] - -[[package]] -name = "datasets" -version = "2.13.0" -description = "HuggingFace community-driven open-source library of datasets" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "datasets-2.13.0-py3-none-any.whl", hash = "sha256:26671d474990ad8fd7388e8c67cde4d72f6c1f0e87af685fc09af5d9a5992274"}, - {file = "datasets-2.13.0.tar.gz", hash = "sha256:b8c3bcf9c3d0c74f101c7645e42231de9f45206a2e742df15799da9bfa625608"}, -] - -[package.dependencies] -aiohttp = "*" -dill = ">=0.3.0,<0.3.7" -fsspec = {version = ">=2021.11.1", extras = ["http"]} -huggingface-hub = ">=0.11.0,<1.0.0" -multiprocess = "*" -numpy = ">=1.17" -packaging = "*" -pandas = "*" -pyarrow = ">=8.0.0" -pyyaml = ">=5.1" -requests = ">=2.19.0" -tqdm = ">=4.62.1" -xxhash = "*" - -[package.extras] -apache-beam = ["apache-beam (>=2.26.0,<2.44.0)"] -audio = ["librosa", "soundfile (>=0.12.1)"] -benchmarks = ["numpy (==1.18.5)", "protobuf (==3.20.3)", "tensorflow (==2.3.0)", "torch (==1.7.1)", "transformers (==3.0.2)"] -dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "black (>=23.1,<24.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "pyyaml (>=5.3.1)", "rarfile (>=4.0)", "ruff (>=0.0.241)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] -docs = ["s3fs"] -jax = ["jax (>=0.2.8,!=0.3.2,<=0.3.25)", "jaxlib (>=0.1.65,<=0.3.25)"] -metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] -quality = ["black (>=23.1,<24.0)", "pyyaml (>=5.3.1)", "ruff (>=0.0.241)"] -s3 = ["s3fs"] -tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] -tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] -tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] -torch = ["torch"] -vision = ["Pillow (>=6.2.1)"] - -[[package]] -name = "debugpy" -version = "1.6.7" -description = "An implementation of the Debug Adapter Protocol for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, -] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "exceptiongroup" -version = "1.1.1" -description = "Backport of PEP 654 (exception groups)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "executing" -version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, -] - -[package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] - -[[package]] -name = "fastapi" -version = "0.97.0" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.97.0-py3-none-any.whl", hash = "sha256:95d757511c596409930bd20673358d4a4d709004edb85c5d24d6ffc48fabcbf2"}, - {file = "fastapi-0.97.0.tar.gz", hash = "sha256:b53248ee45f64f19bb7600953696e3edf94b0f7de94df1e5433fc5c6136fa986"}, -] - -[package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = ">=0.27.0,<0.28.0" - -[package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "filelock" -version = "3.12.2" -description = "A platform independent file lock." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, -] - -[package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "frozenlist" -version = "1.3.3" -description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, -] - -[[package]] -name = "fsspec" -version = "2023.6.0" -description = "File-system specification" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, - {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, -] - -[package.dependencies] -aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} -requests = {version = "*", optional = true, markers = "extra == \"http\""} - -[package.extras] -abfs = ["adlfs"] -adl = ["adlfs"] -arrow = ["pyarrow (>=1)"] -dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] -dropbox = ["dropbox", "dropboxdrivefs", "requests"] -full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] -fuse = ["fusepy"] -gcs = ["gcsfs"] -git = ["pygit2"] -github = ["requests"] -gs = ["gcsfs"] -gui = ["panel"] -hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] -libarchive = ["libarchive-c"] -oci = ["ocifs"] -s3 = ["s3fs"] -sftp = ["paramiko"] -smb = ["smbprotocol"] -ssh = ["paramiko"] -tqdm = ["tqdm"] - -[[package]] -name = "greenlet" -version = "2.0.2" -description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "huggingface-hub" -version = "0.15.1" -description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "huggingface_hub-0.15.1-py3-none-any.whl", hash = "sha256:05b0fb0abbf1f625dfee864648ac3049fe225ac4371c7bafaca0c2d3a2f83445"}, - {file = "huggingface_hub-0.15.1.tar.gz", hash = "sha256:a61b7d1a7769fe10119e730277c72ab99d95c48d86a3d6da3e9f3d0f632a4081"}, -] - -[package.dependencies] -filelock = "*" -fsspec = "*" -packaging = ">=20.9" -pyyaml = ">=5.1" -requests = "*" -tqdm = ">=4.42.1" -typing-extensions = ">=3.7.4.3" - -[package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] -cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] -fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] -tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "gradio", "jedi", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] -typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.6.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "ipykernel" -version = "6.23.2" -description = "IPython Kernel for Jupyter" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.23.2-py3-none-any.whl", hash = "sha256:7ccb6e2d32fd958c21453db494c914f3474908a2fdefd99ab548a5375b548d1f"}, - {file = "ipykernel-6.23.2.tar.gz", hash = "sha256:fcfb67c5b504aa1bfcda1c5b3716636239e0f7b9290958f1c558c79b4c0e7ed5"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=20" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "ipython" -version = "8.12.2" -description = "IPython: Productive Interactive Computing" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[[package]] -name = "ipywidgets" -version = "8.0.6" -description = "Jupyter interactive widgets" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.0.6-py3-none-any.whl", hash = "sha256:a60bf8d2528997e05ac83fd19ea2fbe65f2e79fbe1b2b35779bdfc46c2941dcc"}, - {file = "ipywidgets-8.0.6.tar.gz", hash = "sha256:de7d779f2045d60de9f6c25f653fdae2dba57898e6a1284494b3ba20b6893bb8"}, -] - -[package.dependencies] -ipykernel = ">=4.5.1" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.7,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.7,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "jedi" -version = "0.18.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, -] - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[[package]] -name = "jupyter-client" -version = "8.2.0" -description = "Jupyter protocol implementation and client libraries" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_client-8.2.0-py3-none-any.whl", hash = "sha256:b18219aa695d39e2ad570533e0d71fb7881d35a873051054a84ee2a17c4b7389"}, - {file = "jupyter_client-8.2.0.tar.gz", hash = "sha256:9fe233834edd0e6c0aa5f05ca2ab4bdea1842bfd2d8a932878212fc5301ddaf0"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-core" -version = "5.3.1" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.7" -description = "Jupyter interactive widgets for JupyterLab" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.7-py3-none-any.whl", hash = "sha256:c73f8370338ec19f1bec47254752d6505b03601cbd5a67e6a0b184532f73a459"}, - {file = "jupyterlab_widgets-3.0.7.tar.gz", hash = "sha256:c3a50ed5bf528a0c7a869096503af54702f86dda1db469aee1c92dc0c01b43ca"}, -] - -[[package]] -name = "langchain" -version = "0.0.167" -description = "Building applications with LLMs through composability" -category = "main" -optional = false -python-versions = ">=3.8.1,<4.0" -files = [ - {file = "langchain-0.0.167-py3-none-any.whl", hash = "sha256:f6950e748485cd6e927bbd4bdf27c0cad436d695e8e689caf42a411270059c69"}, - {file = "langchain-0.0.167.tar.gz", hash = "sha256:cf9581c1049f82db287122ca0270753031c051824b85f1779ea51a707c0cb21f"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.6.0" -numexpr = ">=2.8.4,<3.0.0" -numpy = ">=1,<2" -openapi-schema-pydantic = ">=1.2,<2.0" -pydantic = ">=1,<2" -PyYAML = ">=5.4.1" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" -tqdm = ">=4.48.0" - -[package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "docarray (>=0.31.0,<0.32.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "hnswlib (>=0.7.0,<0.8.0)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "lark (>=1.1.5,<2.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "opensearch-py (>=2.0.0,<3.0.0)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "protobuf (==3.19)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "sentence-transformers (>=2,<3)", "spacy (>=3,<4)", "tensorflow-text (>=2.11.0,<3.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] -azure = ["azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "openai (>=0,<1)"] -cohere = ["cohere (>=3,<4)"] -embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["pdfminer-six (>=20221105,<20221106)", "pypdf (>=3.4.0,<4.0.0)"] -hnswlib = ["docarray (>=0.31.0,<0.32.0)", "hnswlib (>=0.7.0,<0.8.0)", "protobuf (==3.19)"] -in-memory-store = ["docarray (>=0.31.0,<0.32.0)"] -llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] -qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "marshmallow" -version = "3.19.0" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, - {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, -] - -[package.dependencies] -packaging = ">=17.0" - -[package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "marshmallow-enum" -version = "1.5.1" -description = "Enum field for Marshmallow" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, - {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, -] - -[package.dependencies] -marshmallow = ">=2.0.0" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "multiprocess" -version = "0.70.14" -description = "better multiprocessing and multithreading in python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560a27540daef4ce8b24ed3cc2496a3c670df66c96d02461a4da67473685adf3"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:bfbbfa36f400b81d1978c940616bc77776424e5e34cb0c94974b178d727cfcd5"}, - {file = "multiprocess-0.70.14-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:89fed99553a04ec4f9067031f83a886d7fdec5952005551a896a4b6a59575bb9"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40a5e3685462079e5fdee7c6789e3ef270595e1755199f0d50685e72523e1d2a"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:44936b2978d3f2648727b3eaeab6d7fa0bedf072dc5207bf35a96d5ee7c004cf"}, - {file = "multiprocess-0.70.14-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e628503187b5d494bf29ffc52d3e1e57bb770ce7ce05d67c4bbdb3a0c7d3b05f"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d5da0fc84aacb0e4bd69c41b31edbf71b39fe2fb32a54eaedcaea241050855c"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:6a7b03a5b98e911a7785b9116805bd782815c5e2bd6c91c6a320f26fd3e7b7ad"}, - {file = "multiprocess-0.70.14-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cea5bdedd10aace3c660fedeac8b087136b4366d4ee49a30f1ebf7409bce00ae"}, - {file = "multiprocess-0.70.14-py310-none-any.whl", hash = "sha256:7dc1f2f6a1d34894c8a9a013fbc807971e336e7cc3f3ff233e61b9dc679b3b5c"}, - {file = "multiprocess-0.70.14-py37-none-any.whl", hash = "sha256:93a8208ca0926d05cdbb5b9250a604c401bed677579e96c14da3090beb798193"}, - {file = "multiprocess-0.70.14-py38-none-any.whl", hash = "sha256:6725bc79666bbd29a73ca148a0fb5f4ea22eed4a8f22fce58296492a02d18a7b"}, - {file = "multiprocess-0.70.14-py39-none-any.whl", hash = "sha256:63cee628b74a2c0631ef15da5534c8aedbc10c38910b9c8b18dcd327528d1ec7"}, - {file = "multiprocess-0.70.14.tar.gz", hash = "sha256:3eddafc12f2260d27ae03fe6069b12570ab4764ab59a75e81624fac453fbf46a"}, -] - -[package.dependencies] -dill = ">=0.3.6" - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nest-asyncio" -version = "1.5.6" -description = "Patch asyncio to allow nested event loops" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, -] - -[[package]] -name = "numexpr" -version = "2.8.4" -description = "Fast numerical expression evaluator for NumPy" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, -] - -[package.dependencies] -numpy = ">=1.13.3" - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "openapi-schema-pydantic" -version = "1.2.4" -description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, - {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, -] - -[package.dependencies] -pydantic = ">=1.8.2" - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pandas" -version = "2.0.2" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, - {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, - {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, - {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, - {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, - {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, - {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, - {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, - {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, - {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, - {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] - -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pgml" -version = "0.6.0" -description = "Python SDK is designed to facilitate the development of scalable vector search applications on PostgreSQL databases." -category = "main" -optional = false -python-versions = ">=3.8.1,<4.0" -files = [ - {file = "pgml-0.6.0-py3-none-any.whl", hash = "sha256:e53455bc14c99d526298938ddf7e23ff02ed5ac96082f631130175aec4706b6b"}, - {file = "pgml-0.6.0.tar.gz", hash = "sha256:8b01b5c1bf85636a6b6be43e1e964be388c1af83e815aa3096e3f180d9449117"}, -] - -[package.dependencies] -black = ">=23.3.0,<24.0.0" -datasets = ">=2.12.0,<3.0.0" -ipywidgets = ">=8.0.6,<9.0.0" -langchain = ">=0.0.167,<0.0.168" -psycopg = ">=3.1.9,<4.0.0" -psycopg-pool = ">=3.1.7,<4.0.0" -rich = ">=13.3.5,<14.0.0" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "platformdirs" -version = "3.5.3" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.5.3-py3-none-any.whl", hash = "sha256:0ade98a4895e87dc51d47151f7d2ec290365a585151d97b4d8d6312ed6132fed"}, - {file = "platformdirs-3.5.3.tar.gz", hash = "sha256:e48fabd87db8f3a7df7150a4a5ea22c546ee8bc39bc2473244730d4b56d2cc4e"}, -] - -[package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.38" -description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "psutil" -version = "5.9.5" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[package]] -name = "psycopg" -version = "3.1.9" -description = "PostgreSQL database adapter for Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "psycopg-3.1.9-py3-none-any.whl", hash = "sha256:fbbac339274d8733ee70ba9822297af3e8871790a26e967b5ea53e30a4b74dcc"}, - {file = "psycopg-3.1.9.tar.gz", hash = "sha256:ab400f207a8c120bafdd8077916d8f6c0106e809401378708485b016508c30c9"}, -] - -[package.dependencies] -"backports.zoneinfo" = {version = ">=0.2.0", markers = "python_version < \"3.9\""} -typing-extensions = ">=4.1" -tzdata = {version = "*", markers = "sys_platform == \"win32\""} - -[package.extras] -binary = ["psycopg-binary (==3.1.9)"] -c = ["psycopg-c (==3.1.9)"] -dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.2)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] -docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] -pool = ["psycopg-pool"] -test = ["anyio (>=3.6.2)", "mypy (>=1.2)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] - -[[package]] -name = "psycopg-pool" -version = "3.1.7" -description = "Connection Pool for Psycopg" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "psycopg-pool-3.1.7.tar.gz", hash = "sha256:d02741dc48303495f4021900630442af87d6b1c3bfd1a3ece54cc11aa43d7dde"}, - {file = "psycopg_pool-3.1.7-py3-none-any.whl", hash = "sha256:ca1f2c366b5910acd400e16e812912827c57836af638c1717ba495111d22073b"}, -] - -[package.dependencies] -typing-extensions = ">=3.10" - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "pyarrow" -version = "12.0.1" -description = "Python library for Apache Arrow" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, - {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, - {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, - {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, - {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, - {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, - {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, - {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, - {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, -] - -[package.dependencies] -numpy = ">=1.16.6" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydantic" -version = "1.10.9" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"}, - {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"}, - {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"}, - {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"}, - {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"}, - {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"}, - {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"}, - {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"}, - {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"}, - {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pypdf" -version = "3.9.1" -description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pypdf-3.9.1-py3-none-any.whl", hash = "sha256:5f4abdb4691a8d7631e7f2db09f66cfe3a388a072882d8375c6b1bdc28027c0a"}, - {file = "pypdf-3.9.1.tar.gz", hash = "sha256:c2b7fcfe25fbd04e8da600cb2700267ecee7e8781dc798cce3a4f567143a4df1"}, -] - -[package.dependencies] -typing_extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -crypto = ["PyCryptodome"] -dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"] -docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] -full = ["Pillow", "PyCryptodome"] -image = ["Pillow"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "pyzmq" -version = "25.1.0" -description = "Python bindings for 0MQ" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rich" -version = "13.4.2" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, - {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.16" -description = "Database Abstraction Library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7641f6ed2682de84d77c4894cf2e43700f3cf7a729361d7f9cac98febf3d8614"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d3cbdb2f07fb0e4b897dc1df39166735e194fb946f28f26f4c9f9801c8b24f7"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08a791c75d6154d46914d1e23bd81d9455f2950ec1de81f2723848c593d2c8b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91eb8f89fcce8f709f8a4d65d265bc48a80264ee14c7c9e955f3222f19b4b39c"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc1dae11bd5167f9eb53b3ccad24a79813004612141e76de21cf4c028dc30b34"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b2801f85c5c0293aa710f8aa5262c707a83c1c203962ae5a22b4d9095e71aa9d"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win32.whl", hash = "sha256:c5e333b81fe10d14efebd4e9429b7bb865ed9463ca8bef07a7136dfa1fd4a37b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win_amd64.whl", hash = "sha256:f387b496a4c9474d8580195bb2660264a3f295a04d3a9d00f4fa15e9e597427e"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7be04dbe3470fe8dd332fdb48c979887c381ef6c635eddf2dec43d2766111be4"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2938edc512dd1fa48653e14c1655ab46144d4450f0e6b33da7acd8ba77fbfd7"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a2856e12cf5f54301ddf043bcbf0552561d61555e1bcf348b63f42b8e1eec2"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d320fde566b864adbc19abb40ecb80f4e25d6f084639969bb972d5cca16858"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e85e315725807c127ad8ba3d628fdb861cf9ebfb0e10c39a97c01e257cdd71b"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63ea36c08792a7a8a08958bc806ecff6b491386feeaf14607c3d9d2d9325e67f"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win32.whl", hash = "sha256:bdaf89dd82f4a0e1b8b5ffc9cdc0c9551be6175f7eee5af6a838e92ba2e57100"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win_amd64.whl", hash = "sha256:5a934eff1a2882137be3384826f997db8441d43b61fda3094923e69fffe474be"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcc51fdbc89fafe4f4fe66f59372a8be88ded04de34ef438ab04f980beb12d4"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff6496ad5e9dc8baeb93a151cc2f599d01e5f8928a2aaf0b09a06428fdbaf553"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6ef848e5afcd1bda3e9a843751f845c0ca888b61e669237680e913d84ec206"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3ef876615ff4b53e2033022195830ec4941a6e21068611f8d77de60203b90a98"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8544c6e62eacb77d5106e2055ef10f2407fc0dbd547e879f8745b2032eefd2bc"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win32.whl", hash = "sha256:2f3b6c31b915159b96b68372212fa77f69230b0a32acab40cf539d2823954f5a"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win_amd64.whl", hash = "sha256:d0c96592f54edd571e00ba6b1ed5df8263328ca1da9e78088c0ebc93c2e6562c"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a2e9f50a906d0b81292576a9fb458f8cace904c81a67088f4a2ca9ff2856f55d"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc97238fa44be86971270943a0c21c19ce18b8d1596919048e57912e8abc02cc"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0db6734cb5644c55d0262a813b764c6e2cda1e66e939a488b3d6298cdc7344c2"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131f0c894c6572cb1bdcf97c92d999d3128c4ff1ca13061296057072f61afe13"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f662cf69484c59f8a3435902c40dfc34d86050bdb15e23d437074ce9f153306b"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b72f4e4def50414164a1d899f2ce4e782a029fad0ed5585981d1611e8ae29a74"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win32.whl", hash = "sha256:0e4645b260cfe375a0603aa117f0a47680864cf37833129da870919e88b08d8f"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win_amd64.whl", hash = "sha256:f409f35a0330ab0cb18ece736b86d8b8233c64f4461fcb10993f67afc0ac7e5a"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e19546924f0cf2ec930d1faf318b7365e5827276410a513340f31a2b423e96a4"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce1fc3f64fd42d5f763d6b83651471f32920338a1ba107a3186211474861af57"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e2569dac4e3cb85365b91ab569d06a221e0e17e65ce59949d00c3958946282b"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f2035dea56ff1a429077e481496f813378beb02b823d2e3e7eb05bc1a7a8ca"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:81d867c1be5abd49f7e547c108391f371a9d980ba7ec34666c50d683f782b754"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2de1477af7f48c633b8ecb88245aedd811dca88e88aee9e9d787b388abe74c44"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win32.whl", hash = "sha256:5e8522b49e0e640287308b68f71cc338446bbe1c226c8f81743baa91b0246e92"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win_amd64.whl", hash = "sha256:43e69c8c1cea0188b7094e22fb93ae1a1890aac748628b7e925024a206f75368"}, - {file = "SQLAlchemy-2.0.16-py3-none-any.whl", hash = "sha256:53081c6fce0d49bb36d05f12dc87e008c9b0df58a163b792c5fc4ac638925f98"}, - {file = "SQLAlchemy-2.0.16.tar.gz", hash = "sha256:1e2caba78e7d1f5003e88817b7a1754d4e58f4a8f956dc423bf8e304c568ab09"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" - -[package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[[package]] -name = "starlette" -version = "0.27.0" -description = "The little ASGI library that shines." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "tenacity" -version = "8.2.2" -description = "Retry code until it succeeds" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, -] - -[package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tornado" -version = "6.3.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, -] - -[[package]] -name = "tqdm" -version = "4.65.0" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "traitlets" -version = "5.9.0" -description = "Traitlets Python configuration system" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - -[[package]] -name = "typing-extensions" -version = "4.6.3" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, -] - -[[package]] -name = "typing-inspect" -version = "0.9.0" -description = "Runtime inspection utilities for typing module." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, - {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, -] - -[package.dependencies] -mypy-extensions = ">=0.3.0" -typing-extensions = ">=3.7.4" - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -category = "main" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, -] - -[[package]] -name = "urllib3" -version = "2.0.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, - {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "uvicorn" -version = "0.22.0" -description = "The lightning-fast ASGI server." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, - {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, -] - -[package.dependencies] -click = ">=7.0" -h11 = ">=0.8" - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, -] - -[[package]] -name = "widgetsnbextension" -version = "4.0.7" -description = "Jupyter interactive widgets for Jupyter Notebook" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.7-py3-none-any.whl", hash = "sha256:be3228a73bbab189a16be2d4a3cd89ecbd4e31948bfdc64edac17dcdee3cd99c"}, - {file = "widgetsnbextension-4.0.7.tar.gz", hash = "sha256:ea67c17a7cd4ae358f8f46c3b304c40698bc0423732e3f273321ee141232c8be"}, -] - -[[package]] -name = "xxhash" -version = "3.2.0" -description = "Python binding for xxHash" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "xxhash-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af44b9e59c4b2926a4e3c7f9d29949ff42fcea28637ff6b8182e654461932be8"}, - {file = "xxhash-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1bdd57973e2b802ef32553d7bebf9402dac1557874dbe5c908b499ea917662cd"}, - {file = "xxhash-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b7c9aa77bbce61a5e681bd39cb6a804338474dcc90abe3c543592aa5d6c9a9b"}, - {file = "xxhash-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11bf87dc7bb8c3b0b5e24b7b941a9a19d8c1f88120b6a03a17264086bc8bb023"}, - {file = "xxhash-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2783d41487ce6d379fdfaa7332fca5187bf7010b9bddcf20cafba923bc1dc665"}, - {file = "xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:561076ca0dcef2fbc20b2bc2765bff099e002e96041ae9dbe910a863ca6ee3ea"}, - {file = "xxhash-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a26eeb4625a6e61cedc8c1b39b89327c9c7e1a8c2c4d786fe3f178eb839ede6"}, - {file = "xxhash-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d93a44d0104d1b9b10de4e7aadf747f6efc1d7ec5ed0aa3f233a720725dd31bd"}, - {file = "xxhash-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:89585adc73395a10306d2e2036e50d6c4ac0cf8dd47edf914c25488871b64f6d"}, - {file = "xxhash-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a892b4b139126a86bfdcb97cd912a2f8c4e8623869c3ef7b50871451dd7afeb0"}, - {file = "xxhash-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e998efb190653f70e0f30d92b39fc645145369a4823bee46af8ddfc244aa969d"}, - {file = "xxhash-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8ed3bd2b8bb3277710843ca63e4f5c3ee6f8f80b083be5b19a7a9905420d11e"}, - {file = "xxhash-3.2.0-cp310-cp310-win32.whl", hash = "sha256:20181cbaed033c72cb881b2a1d13c629cd1228f113046133469c9a48cfcbcd36"}, - {file = "xxhash-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a0f7a16138279d707db778a63264d1d6016ac13ffd3f1e99f54b2855d6c0d8e1"}, - {file = "xxhash-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5daff3fb5bfef30bc5a2cb143810d376d43461445aa17aece7210de52adbe151"}, - {file = "xxhash-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bb5be3c5de702a547715f320ecf5c8014aeca750ed5147ca75389bd22e7343"}, - {file = "xxhash-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01f36b671ff55cb1d5c2f6058b799b697fd0ae4b4582bba6ed0999678068172a"}, - {file = "xxhash-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4d4519123aac73c93159eb8f61db9682393862dd669e7eae034ecd0a35eadac"}, - {file = "xxhash-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:994e4741d5ed70fc2a335a91ef79343c6b1089d7dfe6e955dd06f8ffe82bede6"}, - {file = "xxhash-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:919bc1b010aa6ff0eb918838ff73a435aed9e9a19c3202b91acecd296bf75607"}, - {file = "xxhash-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17b65454c5accbb079c45eca546c27c4782f5175aa320758fafac896b1549d27"}, - {file = "xxhash-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b0c094d5e65a46dbf3fe0928ff20873a747e6abfd2ed4b675beeb2750624bc2e"}, - {file = "xxhash-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f94163ebe2d5546e6a5977e96d83621f4689c1054053428cf8d4c28b10f92f69"}, - {file = "xxhash-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cead7c0307977a00b3f784cff676e72c147adbcada19a2e6fc2ddf54f37cf387"}, - {file = "xxhash-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a0e1bd0260c1da35c1883321ce2707ceea07127816ab625e1226ec95177b561a"}, - {file = "xxhash-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc8878935671490efe9275fb4190a6062b73277bd273237179b9b5a2aa436153"}, - {file = "xxhash-3.2.0-cp311-cp311-win32.whl", hash = "sha256:a433f6162b18d52f7068175d00bd5b1563b7405f926a48d888a97b90a160c40d"}, - {file = "xxhash-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:a32d546a1752e4ee7805d6db57944f7224afa7428d22867006b6486e4195c1f3"}, - {file = "xxhash-3.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82daaab720866bf690b20b49de5640b0c27e3b8eea2d08aa75bdca2b0f0cfb63"}, - {file = "xxhash-3.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3126df6520cbdbaddd87ce74794b2b6c45dd2cf6ac2b600a374b8cdb76a2548c"}, - {file = "xxhash-3.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e172c1ee40507ae3b8d220f4048aaca204f203e1e4197e8e652f5c814f61d1aa"}, - {file = "xxhash-3.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5384f1d9f30876f5d5b618464fb19ff7ce6c0fe4c690fbaafd1c52adc3aae807"}, - {file = "xxhash-3.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26cb52174a7e96a17acad27a3ca65b24713610ac479c99ac9640843822d3bebf"}, - {file = "xxhash-3.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbcd613a5e76b1495fc24db9c37a6b7ee5f214fd85979187ec4e032abfc12ded"}, - {file = "xxhash-3.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f988daf25f31726d5b9d0be6af636ca9000898f9ea43a57eac594daea25b0948"}, - {file = "xxhash-3.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bbc30c98ab006ab9fc47e5ed439c00f706bc9d4441ff52693b8b6fea335163e0"}, - {file = "xxhash-3.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2408d49260b0a4a7cc6ba445aebf38e073aeaf482f8e32767ca477e32ccbbf9e"}, - {file = "xxhash-3.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:3f4152fd0bf8b03b79f2f900fd6087a66866537e94b5a11fd0fd99ef7efe5c42"}, - {file = "xxhash-3.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0eea848758e4823a01abdbcccb021a03c1ee4100411cbeeb7a5c36a202a0c13c"}, - {file = "xxhash-3.2.0-cp36-cp36m-win32.whl", hash = "sha256:77709139af5123c578ab06cf999429cdb9ab211047acd0c787e098dcb3f1cb4d"}, - {file = "xxhash-3.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:91687671fd9d484a4e201ad266d366b695a45a1f2b41be93d116ba60f1b8f3b3"}, - {file = "xxhash-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e4af8bc5c3fcc2192c266421c6aa2daab1a18e002cb8e66ef672030e46ae25cf"}, - {file = "xxhash-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8be562e2ce3e481d9209b6f254c3d7c5ff920eb256aba2380d2fb5ba75d4f87"}, - {file = "xxhash-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9eba0c7c12126b12f7fcbea5513f28c950d28f33d2a227f74b50b77789e478e8"}, - {file = "xxhash-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2198c4901a0223c48f6ec0a978b60bca4f4f7229a11ca4dc96ca325dd6a29115"}, - {file = "xxhash-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50ce82a71b22a3069c02e914bf842118a53065e2ec1c6fb54786e03608ab89cc"}, - {file = "xxhash-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5019fb33711c30e54e4e57ae0ca70af9d35b589d385ac04acd6954452fa73bb"}, - {file = "xxhash-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d54ac023eef7e3ac9f0b8841ae8a376b933043bc2ad428121346c6fa61c491c"}, - {file = "xxhash-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c55fa832fc3fe64e0d29da5dc9b50ba66ca93312107cec2709300ea3d3bab5c7"}, - {file = "xxhash-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4ce006215497993ae77c612c1883ca4f3973899573ce0c52fee91f0d39c4561"}, - {file = "xxhash-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1afb9b9d27fd675b436cb110c15979976d92d761ad6e66799b83756402f3a974"}, - {file = "xxhash-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:baa99cebf95c1885db21e119395f222a706a2bb75a545f0672880a442137725e"}, - {file = "xxhash-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:75aa692936942ccb2e8fd6a386c81c61630ac1b6d6e921698122db8a930579c3"}, - {file = "xxhash-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0a2cdfb5cae9fafb9f7b65fd52ecd60cf7d72c13bb2591ea59aaefa03d5a8827"}, - {file = "xxhash-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a68d1e8a390b660d94b9360ae5baa8c21a101bd9c4790a8b30781bada9f1fc6"}, - {file = "xxhash-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ce7c3ce28f94302df95eaea7c9c1e2c974b6d15d78a0c82142a97939d7b6c082"}, - {file = "xxhash-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dcb419bf7b0bc77d366e5005c25682249c5521a63fd36c51f584bd91bb13bd5"}, - {file = "xxhash-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae521ed9287f86aac979eeac43af762f03d9d9797b2272185fb9ddd810391216"}, - {file = "xxhash-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d16775094423088ffa357d09fbbb9ab48d2fb721d42c0856b801c86f616eec"}, - {file = "xxhash-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe454aeab348c42f56d6f7434ff758a3ef90787ac81b9ad5a363cd61b90a1b0b"}, - {file = "xxhash-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052fd0efdd5525c2dbc61bebb423d92aa619c4905bba605afbf1e985a562a231"}, - {file = "xxhash-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:02badf3754e2133de254a4688798c4d80f0060635087abcb461415cb3eb82115"}, - {file = "xxhash-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:66b8a90b28c13c2aae7a71b32638ceb14cefc2a1c8cf23d8d50dfb64dfac7aaf"}, - {file = "xxhash-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:649cdf19df175925ad87289ead6f760cd840730ee85abc5eb43be326a0a24d97"}, - {file = "xxhash-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4b948a03f89f5c72d69d40975af8af241111f0643228796558dc1cae8f5560b0"}, - {file = "xxhash-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49f51fab7b762da7c2cee0a3d575184d3b9be5e2f64f26cae2dd286258ac9b3c"}, - {file = "xxhash-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1a42994f0d42b55514785356722d9031f064fd34e495b3a589e96db68ee0179d"}, - {file = "xxhash-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a6d58ba5865475e53d6c2c4fa6a62e2721e7875e146e2681e5337a6948f12e7"}, - {file = "xxhash-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aabdbc082030f8df613e2d2ea1f974e7ad36a539bdfc40d36f34e55c7e4b8e94"}, - {file = "xxhash-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:498843b66b9ca416e9d03037e5875c8d0c0ab9037527e22df3b39aa5163214cd"}, - {file = "xxhash-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a910b1193cd90af17228f5d6069816646df0148f14f53eefa6b2b11a1dedfcd0"}, - {file = "xxhash-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb6d8ce31dc25faf4da92991320e211fa7f42de010ef51937b1dc565a4926501"}, - {file = "xxhash-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:883dc3d3942620f4c7dbc3fd6162f50a67f050b714e47da77444e3bcea7d91cc"}, - {file = "xxhash-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dc8bfacf89b8f5be54d55bc3b4bd6d74d0c5320c8a63d2538ac7df5b96f1d5"}, - {file = "xxhash-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61e6aa1d30c2af692aa88c4dd48709426e8b37bff6a574ee2de677579c34a3d6"}, - {file = "xxhash-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:314ec0bd21f0ee8d30f2bd82ed3759314bd317ddbbd8555668f3d20ab7a8899a"}, - {file = "xxhash-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dad638cde3a5357ad3163b80b3127df61fb5b5e34e9e05a87697144400ba03c7"}, - {file = "xxhash-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:eaa3ea15025b56076d806b248948612289b093e8dcda8d013776b3848dffff15"}, - {file = "xxhash-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7deae3a312feb5c17c97cbf18129f83cbd3f1f9ec25b0f50e2bd9697befb22e7"}, - {file = "xxhash-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:add774341c09853b1612c64a526032d95ab1683053325403e1afbe3ad2f374c5"}, - {file = "xxhash-3.2.0-cp39-cp39-win32.whl", hash = "sha256:9b94749130ef3119375c599bfce82142c2500ef9ed3280089157ee37662a7137"}, - {file = "xxhash-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e57d94a1552af67f67b27db5dba0b03783ea69d5ca2af2f40e098f0ba3ce3f5f"}, - {file = "xxhash-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92fd765591c83e5c5f409b33eac1d3266c03d3d11c71a7dbade36d5cdee4fbc0"}, - {file = "xxhash-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8970f6a411a9839a02b23b7e90bbbba4a6de52ace009274998566dc43f36ca18"}, - {file = "xxhash-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5f3e33fe6cbab481727f9aeb136a213aed7e33cd1ca27bd75e916ffacc18411"}, - {file = "xxhash-3.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:368265392cb696dd53907e2328b5a8c1bee81cf2142d0cc743caf1c1047abb36"}, - {file = "xxhash-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3b1f3c6d67fa9f49c4ff6b25ce0e7143bab88a5bc0f4116dd290c92337d0ecc7"}, - {file = "xxhash-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c5e8db6e1ee7267b7c412ad0afd5863bf7a95286b8333a5958c8097c69f94cf5"}, - {file = "xxhash-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:761df3c7e2c5270088b691c5a8121004f84318177da1ca1db64222ec83c44871"}, - {file = "xxhash-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2d15a707e7f689531eb4134eccb0f8bf3844bb8255ad50823aa39708d9e6755"}, - {file = "xxhash-3.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6b2ba4ff53dd5f57d728095e3def7375eb19c90621ce3b41b256de84ec61cfd"}, - {file = "xxhash-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:61b0bcf946fdfd8ab5f09179dc2b5c74d1ef47cedfc6ed0ec01fdf0ee8682dd3"}, - {file = "xxhash-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f7b79f0f302396d8e0d444826ceb3d07b61977793886ebae04e82796c02e42dc"}, - {file = "xxhash-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0773cd5c438ffcd5dbff91cdd503574f88a4b960e70cedeb67736583a17a918"}, - {file = "xxhash-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ec1f57127879b419a2c8d2db9d9978eb26c61ae17e5972197830430ae78d25b"}, - {file = "xxhash-3.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d4b15c00e807b1d3d0b612338c814739dec310b80fb069bd732b98ddc709ad7"}, - {file = "xxhash-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9d3f686e3d1c8900c5459eee02b60c7399e20ec5c6402364068a343c83a61d90"}, - {file = "xxhash-3.2.0.tar.gz", hash = "sha256:1afd47af8955c5db730f630ad53ae798cf7fae0acb64cebb3cf94d35c47dd088"}, -] - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.8.1" -content-hash = "fdad59f68c3a283c69451910ecf2551a62267c39463bf29edbdd321933f642b8" diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/pyproject.toml b/pgml-sdks/python/pgml/examples/fastapi-server/pyproject.toml deleted file mode 100644 index 581d97f73..000000000 --- a/pgml-sdks/python/pgml/examples/fastapi-server/pyproject.toml +++ /dev/null @@ -1,20 +0,0 @@ -[tool.poetry] -name = "fastapi-server" -version = "0.1.0" -description = "FastAPI example project to demonstrate pgml sdk" -authors = ["PostgresML "] -readme = "README.md" -packages = [{include = "fastapi_server"}] - -[tool.poetry.dependencies] -python = "^3.8.1" -fastapi = "^0.97.0" -uvicorn = "^0.22.0" -pgml = "^0.6.0" -pypdf = "^3.9.1" -black = "^23.3.0" - - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_long.pdf b/pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_long.pdf deleted file mode 100644 index 9e189cdf730d342bb846622f31aad7d3975a4cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58285 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 FxB&FaEjj=I diff --git a/pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_short.pdf b/pgml-sdks/python/pgml/examples/fastapi-server/state_of_the_union_short.pdf deleted file mode 100644 index e2895ab2c0d89abfce8067cf2a3de1215bd6bd49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21427 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

_Z1P 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 Self { + Self { + x + } + } + + fn get(&self) -> i32 { + self.x + } +} +``` + +and automatically produce the following Python code: + +```python +class Test: + def __new__(self, x): + self.x = x + + def get(self): + return self.x +``` + +This is not what our library does. We have not written a Rust to Python transpiler, instead we wrote a Rust to Rust transpiler that uses crates like [Py03](https://github.com/PyO3/pyo3) to automatically write the necessary [foreign function interfaces](https://en.wikipedia.org/wiki/Foreign_function_interface). + +A real example of translating our `Test` struct would look like the following: + +```rust +#[derive(alias, Debug, Clone)] +pub struct Test { + x: i32, +} + +#[alias_methods(new, get)] +impl Test { + pub fn new(x: i32) -> Self { + Self { x } + } + + pub fn get(&self) -> i32{ + self.x + } +} +``` + +These macros produce a lot of code, you can inspect it using [cargo-expand](https://github.com/dtolnay/cargo-expand) but we will just show the snippes necessary to understand what is happening: + +```rust +pub struct Test { + x: i32, +} + +#[cfg(feature = "python")] +#[pyo3::pyclass] +pub struct TestPython { + pub wrapped: std::boxed::Box, +} + +impl Test { + pub fn new(x: i32) -> Self { + Self { x } + } + + pub fn get(&self) -> i32 { + self.x + } +} + +#[cfg(feature = "python")] +impl TestPython { + pub fn new<'a>(x: i32, py: pyo3::Python<'a>) -> pyo3::PyResult { + use rust_bridge::python::CustomInto; + let x: i32 = x.custom_into(); + let x = Test::new(x); + let x: Self = x.custom_into(); + Ok(x) + } + + pub fn get<'a>(&mut self, py: pyo3::Python<'a>) -> pyo3::PyResult { + use rust_bridge::python::CustomInto; + let mut wrapped: &Test = self.custom_into(); + let x = wrapped.get(); + let x: i32 = x.custom_into(); + Ok(x) + } +} + +``` + +NOTE: this is not the exact code output, but very similar to what you would see with `cargo-expand`. + +The struct `Test` is defined just like before, but notice there is another struct `TestPython`. This struct also has the `pyo3::pyclass` macro being applied to it. This macro is used by Py03 to generate a Python class. + +`TestPython` can be thought of as a Py03 compatible wrapper around `Test`. It wraps `Test` drawing a clear line between our normal Rust code, and Py03 compatible Rust. + +The impl block for the struct `Test` is there just like before, but notice the impl block for `TestPython` which is written in the fashion Py03 requires, but simply parses arguments and calls through to `Test`'s methods. + +The key takeaway is that the macros used in this crate take vanilla Rust code and translate it to Rust that crates like Py03 expect and use to generate native Python classes. + +# Python + +This crate translates Rust to [Py03](https://github.com/PyO3/pyo3) compatible Rust. See the [examples](/examples) folder for how to use it. + +# JavaScript + +This crate translates Rust to [Neon](https://neon-bindings.com/) compatible Rust. See the [examples](/examples) folder for how to use it. diff --git a/pgml-sdks/rust-bridge/examples/readme-example/Cargo.lock b/pgml-sdks/rust-bridge/examples/readme-example/Cargo.lock new file mode 100644 index 000000000..a3c78701c --- /dev/null +++ b/pgml-sdks/rust-bridge/examples/readme-example/Cargo.lock @@ -0,0 +1,651 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "indoc" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "macros-test" +version = "0.1.0" +dependencies = [ + "neon", + "pyo3", + "pyo3-asyncio", + "rust_bridge", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "neon" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" +dependencies = [ + "neon-build", + "neon-macros", + "neon-runtime", + "semver", + "smallvec", +] + +[[package]] +name = "neon-build" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" + +[[package]] +name = "neon-macros" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" +dependencies = [ + "quote", + "syn 1.0.109", + "syn-mid", +] + +[[package]] +name = "neon-runtime" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" +dependencies = [ + "cfg-if", + "libloading", + "smallvec", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b1ac5b3731ba34fdaa9785f8d74d17448cd18f30cf19e0c7e7b1fdb5272109" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "parking_lot", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-asyncio" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3564762e37035cfc486228e10b0528460fa026d681b5763873c693aa0d5c260" +dependencies = [ + "futures", + "once_cell", + "pin-project-lite", + "pyo3", + "pyo3-asyncio-macros", + "tokio", +] + +[[package]] +name = "pyo3-asyncio-macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be72d4cd43a27530306bd0d20d3932182fbdd072c6b98d3638bc37efb9d559dd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pyo3-build-config" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cb946f5ac61bb61a5014924910d936ebd2b23b705f7a4a3c40b05c720b079a3" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4d7c5337821916ea2a1d21d1092e8443cf34879e53a0ac653fbb98f44ff65c" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d39c55dab3fc5a4b25bbd1ac10a2da452c4aca13bb450f22818a002e29648d" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97daff08a4c48320587b5224cc98d609e3c27b6d437315bd40b605c98eeb5918" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rust_bridge" +version = "0.1.0" +dependencies = [ + "rust_bridge_macros", + "rust_bridge_traits", +] + +[[package]] +name = "rust_bridge_macros" +version = "0.1.0" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "rust_bridge_traits" +version = "0.1.0" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-mid" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea305d57546cc8cd04feb14b62ec84bf17f50e3f7b12560d7bfa9265f39d9ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + +[[package]] +name = "tokio" +version = "1.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +dependencies = [ + "backtrace", + "num_cpus", + "pin-project-lite", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unindent" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/pgml-sdks/rust-bridge/examples/readme-example/Cargo.toml b/pgml-sdks/rust-bridge/examples/readme-example/Cargo.toml new file mode 100644 index 000000000..a0b3df8e5 --- /dev/null +++ b/pgml-sdks/rust-bridge/examples/readme-example/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "macros-test" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rust_bridge = {path = "../../rust-bridge", version = "0.1.0"} +pyo3 = { version = "0.18.3", optional = true, features = ["extension-module"] } +pyo3-asyncio = { version = "0.18", features = ["attributes", "tokio-runtime"], optional = true } +neon = { version = "0.10", optional = true, default-features = false, features = ["napi-6", "promise-api", "channel-api"] } + +[features] +default = ["python"] +python = ["dep:pyo3", "dep:pyo3-asyncio"] +javascript = ["dep:neon"] diff --git a/pgml-sdks/rust-bridge/examples/readme-example/src/main.rs b/pgml-sdks/rust-bridge/examples/readme-example/src/main.rs new file mode 100644 index 000000000..5170b2054 --- /dev/null +++ b/pgml-sdks/rust-bridge/examples/readme-example/src/main.rs @@ -0,0 +1,21 @@ +use rust_bridge::{alias, alias_manual, alias_methods}; + +#[derive(alias, Debug, Clone)] +pub struct Test { + x: i32, +} + +#[alias_methods(new, get)] +impl Test { + pub fn new(x: i32) -> Self { + Self { x } + } + + pub fn get(&self) -> i32{ + self.x + } +} + +fn main() { + println!("Hello, world!"); +} diff --git a/pgml-sdks/rust/pgml-macros/Cargo.toml b/pgml-sdks/rust-bridge/rust-bridge-macros/Cargo.toml similarity index 91% rename from pgml-sdks/rust/pgml-macros/Cargo.toml rename to pgml-sdks/rust-bridge/rust-bridge-macros/Cargo.toml index eed107ed2..ce9eaa620 100644 --- a/pgml-sdks/rust/pgml-macros/Cargo.toml +++ b/pgml-sdks/rust-bridge/rust-bridge-macros/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pgml-macros" +name = "rust_bridge_macros" version = "0.1.0" edition = "2021" diff --git a/pgml-sdks/rust/pgml-macros/src/common.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/common.rs similarity index 100% rename from pgml-sdks/rust/pgml-macros/src/common.rs rename to pgml-sdks/rust-bridge/rust-bridge-macros/src/common.rs diff --git a/pgml-sdks/rust/pgml-macros/src/javascript.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs similarity index 93% rename from pgml-sdks/rust/pgml-macros/src/javascript.rs rename to pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs index 79f142bce..7bdd2fae8 100644 --- a/pgml-sdks/rust/pgml-macros/src/javascript.rs +++ b/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs @@ -6,7 +6,7 @@ use syn::{visit::Visit, DeriveInput, ItemImpl, Type}; use crate::common::{AttributeArgs, GetImplMethod}; use crate::types::{OutputType, SupportedType}; -pub fn generate_javascript_derive(parsed: DeriveInput) -> proc_macro::TokenStream { +pub fn generate_javascript_alias(parsed: DeriveInput) -> proc_macro::TokenStream { let name_ident = format_ident!("{}Javascript", parsed.ident); let wrapped_type_ident = format_ident!("{}", parsed.ident); @@ -33,7 +33,7 @@ pub fn generate_javascript_derive(parsed: DeriveInput) -> proc_macro::TokenStrea } #[cfg(feature = "javascript")] - impl FromJsType for #wrapped_type_ident { + impl rust_bridge::javascript::FromJsType for #wrapped_type_ident { type From = neon::types::JsValue; fn from_js_type<'a, C: neon::context::Context<'a>>(cx: &mut C, arg: neon::handle::Handle) -> neon::result::NeonResult { let arg: neon::handle::Handle = arg.downcast(cx).or_throw(cx)?; @@ -45,7 +45,7 @@ pub fn generate_javascript_derive(parsed: DeriveInput) -> proc_macro::TokenStrea } #[cfg(feature = "javascript")] - impl FromJsType for &mut #wrapped_type_ident { + impl rust_bridge::javascript::FromJsType for &mut #wrapped_type_ident { type From = neon::types::JsValue; fn from_js_type<'a, C: neon::context::Context<'a>>(cx: &mut C, arg: neon::handle::Handle) -> neon::result::NeonResult { use neon::prelude::*; @@ -62,7 +62,7 @@ pub fn generate_javascript_derive(parsed: DeriveInput) -> proc_macro::TokenStrea } #[cfg(feature = "javascript")] - impl FromJsType for & #wrapped_type_ident { + impl rust_bridge::javascript::FromJsType for & #wrapped_type_ident { type From = neon::types::JsValue; fn from_js_type<'a, C: neon::context::Context<'a>>(cx: &mut C, arg: neon::handle::Handle) -> neon::result::NeonResult { use neon::prelude::*; @@ -79,9 +79,10 @@ pub fn generate_javascript_derive(parsed: DeriveInput) -> proc_macro::TokenStrea } #[cfg(feature = "javascript")] - impl IntoJsResult for #wrapped_type_ident { + impl rust_bridge::javascript::IntoJsResult for #wrapped_type_ident { type Output = neon::types::JsValue; fn into_js_result<'a, 'b, 'c: 'b, C: neon::context::Context<'c>>(self, cx: &mut C) -> neon::result::JsResult<'b, Self::Output> { + use rust_bridge::javascript::IntoJsResult; #name_ident::from(self).into_js_result(cx) } } @@ -263,6 +264,7 @@ pub fn generate_javascript_methods( quote! { #signature { use neon::prelude::*; + use rust_bridge::javascript::{IntoJsResult, FromJsType}; #outer_prepared let channel = cx.channel(); let (deferred, promise) = cx.promise(); @@ -278,6 +280,7 @@ pub fn generate_javascript_methods( quote! { #signature { use neon::prelude::*; + use rust_bridge::javascript::{IntoJsResult, FromJsType}; #outer_prepared #inner_prepared #middle @@ -290,21 +293,23 @@ pub fn generate_javascript_methods( typescript_declarations.push('}'); - let mut file = OpenOptions::new() - .create(true) - .write(true) - .append(true) - .read(true) - .open("javascript/index.d.ts") - .unwrap(); - let mut contents = String::new(); - file.read_to_string(&mut contents) - .expect("Unable to read typescript declaration file for python"); - if !contents.contains(&format!("declare class {}", javascript_class_name)) { - file.write_all(typescript_declarations.as_bytes()) - .expect("Unable to write typescript declaration file for python"); + let path = std::env::var("PYTHON_STUB_FILE"); + if let Ok(path) = path { + let mut file = OpenOptions::new() + .create(true) + .write(true) + .append(true) + .read(true) + .open(path) + .unwrap(); + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("Unable to read typescript declaration file for python"); + if !contents.contains(&format!("declare class {}", javascript_class_name)) { + file.write_all(typescript_declarations.as_bytes()) + .expect("Unable to write typescript declaration file for python"); + } } - proc_macro::TokenStream::from(quote! { #[cfg(feature = "javascript")] impl #name_ident { @@ -312,7 +317,7 @@ pub fn generate_javascript_methods( } #[cfg(feature = "javascript")] - impl IntoJsResult for #name_ident { + impl rust_bridge::javascript::IntoJsResult for #name_ident { type Output = neon::types::JsValue; fn into_js_result<'a, 'b, 'c: 'b, C: neon::context::Context<'c>>(self, cx: &mut C) -> neon::result::JsResult<'b, Self::Output> { use neon::object::Object; diff --git a/pgml-sdks/rust/pgml-macros/src/lib.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/lib.rs similarity index 66% rename from pgml-sdks/rust/pgml-macros/src/lib.rs rename to pgml-sdks/rust-bridge/rust-bridge-macros/src/lib.rs index ba6425f54..e6dc81c73 100644 --- a/pgml-sdks/rust/pgml-macros/src/lib.rs +++ b/pgml-sdks/rust-bridge/rust-bridge-macros/src/lib.rs @@ -5,13 +5,13 @@ mod javascript; mod python; mod types; -#[proc_macro_derive(custom_derive)] -pub fn custom_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { +#[proc_macro_derive(alias)] +pub fn alias(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let mut output = proc_macro::TokenStream::new(); let parsed = parse_macro_input!(input as DeriveInput); - let python_tokens = python::generate_python_derive(parsed.clone()); - let javascript_tokens = javascript::generate_javascript_derive(parsed); + let python_tokens = python::generate_python_alias(parsed.clone()); + let javascript_tokens = javascript::generate_javascript_alias(parsed); output.extend(python_tokens); output.extend(javascript_tokens); @@ -19,7 +19,7 @@ pub fn custom_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream } #[proc_macro_attribute] -pub fn custom_methods( +pub fn alias_methods( attributes: proc_macro::TokenStream, input: proc_macro::TokenStream, ) -> proc_macro::TokenStream { @@ -36,11 +36,10 @@ pub fn custom_methods( output } -#[proc_macro_derive(pgml_alias)] -pub fn pgml_alias(input: proc_macro::TokenStream) -> proc_macro::TokenStream { +#[proc_macro_derive(alias_manual)] +pub fn alias_manual(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let mut output = proc_macro::TokenStream::new(); let parsed = parse_macro_input!(input as DeriveInput); - output.extend(python::pgml_alias(parsed.clone())); - // output.extend(javascript::pgml_alias(parsed)); + output.extend(python::generate_alias_manual(parsed.clone())); output } diff --git a/pgml-sdks/rust/pgml-macros/src/python.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/python.rs similarity index 89% rename from pgml-sdks/rust/pgml-macros/src/python.rs rename to pgml-sdks/rust-bridge/rust-bridge-macros/src/python.rs index bf9cd61d5..3060656d0 100644 --- a/pgml-sdks/rust/pgml-macros/src/python.rs +++ b/pgml-sdks/rust-bridge/rust-bridge-macros/src/python.rs @@ -16,7 +16,7 @@ from typing import List, Dict, Optional, Self, Any /// - `FromPyObject` for the wrapped type /// - `ToPyObject` for the wrapped type /// - `IntoPy` for the wrapped type -pub fn pgml_alias(parsed: DeriveInput) -> proc_macro::TokenStream { +pub fn generate_alias_manual(parsed: DeriveInput) -> proc_macro::TokenStream { let name_ident = format_ident!("{}Python", parsed.ident); let wrapped_type_ident = parsed.ident; @@ -28,7 +28,7 @@ pub fn pgml_alias(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#name_ident> for #wrapped_type_ident { + impl rust_bridge::python::CustomInto<#name_ident> for #wrapped_type_ident { fn custom_into(self) -> #name_ident { #name_ident { wrapped: self, @@ -37,7 +37,7 @@ pub fn pgml_alias(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#wrapped_type_ident> for #name_ident { + impl rust_bridge::python::CustomInto<#wrapped_type_ident> for #name_ident { fn custom_into(self) -> #wrapped_type_ident { self.wrapped } @@ -73,7 +73,7 @@ pub fn pgml_alias(parsed: DeriveInput) -> proc_macro::TokenStream { proc_macro::TokenStream::from(expanded) } -pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { +pub fn generate_python_alias(parsed: DeriveInput) -> proc_macro::TokenStream { let name_ident = format_ident!("{}Python", parsed.ident); let wrapped_type_ident = parsed.ident; let wrapped_type_name = wrapped_type_ident.to_string(); @@ -87,7 +87,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#name_ident> for #wrapped_type_ident { + impl rust_bridge::python::CustomInto<#name_ident> for #wrapped_type_ident { fn custom_into(self) -> #name_ident { #name_ident { wrapped: std::boxed::Box::new(self), @@ -96,14 +96,14 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#wrapped_type_ident> for #name_ident { + impl rust_bridge::python::CustomInto<#wrapped_type_ident> for #name_ident { fn custom_into(self) -> #wrapped_type_ident { *self.wrapped } } #[cfg(feature = "python")] - impl CustomInto<&'static mut #wrapped_type_ident> for &mut #name_ident { + impl rust_bridge::python::CustomInto<&'static mut #wrapped_type_ident> for &mut #name_ident { fn custom_into(self) -> &'static mut #wrapped_type_ident { // This is how we get around the liftime checker unsafe { @@ -116,7 +116,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<&'static #wrapped_type_ident> for &mut #name_ident { + impl rust_bridge::python::CustomInto<&'static #wrapped_type_ident> for &mut #name_ident { fn custom_into(self) -> &'static #wrapped_type_ident { // This is how we get around the liftime checker unsafe { @@ -129,7 +129,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#wrapped_type_ident> for &mut #name_ident { + impl rust_bridge::python::CustomInto<#wrapped_type_ident> for &mut #name_ident { fn custom_into(self) -> #wrapped_type_ident { // This is how we get around the liftime checker unsafe { @@ -142,7 +142,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<&'static #wrapped_type_ident> for &#name_ident { + impl rust_bridge::python::CustomInto<&'static #wrapped_type_ident> for &#name_ident { fn custom_into(self) -> &'static #wrapped_type_ident { // This is how we get around the liftime checker unsafe { @@ -155,7 +155,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { } #[cfg(feature = "python")] - impl CustomInto<#wrapped_type_ident> for &#name_ident { + impl rust_bridge::python::CustomInto<#wrapped_type_ident> for &#name_ident { fn custom_into(self) -> #wrapped_type_ident { // This is how we get around the liftime checker unsafe { @@ -171,6 +171,7 @@ pub fn generate_python_derive(parsed: DeriveInput) -> proc_macro::TokenStream { impl pyo3::IntoPy for #wrapped_type_ident { fn into_py(self, py: pyo3::Python) -> pyo3::PyObject { use pyo3::conversion::IntoPy; + use rust_bridge::python::CustomInto; let x: #name_ident = self.custom_into(); x.into_py(py) } @@ -303,6 +304,7 @@ pub fn generate_python_methods( }; let middle = quote! { use std::ops::DerefMut; + use rust_bridge::python::CustomInto; #prepared_wrapper_arguments #middle let x: Self = x.custom_into(); @@ -349,18 +351,18 @@ pub fn generate_python_methods( }; let middle = if method.is_async { quote! { + use rust_bridge::python::CustomInto; let mut wrapped: #some_wrapper_type = self.custom_into(); #prepared_wrapper_arguments pyo3_asyncio::tokio::future_into_py(py, async move { - use std::ops::DerefMut; #middle Ok(x) }) } } else { quote! { + use rust_bridge::python::CustomInto; let mut wrapped: #some_wrapper_type = self.custom_into(); - use std::ops::DerefMut; #prepared_wrapper_arguments #middle Ok(x) @@ -376,25 +378,27 @@ pub fn generate_python_methods( }); } - let mut file = OpenOptions::new() - .create(true) - .write(true) - .append(true) - .read(true) - .open("python/pgml/pgml.pyi") - .unwrap(); - let mut contents = String::new(); - file.read_to_string(&mut contents) - .expect("Unable to read stubs file for python"); - if !contents.contains("A12BECOD") { - file.write_all(STUB_TOP.as_bytes()) - .expect("Unable to write stubs file for python"); - } - if !contents.contains(&format!("class {}:", python_class_name)) { - file.write_all(stubs.as_bytes()) - .expect("Unable to write stubs file for python"); + let path = std::env::var("PYTHON_STUB_FILE"); + if let Ok(path) = path { + let mut file = OpenOptions::new() + .create(true) + .write(true) + .append(true) + .read(true) + .open(path) + .unwrap(); + let mut contents = String::new(); + file.read_to_string(&mut contents) + .expect("Unable to read stubs file for python"); + if !contents.contains("A12BECOD") { + file.write_all(STUB_TOP.as_bytes()) + .expect("Unable to write stubs file for python"); + } + if !contents.contains(&format!("class {}:", python_class_name)) { + file.write_all(stubs.as_bytes()) + .expect("Unable to write stubs file for python"); + } } - proc_macro::TokenStream::from(quote! { #[cfg(feature = "python")] #[pyo3::pymethods] diff --git a/pgml-sdks/rust/pgml-macros/src/types.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/types.rs similarity index 100% rename from pgml-sdks/rust/pgml-macros/src/types.rs rename to pgml-sdks/rust-bridge/rust-bridge-macros/src/types.rs diff --git a/pgml-sdks/rust-bridge/rust-bridge-traits/Cargo.toml b/pgml-sdks/rust-bridge/rust-bridge-traits/Cargo.toml new file mode 100644 index 000000000..33575b40c --- /dev/null +++ b/pgml-sdks/rust-bridge/rust-bridge-traits/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rust_bridge_traits" +version = "0.1.0" +edition = "2021" + +[dependencies] +neon = { version = "0.10", default-features = false, features = ["napi-6"] } diff --git a/pgml-sdks/rust/pgml/src/languages/javascript.rs b/pgml-sdks/rust-bridge/rust-bridge-traits/src/javascript/mod.rs similarity index 63% rename from pgml-sdks/rust/pgml/src/languages/javascript.rs rename to pgml-sdks/rust-bridge/rust-bridge-traits/src/javascript/mod.rs index edd7324d8..0be6e0b30 100644 --- a/pgml-sdks/rust/pgml/src/languages/javascript.rs +++ b/pgml-sdks/rust-bridge/rust-bridge-traits/src/javascript/mod.rs @@ -1,13 +1,17 @@ use neon::prelude::*; -use crate::{ - pipeline::PipelineSyncData, - types::{DateTime, Json}, -}; - //////////////////////////////////////////////////////////////////////////////// // Rust to JS ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// + +pub trait IntoJsResult { + type Output: neon::handle::Managed + neon::types::Value; + fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( + self, + cx: &mut C, + ) -> JsResult<'b, Self::Output>; +} + macro_rules! gen_into { ($t1:ty, $t2:ty) => { impl IntoJsResult for $t1 { @@ -49,14 +53,6 @@ macro_rules! gen_into { } } -pub trait IntoJsResult { - type Output: neon::handle::Managed + neon::types::Value; - fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( - self, - cx: &mut C, - ) -> JsResult<'b, Self::Output>; -} - impl IntoJsResult for () { type Output = JsUndefined; fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( @@ -97,65 +93,6 @@ impl IntoJsResult for i64 { } } -impl IntoJsResult for DateTime { - type Output = neon::types::JsDate; - fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( - self, - cx: &mut C, - ) -> JsResult<'b, Self::Output> { - let date = neon::types::JsDate::new(cx, self.0.timestamp_millis() as f64) - .expect("Error converting to JS Date"); - Ok(date) - } -} - -impl IntoJsResult for Json { - type Output = JsValue; - fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( - self, - cx: &mut C, - ) -> JsResult<'b, Self::Output> { - match self.0 { - serde_json::Value::Bool(x) => Ok(JsBoolean::new(cx, x).upcast()), - serde_json::Value::Number(x) => Ok(JsNumber::new( - cx, - x.as_f64() - .expect("Error converting to f64 in impl IntoJsResult for Json"), - ) - .upcast()), - serde_json::Value::String(x) => Ok(JsString::new(cx, &x).upcast()), - serde_json::Value::Array(x) => { - let js_array = JsArray::new(cx, x.len() as u32); - for (i, v) in x.into_iter().enumerate() { - let js_value = Json::into_js_result(Self(v), cx)?; - js_array.set(cx, i as u32, js_value)?; - } - Ok(js_array.upcast()) - } - serde_json::Value::Object(x) => { - let js_object = JsObject::new(cx); - for (k, v) in x.into_iter() { - let js_key = cx.string(k); - let js_value = Json::into_js_result(Self(v), cx)?; - js_object.set(cx, js_key, js_value)?; - } - Ok(js_object.upcast()) - } - _ => panic!("Unsupported type for JSON conversion"), - } - } -} - -impl IntoJsResult for PipelineSyncData { - type Output = JsValue; - fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( - self, - cx: &mut C, - ) -> JsResult<'b, Self::Output> { - Json::from(self).into_js_result(cx) - } -} - impl IntoJsResult for std::collections::HashMap { type Output = JsObject; fn into_js_result<'a, 'b, 'c: 'b, C: Context<'c>>( @@ -187,6 +124,20 @@ impl IntoJsResult for Vec { //////////////////////////////////////////////////////////////////////////////// // JS To Rust ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// + +pub trait FromJsType: Sized { + type From: neon::handle::Managed + neon::types::Value; + fn from_js_type<'a, C: Context<'a>>(_cx: &mut C, _arg: Handle) -> NeonResult { + panic!("Have not implimented from_js_type for type yet") + } + fn from_option_js_type<'a, C: Context<'a>>( + _cx: &mut C, + _arg: Option>, + ) -> NeonResult { + panic!("Have not implimented from_option_js_type for type yet") + } +} + macro_rules! gen_from { ($t1:ty, $t2:ty) => { impl FromJsType for $t1 { @@ -212,19 +163,6 @@ macro_rules! gen_from { }; } -pub trait FromJsType: Sized { - type From: neon::handle::Managed + neon::types::Value; - fn from_js_type<'a, C: Context<'a>>(_cx: &mut C, _arg: Handle) -> NeonResult { - panic!("Have not implimented from_js_type for type yet") - } - fn from_option_js_type<'a, C: Context<'a>>( - _cx: &mut C, - _arg: Option>, - ) -> NeonResult { - panic!("Have not implimented from_option_js_type for type yet") - } -} - gen_from!(String, JsString); // String gen_from!(bool, JsBoolean); // bool @@ -289,49 +227,3 @@ impl>(cx: &mut C, arg: Handle) -> NeonResult { - if arg.is_a::(cx) { - let value: Handle = arg.downcast(cx).or_throw(cx)?; - let mut json = Vec::new(); - for item in value.to_vec(cx)? { - let item = Json::from_js_type(cx, item)?; - json.push(item.0); - } - Ok(Self(serde_json::Value::Array(json))) - } else if arg.is_a::(cx) { - let value: Handle = arg.downcast(cx).or_throw(cx)?; - let value = bool::from_js_type(cx, value)?; - let value = serde_json::Value::Bool(value); - Ok(Self(value)) - } else if arg.is_a::(cx) { - let value: Handle = arg.downcast(cx).or_throw(cx)?; - let value = String::from_js_type(cx, value)?; - let value = serde_json::Value::String(value); - Ok(Self(value)) - } else if arg.is_a::(cx) { - let value: Handle = arg.downcast(cx).or_throw(cx)?; - let value = f64::from_js_type(cx, value)?; - let value = serde_json::value::Number::from_f64(value) - .expect("Could not convert f64 to serde_json::Number"); - let value = serde_json::value::Value::Number(value); - Ok(Self(value)) - } else if arg.is_a::(cx) { - let value: Handle = arg.downcast(cx).or_throw(cx)?; - let mut json = serde_json::Map::new(); - let keys = value.get_own_property_names(cx)?.to_vec(cx)?; - for key in keys { - let key: Handle = key.downcast(cx).or_throw(cx)?; - let key: String = String::from_js_type(cx, key)?; - let json_value: Handle = value.get(cx, key.as_str())?; - let json_value = Json::from_js_type(cx, json_value)?; - json.insert(key, json_value.0); - } - Ok(Self(serde_json::Value::Object(json))) - } else { - panic!("Unsupported type for Json conversion"); - } - } -} diff --git a/pgml-sdks/rust-bridge/rust-bridge-traits/src/lib.rs b/pgml-sdks/rust-bridge/rust-bridge-traits/src/lib.rs new file mode 100644 index 000000000..351c28c06 --- /dev/null +++ b/pgml-sdks/rust-bridge/rust-bridge-traits/src/lib.rs @@ -0,0 +1,3 @@ +pub mod python; + +pub mod javascript; diff --git a/pgml-sdks/rust-bridge/rust-bridge-traits/src/python/mod.rs b/pgml-sdks/rust-bridge/rust-bridge-traits/src/python/mod.rs new file mode 100644 index 000000000..42dbd7881 --- /dev/null +++ b/pgml-sdks/rust-bridge/rust-bridge-traits/src/python/mod.rs @@ -0,0 +1,93 @@ +use std::collections::HashMap; + +/// Very similar to the `Into` trait, but we can implement it on foreign types. +pub trait CustomInto { + fn custom_into(self) -> T; +} + +macro_rules! gen_custom_into { + ($t1:ty) => { + impl CustomInto<$t1> for $t1 { + fn custom_into(self) -> $t1 { + self + } + } + }; + (($($T1:ident),+), ($($T2:ident),+), ($($C:tt),+)) => { + impl<$($T1, $T2: CustomInto<$T1>),+> CustomInto<($($T1),+,)> for ($($T2),+,) { + fn custom_into(self) -> ($($T1),+,) { + ($(self.$C.custom_into()),+,) + } + } + } +} + +impl> CustomInto> for Option { + fn custom_into(self) -> Option { + self.map(|s| s.custom_into()) + } +} + +impl> CustomInto> for Vec { + fn custom_into(self) -> Vec { + self.into_iter().map(|x| x.custom_into()).collect() + } +} + +impl, T2: CustomInto> + CustomInto> for HashMap +{ + fn custom_into(self) -> HashMap { + self.into_iter() + .map(|(k, v)| (k.custom_into(), v.custom_into())) + .collect() + } +} + +impl CustomInto<&'static str> for &str { + fn custom_into(self) -> &'static str { + // This is how we get around the liftime checker + unsafe { + let ptr = self as *const str; + let ptr = ptr as *mut str; + let boxed = Box::from_raw(ptr); + Box::leak(boxed) + } + } +} + +gen_custom_into!((T1), (TT2), (0)); +gen_custom_into!((T1, T2), (TT1, TT2), (0, 1)); +gen_custom_into!((T1, T2, T3), (TT1, TT2, TT3), (0, 1, 2)); +gen_custom_into!((T1, T2, T3, T4), (TT1, TT2, TT3, TT4), (0, 1, 2, 3)); +gen_custom_into!( + (T1, T2, T3, T4, T5), + (TT1, TT2, TT3, TT4, TT5), + (0, 1, 2, 3, 4) +); +gen_custom_into!( + (T1, T2, T3, T4, T5, T6), + (TT1, TT2, TT3, TT4, TT5, TT6), + (0, 1, 2, 3, 4, 5) +); + +// There are some restrictions I cannot figure out around conflicting trait +// implimentations so this is my solution for now +gen_custom_into!(String); + +gen_custom_into!(()); + +gen_custom_into!(bool); + +gen_custom_into!(i8); +gen_custom_into!(i16); +gen_custom_into!(i32); +gen_custom_into!(i64); + +gen_custom_into!(u8); +gen_custom_into!(u16); +gen_custom_into!(u32); +gen_custom_into!(u64); + +gen_custom_into!(f32); +gen_custom_into!(f64); diff --git a/pgml-sdks/rust-bridge/rust-bridge/Cargo.toml b/pgml-sdks/rust-bridge/rust-bridge/Cargo.toml new file mode 100644 index 000000000..886d413c6 --- /dev/null +++ b/pgml-sdks/rust-bridge/rust-bridge/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "rust_bridge" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rust_bridge_traits = { path = "../rust-bridge-traits" } +rust_bridge_macros = { path = "../rust-bridge-macros" } diff --git a/pgml-sdks/rust-bridge/rust-bridge/src/lib.rs b/pgml-sdks/rust-bridge/rust-bridge/src/lib.rs new file mode 100644 index 000000000..e22c8e852 --- /dev/null +++ b/pgml-sdks/rust-bridge/rust-bridge/src/lib.rs @@ -0,0 +1,5 @@ +#[doc(inline)] +pub use rust_bridge_traits::*; + +#[doc(inline)] +pub use rust_bridge_macros::*; diff --git a/pgml-sdks/rust/pgml-macros/Cargo.lock b/pgml-sdks/rust/pgml-macros/Cargo.lock deleted file mode 100644 index 31ca7e30b..000000000 --- a/pgml-sdks/rust/pgml-macros/Cargo.lock +++ /dev/null @@ -1,54 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "anyhow" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - -[[package]] -name = "pgml-macros" -version = "0.1.0" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "proc-macro2" -version = "1.0.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "syn" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" diff --git a/pgml-sdks/rust/pgml/python/pgml/pgml.pyi b/pgml-sdks/rust/pgml/python/pgml/pgml.pyi deleted file mode 100644 index a1bb82320..000000000 --- a/pgml-sdks/rust/pgml/python/pgml/pgml.pyi +++ /dev/null @@ -1,89 +0,0 @@ - -def py_init_logger(level: Optional[str] = "", format: Optional[str] = "") -> None - -Json = Any -DateTime = int - -# Top of file key: A12BECOD! -from typing import List, Dict, Optional, Self, Any - - -class Builtins: - def __init__(self, database_url: Optional[str] = "Default set in Rust. Please check the documentation.") -> Self - ... - def query(self, query: str) -> QueryRunner - ... - async def transform(self, task: Json, inputs: List[str], args: Optional[Json] = Any) -> Json - ... - -class Collection: - def __init__(self, name: str, database_url: Optional[str] = "Default set in Rust. Please check the documentation.") -> Self - ... - async def add_pipeline(self, pipeline: Pipeline) -> None - ... - async def remove_pipeline(self, pipeline: Pipeline) -> None - ... - async def enable_pipeline(self, pipeline: Pipeline) -> None - ... - async def disable_pipeline(self, pipeline: Pipeline) -> None - ... - async def upsert_documents(self, documents: List[Json], strict: Optional[bool] = True) -> None - ... - async def get_documents(self, last_id: Optional[int] = 1, limit: Optional[int] = 1) -> List[Json] - ... - async def vector_search(self, query: str, pipeline: Pipeline, query_parameters: Optional[Json] = Any, top_k: Optional[int] = 1) -> List[tuple[float, str, Json]] - ... - async def archive(self) -> None - ... - def query(self) -> QueryBuilder - ... - async def get_pipelines(self) -> List[Pipeline] - ... - async def get_pipeline(self, name: str) -> Pipeline - ... - async def exists(self) -> bool - ... - -class Model: - def __init__(self, name: Optional[str] = "Default set in Rust. Please check the documentation.", source: Optional[str] = "Default set in Rust. Please check the documentation.", parameters: Optional[Json] = Any) -> Self - ... - -class Pipeline: - def __init__(self, name: str, model: Optional[Model] = Any, splitter: Optional[Splitter] = Any, parameters: Optional[Json] = Any) -> Self - ... - async def get_status(self) -> PipelineSyncData - ... - async def to_dict(self) -> Json - ... - -class QueryBuilder: - def limit(self, limit: int) -> Self - ... - def filter(self, filter: Json) -> Self - ... - def vector_recall(self, query: str, pipeline: Pipeline, query_parameters: Optional[Json] = Any) -> Self - ... - async def fetch_all(self) -> List[tuple[float, str, Json]] - ... - def to_full_string(self) -> str - ... - -class QueryRunner: - async def fetch_all(self) -> Json - ... - async def execute(self) -> None - ... - def bind_string(self, bind_value: str) -> Self - ... - def bind_int(self, bind_value: int) -> Self - ... - def bind_float(self, bind_value: float) -> Self - ... - def bind_bool(self, bind_value: bool) -> Self - ... - def bind_json(self, bind_value: Json) -> Self - ... - -class Splitter: - def __init__(self, name: Optional[str] = "Default set in Rust. Please check the documentation.", parameters: Optional[Json] = Any) -> Self - ... From 4dd527e612eadbbda04769b13fc12f1a8b987c72 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:02:43 -0700 Subject: [PATCH 03/16] Small updats to README --- pgml-sdks/pgml/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pgml-sdks/pgml/README.md b/pgml-sdks/pgml/README.md index b17bd641a..c5bd146f4 100644 --- a/pgml-sdks/pgml/README.md +++ b/pgml-sdks/pgml/README.md @@ -3,8 +3,8 @@ # Suported Languages We support a number of different languages: -- [Python](/) -- [JavaScript](/) +- [Python](/python) +- [JavaScript](/javascript) - Rust Our SDK is written completely in Rust and translated by Rust to our other supported languages. See each individual language for an overview and specification on how to use the SDK. From fb67696ac986b9400a4dd364a9ac7843ed5c6395 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:27:34 -0700 Subject: [PATCH 04/16] Small test cleanup --- pgml-sdks/pgml/src/filter_builder.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pgml-sdks/pgml/src/filter_builder.rs b/pgml-sdks/pgml/src/filter_builder.rs index b9792191b..20e6c1acc 100644 --- a/pgml-sdks/pgml/src/filter_builder.rs +++ b/pgml-sdks/pgml/src/filter_builder.rs @@ -320,7 +320,7 @@ mod tests { assert_eq!( sql, format!( - r##"SELECT "id" FROM "test_table" WHERE ("test_table"."metadata"#>>'{{id}}')::bigint {} 1 AND ("test_table"."metadata"#>>'{{id2,id3}}')::bigint {} 1"##, + r##"SELECT "id" FROM "test_table" WHERE ("test_table"."metadata"#>>'{{id}}')::float8 {} 1 AND ("test_table"."metadata"#>>'{{id2,id3}}')::float8 {} 1"##, operator, operator ) ); @@ -344,7 +344,7 @@ mod tests { assert_eq!( sql, format!( - r##"SELECT "id" FROM "test_table" WHERE ("test_table"."metadata"#>>'{{id}}')::bigint {} (1) AND ("test_table"."metadata"#>>'{{id2,id3}}')::bigint {} (1)"##, + r##"SELECT "id" FROM "test_table" WHERE ("test_table"."metadata"#>>'{{id}}')::float8 {} (1) AND ("test_table"."metadata"#>>'{{id2,id3}}')::float8 {} (1)"##, operator, operator ) ); From a018637de0a972862966b5410fa952b41e376cc2 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:42:21 -0700 Subject: [PATCH 05/16] Typo fix --- pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs b/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs index 7bdd2fae8..004a78d4e 100644 --- a/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs +++ b/pgml-sdks/rust-bridge/rust-bridge-macros/src/javascript.rs @@ -293,7 +293,7 @@ pub fn generate_javascript_methods( typescript_declarations.push('}'); - let path = std::env::var("PYTHON_STUB_FILE"); + let path = std::env::var("TYPESCRIPT_DECLARATION_FILE"); if let Ok(path) = path { let mut file = OpenOptions::new() .create(true) From fe5ba1b8c90448804a4dfc1262615420f7fb8a87 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 08:49:09 -0700 Subject: [PATCH 06/16] Added examples directory and README --- pgml-sdks/rust-bridge/README.md | 4 ++-- pgml-sdks/rust-bridge/examples/README.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 pgml-sdks/rust-bridge/examples/README.md diff --git a/pgml-sdks/rust-bridge/README.md b/pgml-sdks/rust-bridge/README.md index 16a6568d5..b5cb44c0c 100644 --- a/pgml-sdks/rust-bridge/README.md +++ b/pgml-sdks/rust-bridge/README.md @@ -119,8 +119,8 @@ The key takeaway is that the macros used in this crate take vanilla Rust code an # Python -This crate translates Rust to [Py03](https://github.com/PyO3/pyo3) compatible Rust. See the [examples](/examples) folder for how to use it. +This crate translates Rust to [Py03](https://github.com/PyO3/pyo3) compatible Rust. See the [examples](examples) folder for how to use it. # JavaScript -This crate translates Rust to [Neon](https://neon-bindings.com/) compatible Rust. See the [examples](/examples) folder for how to use it. +This crate translates Rust to [Neon](https://neon-bindings.com/) compatible Rust. See the [examples](examples) folder for how to use it. diff --git a/pgml-sdks/rust-bridge/examples/README.md b/pgml-sdks/rust-bridge/examples/README.md new file mode 100644 index 000000000..d30962bdc --- /dev/null +++ b/pgml-sdks/rust-bridge/examples/README.md @@ -0,0 +1 @@ +# Coming Soon From a8526814d469c109fe49bbb7ced530fe5086b5a3 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 08:55:56 -0700 Subject: [PATCH 07/16] Updated javascript examples a bit --- pgml-sdks/pgml/README.md | 4 +- pgml-sdks/pgml/javascript/examples/README.md | 19 ++++--- .../examples/getting-started/README.md | 12 ----- .../examples/getting-started/index.js | 54 ------------------- .../examples/getting-started/package.json | 15 ------ 5 files changed, 15 insertions(+), 89 deletions(-) delete mode 100644 pgml-sdks/pgml/javascript/examples/getting-started/README.md delete mode 100644 pgml-sdks/pgml/javascript/examples/getting-started/index.js delete mode 100644 pgml-sdks/pgml/javascript/examples/getting-started/package.json diff --git a/pgml-sdks/pgml/README.md b/pgml-sdks/pgml/README.md index c5bd146f4..3a08b6add 100644 --- a/pgml-sdks/pgml/README.md +++ b/pgml-sdks/pgml/README.md @@ -3,8 +3,8 @@ # Suported Languages We support a number of different languages: -- [Python](/python) -- [JavaScript](/javascript) +- [Python](python) +- [JavaScript](javascript) - Rust Our SDK is written completely in Rust and translated by Rust to our other supported languages. See each individual language for an overview and specification on how to use the SDK. diff --git a/pgml-sdks/pgml/javascript/examples/README.md b/pgml-sdks/pgml/javascript/examples/README.md index 77e13b638..e67ea406d 100644 --- a/pgml-sdks/pgml/javascript/examples/README.md +++ b/pgml-sdks/pgml/javascript/examples/README.md @@ -1,16 +1,23 @@ -## Examples +# Examples -### [Semantic Search](./semantic_search.js) +## Prerequisites +Before running any examples first install dependencies and set the DATABASE_URL environment variable: +``` +npm i +export DATABASE_URL={YOUR DATABASE URL} +``` + +## [Semantic Search](./semantic_search.js) This is a basic example to perform semantic search on a collection of documents. Embeddings are created using `intfloat/e5-small` model. The results are semantically similar documemts to the query. Finally, the collection is archived. -### [Question Answering](./question_answering.js) +## [Question Answering](./question_answering.js) This is an example to find documents relevant to a question from the collection of documents. The query is passed to vector search to retrieve documents that match closely in the embeddings space. A score is returned with each of the search result. -### [Question Answering using Instructore Model](./question_answering_instructor.js) +## [Question Answering using Instructore Model](./question_answering_instructor.js) In this example, we will use `hknlp/instructor-base` model to build text embeddings instead of the default `intfloat/e5-small` model. -### [Extractive Question Answering](./extractive_question_answering.js) +## [Extractive Question Answering](./extractive_question_answering.js) In this example, we will show how to use `vector_recall` result as a `context` to a HuggingFace question answering model. We will use `Builtins.transform()` to run the model on the database. -### [Summarizing Question Answering](./summarizing_question_answering.js) +## [Summarizing Question Answering](./summarizing_question_answering.js) This is an example to find documents relevant to a question from the collection of documents and then summarize those documents. diff --git a/pgml-sdks/pgml/javascript/examples/getting-started/README.md b/pgml-sdks/pgml/javascript/examples/getting-started/README.md deleted file mode 100644 index 293b5a3ca..000000000 --- a/pgml-sdks/pgml/javascript/examples/getting-started/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Getting Started with the PGML Javascript SDK - -In this example repo you will find a basic script that you can run to get started with the PGML Javascript SDK. This script will create a collection, add a pipeline, and run a vector search on the collection. - -## Steps to run the example - -1. Clone the repo -2. Install dependencies - `npm install` -3. Create a .env file and set `DATABASE_URL` to your Postgres connection string -4. Open index.js and check out the code -5. Run the script `node index.js` diff --git a/pgml-sdks/pgml/javascript/examples/getting-started/index.js b/pgml-sdks/pgml/javascript/examples/getting-started/index.js deleted file mode 100644 index b1458e889..000000000 --- a/pgml-sdks/pgml/javascript/examples/getting-started/index.js +++ /dev/null @@ -1,54 +0,0 @@ -const pgml = require("pgml"); -require("dotenv").config(); - -const main = async () => { - // Initialize the collection - const collection = pgml.newCollection("my_javascript_collection"); - - // Add a pipeline - const model = pgml.newModel(); - const splitter = pgml.newSplitter(); - const pipeline = pgml.newPipeline("my_javascript_pipeline", model, splitter); - await collection.add_pipeline(pipeline); - - // Upsert documents, these documents are automatically split into chunks and embedded by our pipeline - const documents = [ - { - id: "Document One", - text: "document one contents...", - }, - { - id: "Document Two", - text: "document two contents...", - }, - ]; - await collection.upsert_documents(documents); - - // Perform vector search - const queryResults = await collection - .query() - .vector_recall( - "Some user query that will match document one first", - pipeline, - ) - .limit(2) - .fetch_all(); - - // Convert the results to an array of objects - const results = queryResults.map((result) => { - const [similarity, text, metadata] = result; - return { - similarity, - text, - metadata, - }; - }); - - // Archive the collection - await collection.archive(); - return results; -}; - -main().then((results) => { - console.log("Vector search Results: \n", results); -}); diff --git a/pgml-sdks/pgml/javascript/examples/getting-started/package.json b/pgml-sdks/pgml/javascript/examples/getting-started/package.json deleted file mode 100644 index 984886eb5..000000000 --- a/pgml-sdks/pgml/javascript/examples/getting-started/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "getting-started", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "dotenv": "^16.3.1", - "pgml": "^0.9.0" - } -} From 052f51ad2f414e0114136b1ebbb55b81bfa306a3 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 08:57:37 -0700 Subject: [PATCH 08/16] Slight rewording on README --- pgml-sdks/pgml/javascript/examples/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pgml-sdks/pgml/javascript/examples/README.md b/pgml-sdks/pgml/javascript/examples/README.md index e67ea406d..0ce183a06 100644 --- a/pgml-sdks/pgml/javascript/examples/README.md +++ b/pgml-sdks/pgml/javascript/examples/README.md @@ -7,6 +7,8 @@ npm i export DATABASE_URL={YOUR DATABASE URL} ``` +Optionally, configure a .env file containing a DATABASE_URL variable. + ## [Semantic Search](./semantic_search.js) This is a basic example to perform semantic search on a collection of documents. Embeddings are created using `intfloat/e5-small` model. The results are semantically similar documemts to the query. Finally, the collection is archived. From 681aa8b9ecc2d4396c104af8e6ffed627bca5a25 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:08:37 -0700 Subject: [PATCH 09/16] Updated workflows to set new env variables for build --- .github/workflows/javascript-sdk.yml | 2 ++ .github/workflows/python-sdk.yml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/.github/workflows/javascript-sdk.yml b/.github/workflows/javascript-sdk.yml index c3fdebc76..168d54c59 100644 --- a/.github/workflows/javascript-sdk.yml +++ b/.github/workflows/javascript-sdk.yml @@ -29,6 +29,8 @@ jobs: with: command: version - name: Do build + env: + TYPESCRIPT_DECLARATION_FILE: "javascript/index.d.ts" run: | npm i npm run build-release diff --git a/.github/workflows/python-sdk.yml b/.github/workflows/python-sdk.yml index 91491791e..fc562778b 100644 --- a/.github/workflows/python-sdk.yml +++ b/.github/workflows/python-sdk.yml @@ -49,11 +49,13 @@ jobs: if: github.event.inputs.deploy_to_pypi == 'false' env: MATURIN_PYPI_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -r testpypi -i python3.7 -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python - name: Build and deploy wheels to PyPI if: github.event.inputs.deploy_to_pypi == 'true' env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -i python3.7 -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python deploy-python-sdk-mac: @@ -83,11 +85,13 @@ jobs: if: github.event.inputs.deploy_to_pypi == 'false' env: MATURIN_PYPI_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -r testpypi -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python - name: Build and deploy wheels to PyPI if: github.event.inputs.deploy_to_pypi == 'true' env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python deploy-python-sdk-windows: @@ -119,9 +123,11 @@ jobs: if: github.event.inputs.deploy_to_pypi == 'false' env: MATURIN_PYPI_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -r testpypi -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python - name: Build and deploy wheels to PyPI if: github.event.inputs.deploy_to_pypi == 'true' env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + PYTHON_STUB_FILE: "python/pgml/pgml.pyi" run: maturin publish -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python From 20123f559dca747e10149cbc32c25138051a474a Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:13:01 -0700 Subject: [PATCH 10/16] Updated manual build to set new env variable for build --- pgml-sdks/pgml/python/manual-build-deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-sdks/pgml/python/manual-build-deploy.sh b/pgml-sdks/pgml/python/manual-build-deploy.sh index 81e1756e6..d4743610d 100755 --- a/pgml-sdks/pgml/python/manual-build-deploy.sh +++ b/pgml-sdks/pgml/python/manual-build-deploy.sh @@ -3,4 +3,4 @@ echo "Make sure and set the environment variable MATURIN_PYPI_TOKEN to your PyPI token." cd .. -maturin publish -r $1 -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python +PYTHON_STUB_FILE="python/pgml/pgml.pyi" maturin publish -r $1 -i python3.8 -i python3.9 -i python3.10 -i python3.11 --skip-existing -F python From c0fc80da728a8b4567a637a16866291b35b86232 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:18:30 -0700 Subject: [PATCH 11/16] Link fix on README --- pgml-sdks/pgml/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-sdks/pgml/README.md b/pgml-sdks/pgml/README.md index 3a08b6add..f63a78dad 100644 --- a/pgml-sdks/pgml/README.md +++ b/pgml-sdks/pgml/README.md @@ -5,7 +5,7 @@ We support a number of different languages: - [Python](python) - [JavaScript](javascript) -- Rust +- [Rust](#Rust) Our SDK is written completely in Rust and translated by Rust to our other supported languages. See each individual language for an overview and specification on how to use the SDK. From 3ec48c335bb79545afcac0b1e431c983fb8c6c49 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:18:37 -0700 Subject: [PATCH 12/16] Link fix on README --- pgml-sdks/pgml/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-sdks/pgml/README.md b/pgml-sdks/pgml/README.md index f63a78dad..727a84dc1 100644 --- a/pgml-sdks/pgml/README.md +++ b/pgml-sdks/pgml/README.md @@ -5,7 +5,7 @@ We support a number of different languages: - [Python](python) - [JavaScript](javascript) -- [Rust](#Rust) +- [Rust](#rust) Our SDK is written completely in Rust and translated by Rust to our other supported languages. See each individual language for an overview and specification on how to use the SDK. From 6813b343fe52f5e6d466c0b3ace36f02ed9a02fd Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:23:45 -0700 Subject: [PATCH 13/16] Link fix on README --- pgml-sdks/rust-bridge/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pgml-sdks/rust-bridge/README.md b/pgml-sdks/rust-bridge/README.md index b5cb44c0c..3670bd887 100644 --- a/pgml-sdks/rust-bridge/README.md +++ b/pgml-sdks/rust-bridge/README.md @@ -2,7 +2,7 @@ This crate provides a number of macros that automatically handle translating mostly vanilla Rust to [Py03](https://github.com/PyO3/pyo3) and [Neon](https://neon-bindings.com/) compatible Rust code. -It is designed to greatly improve the rate at which simultaneously developing libraries for multiple languages can be done. We use it internally for developing our [Rust SDK](https://github.com/postgresml/postgresml/tree/master/pgml-sdks/pgml/). +It is designed to greatly improve the rate at which simultaneously developing libraries for multiple languages can be done. We use it internally for developing our [Rust SDK](https://github.com/postgresml/postgresml/tree/master/pgml-sdks/rust/pgml). # Overview @@ -63,7 +63,7 @@ impl Test { } ``` -These macros produce a lot of code, you can inspect it using [cargo-expand](https://github.com/dtolnay/cargo-expand) but we will just show the snippes necessary to understand what is happening: +These macros produce a lot of code, you can inspect it using [cargo-expand](https://github.com/dtolnay/cargo-expand) but we will just show the snippets necessary to understand what is happening: ```rust pub struct Test { @@ -115,7 +115,7 @@ The struct `Test` is defined just like before, but notice there is another struc The impl block for the struct `Test` is there just like before, but notice the impl block for `TestPython` which is written in the fashion Py03 requires, but simply parses arguments and calls through to `Test`'s methods. -The key takeaway is that the macros used in this crate take vanilla Rust code and translate it to Rust that crates like Py03 expect and use to generate native Python classes. +The key takeaway is that the macros used in this crate take vanilla Rust code and translate it to Rust that crates like Py03 use to generate native Python classes. # Python From 04f4ea044e0afbb3eec6b78e255e6735a08c60ce Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:27:38 -0700 Subject: [PATCH 14/16] Link fix on README --- pgml-sdks/pgml/javascript/README.md | 3 +-- pgml-sdks/pgml/python/README.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pgml-sdks/pgml/javascript/README.md b/pgml-sdks/pgml/javascript/README.md index 61eb7a39d..77a687833 100644 --- a/pgml-sdks/pgml/javascript/README.md +++ b/pgml-sdks/pgml/javascript/README.md @@ -7,7 +7,6 @@ - [Usage](#usage) - [Examples](./examples/README.md) - [Developer setup](#developer-setup) -- [API Reference](#api-reference) - [Roadmap](#roadmap) # Overview @@ -469,7 +468,7 @@ Removing a Pipeline deletes it and all associated data from the database. Remove ## Developer Setup -This javascript library is generated from our core rust-sdk. Please check [rust-sdk documentation](../../README.md) for developer setup. +This javascript library is generated from our core rust-sdk. Please check [rust-sdk documentation](../README.md) for developer setup. ## Roadmap diff --git a/pgml-sdks/pgml/python/README.md b/pgml-sdks/pgml/python/README.md index e033abc77..542263acf 100644 --- a/pgml-sdks/pgml/python/README.md +++ b/pgml-sdks/pgml/python/README.md @@ -7,7 +7,6 @@ - [Usage](#usage) - [Examples](./examples/README.md) - [Developer setup](#developer-setup) -- [API Reference](#api-reference) - [Roadmap](#roadmap) # Overview @@ -482,7 +481,7 @@ Removing a Pipeline deletes it and all associated data from the database. Remove ## Developer Setup -This Python library is generated from our core rust-sdk. Please check [rust-sdk documentation](../../README.md) for developer setup. +This Python library is generated from our core rust-sdk. Please check [rust-sdk documentation](../README.md) for developer setup. ## Roadmap From 59aa1e9163307eb922ac981ffcb178901dbe916a Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:34:42 -0700 Subject: [PATCH 15/16] Updated README and added requirements.txt --- pgml-sdks/pgml/python/examples/README.md | 26 +++++++++----- .../pgml/python/examples/requirements.txt | 36 +++++++++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 pgml-sdks/pgml/python/examples/requirements.txt diff --git a/pgml-sdks/pgml/python/examples/README.md b/pgml-sdks/pgml/python/examples/README.md index 81416c038..d1b16c6a1 100644 --- a/pgml-sdks/pgml/python/examples/README.md +++ b/pgml-sdks/pgml/python/examples/README.md @@ -1,20 +1,28 @@ -## Examples +# Examples -### [Semantic Search](./semantic_search.py) +## Prerequisites +Before running any examples first install dependencies and set the DATABASE_URL environment variable: +``` +pip install -r requirements.txt +export DATABASE_URL={YOUR DATABASE URL} +``` + +Optionally, configure a .env file containing a DATABASE_URL variable. + +## [Semantic Search](./semantic_search.py) This is a basic example to perform semantic search on a collection of documents. It loads the Quora dataset, creates a collection in a PostgreSQL database, upserts documents, generates chunks and embeddings, and then performs a vector search on a query. Embeddings are created using `intfloat/e5-small` model. The results are semantically similar documemts to the query. Finally, the collection is archived. -### [Question Answering](./question_answering.py) +## [Question Answering](./question_answering.py) This is an example to find documents relevant to a question from the collection of documents. It loads the Stanford Question Answering Dataset (SQuAD) into the database, generates chunks and embeddings. Query is passed to vector search to retrieve documents that match closely in the embeddings space. A score is returned with each of the search result. -### [Question Answering using Instructore Model](./question_answering_instructor.py) +## [Question Answering using Instructore Model](./question_answering_instructor.py) In this example, we will use `hknlp/instructor-base` model to build text embeddings instead of the default `intfloat/e5-small` model. -### [Extractive Question Answering](./extractive_question_answering.py) +## [Extractive Question Answering](./extractive_question_answering.py) In this example, we will show how to use `vector_recall` result as a `context` to a HuggingFace question answering model. We will use `Builtins.transform()` to run the model on the database. -### [Table Question Answering](./table_question_answering.py) -In this example, we will use [Open Table-and-Text Question Answering (OTT-QA) -](https://github.com/wenhuchen/OTT-QA) dataset to run queries on tables. We will use `deepset/all-mpnet-base-v2-table` model that is trained for embedding tabular data for retrieval tasks. +## [Table Question Answering](./table_question_answering.py) +In this example, we will use [Open Table-and-Text Question Answering (OTT-QA)](https://github.com/wenhuchen/OTT-QA) dataset to run queries on tables. We will use `deepset/all-mpnet-base-v2-table` model that is trained for embedding tabular data for retrieval tasks. -### [Summarizing Question Answering](./summarizing_question_answering.py) +## [Summarizing Question Answering](./summarizing_question_answering.py) This is an example to find documents relevant to a question from the collection of documents and then summarize those documents. diff --git a/pgml-sdks/pgml/python/examples/requirements.txt b/pgml-sdks/pgml/python/examples/requirements.txt new file mode 100644 index 000000000..fecf7d9b9 --- /dev/null +++ b/pgml-sdks/pgml/python/examples/requirements.txt @@ -0,0 +1,36 @@ +aiohttp==3.8.5 +aiosignal==1.3.1 +async-timeout==4.0.3 +attrs==23.1.0 +certifi==2023.7.22 +charset-normalizer==3.2.0 +datasets==2.14.4 +dill==0.3.7 +filelock==3.12.3 +frozenlist==1.4.0 +fsspec==2023.6.0 +huggingface-hub==0.16.4 +idna==3.4 +markdown-it-py==3.0.0 +mdurl==0.1.2 +multidict==6.0.4 +multiprocess==0.70.15 +numpy==1.25.2 +packaging==23.1 +pandas==2.0.3 +pgml==0.9.0 +pyarrow==13.0.0 +Pygments==2.16.1 +python-dateutil==2.8.2 +python-dotenv==1.0.0 +pytz==2023.3 +PyYAML==6.0.1 +requests==2.31.0 +rich==13.5.2 +six==1.16.0 +tqdm==4.66.1 +typing_extensions==4.7.1 +tzdata==2023.3 +urllib3==2.0.4 +xxhash==3.3.0 +yarl==1.9.2 From 415286672466d36864952f1f463af37c93549183 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Mon, 28 Aug 2023 09:38:03 -0700 Subject: [PATCH 16/16] Fix python README demo to actually work --- pgml-sdks/pgml/python/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pgml-sdks/pgml/python/README.md b/pgml-sdks/pgml/python/README.md index 542263acf..b6b70aaea 100644 --- a/pgml-sdks/pgml/python/README.md +++ b/pgml-sdks/pgml/python/README.md @@ -151,8 +151,7 @@ Continuing within `async def main():` Call `main` function in an async loop. ```python -if __name__ == "__main__": - asyncio.run(main()) +asyncio.run(main()) ``` **Running the Code**