diff options
| author | Fuwn <[email protected]> | 2022-09-23 22:42:14 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-09-23 22:42:14 -0700 |
| commit | 5bc398b5166e49147fa5fac41de0bc866a2159e0 (patch) | |
| tree | b273f21291c9b326297971bafed9ac0b1d5e9b49 | |
| download | machinis-5bc398b5166e49147fa5fac41de0bc866a2159e0.tar.xz machinis-5bc398b5166e49147fa5fac41de0bc866a2159e0.zip | |
feat: initial commit
| -rw-r--r-- | .gitignore | 11 | ||||
| -rw-r--r-- | Dockerfile | 18 | ||||
| -rw-r--r-- | machinis.example.ini | 16 | ||||
| -rw-r--r-- | machinis/__init__.py | 13 | ||||
| -rw-r--r-- | machinis/__main__.py | 18 | ||||
| -rw-r--r-- | machinis/api/__init__.py | 30 | ||||
| -rw-r--r-- | machinis/cli/__init__.py | 31 | ||||
| -rw-r--r-- | machinis/configuration/__init__.py | 45 | ||||
| -rw-r--r-- | machinis/configuration/alpaca.py | 19 | ||||
| -rw-r--r-- | machinis/configuration/api.py | 17 | ||||
| -rw-r--r-- | machinis/configuration/openai.py | 19 | ||||
| -rw-r--r-- | machinis/configuration/surrealdb.py | 25 | ||||
| -rw-r--r-- | machinis/configuration/torch.py | 17 | ||||
| -rw-r--r-- | machinis/configuration/trader.py | 17 | ||||
| -rw-r--r-- | machinis/database/__init__.py | 18 | ||||
| -rw-r--r-- | machinis/database/sqlite3.py | 53 | ||||
| -rw-r--r-- | machinis/database/surrealdb.py | 30 | ||||
| -rw-r--r-- | machinis/openai/__init__.py | 29 | ||||
| -rw-r--r-- | machinis/queen/__init__.py | 34 | ||||
| -rw-r--r-- | machinis/torch/__init__.py | 51 | ||||
| -rw-r--r-- | machinis/trader/__init__.py | 55 | ||||
| -rw-r--r-- | make.py | 54 | ||||
| -rw-r--r-- | poetry.lock | 1276 | ||||
| -rw-r--r-- | pyproject.toml | 48 |
24 files changed, 1944 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..931111a --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Python +.mypy_cache +__pycache__ +.venv + +# CLion +.idea + +# Machinis +machinis.db +machinis.ini diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..aeca5eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.10 + +ENV PYTHONDONTWRITEBYTECODE 1 \ + PYTHONUNBUFFERED 1 \ + PIP_DISABLE_PIP_VERSION_CHECK 1 + +RUN pip install poetry + +WORKDIR /machinis + +COPY poetry.lock pyproject.toml /machinis/ + +RUN poetry config virtualenvs.create false \ + && poetry install --no-dev --no-interaction --no-ansi + +COPY . /machinis + +ENTRYPOINT ["poetry", "run", "python", "-m", "machinis"] diff --git a/machinis.example.ini b/machinis.example.ini new file mode 100644 index 0000000..9c4a56b --- /dev/null +++ b/machinis.example.ini @@ -0,0 +1,16 @@ +[machinis/alpaca] +api_key = 12345 +secret_key = 12345 + +[machinis/openai] +api_key = 12345 +model = text-ada-001 + +[machinis/api] +enabled = false + +[machinis/trader] +enabled = false + +[machinis/torch] +device = cpu diff --git a/machinis/__init__.py b/machinis/__init__.py new file mode 100644 index 0000000..e25df65 --- /dev/null +++ b/machinis/__init__.py @@ -0,0 +1,13 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +__version__ = "0.1.0" +__title__ = "machinis" +__author__ = "Fuwn" +__license__ = "UNLICENSED" +__copyright__ = "Fuwn" +__all__ = () diff --git a/machinis/__main__.py b/machinis/__main__.py new file mode 100644 index 0000000..0277ece --- /dev/null +++ b/machinis/__main__.py @@ -0,0 +1,18 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import os + +from .cli import Cli + +if __name__ == "__main__": + if os.name != "nt": + import uvloop # type: ignore + + uvloop.install() + + Cli() diff --git a/machinis/api/__init__.py b/machinis/api/__init__.py new file mode 100644 index 0000000..1f09581 --- /dev/null +++ b/machinis/api/__init__.py @@ -0,0 +1,30 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import sys +from os import path + +from sanic import Sanic +from sanic.request import Request +from sanic.response import HTTPResponse, text + + +class Api: + def __init__(self) -> None: + self._name = ( + path.dirname(path.dirname(path.abspath(__file__))) + .split({"win32": "\\"}.get(sys.platform, "/")) + .pop() + ) + self._sanic = Sanic(self._name) + + @self._sanic.get("/") + async def index(_request: Request) -> HTTPResponse: + return text(self._name) + + def run(self) -> None: + self._sanic.run() diff --git a/machinis/cli/__init__.py b/machinis/cli/__init__.py new file mode 100644 index 0000000..fb6ef67 --- /dev/null +++ b/machinis/cli/__init__.py @@ -0,0 +1,31 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import typer +from icecream import ic # type: ignore +from loguru import logger + +import machinis.queen +import machinis.torch + + +class Cli: + def __init__(self) -> None: + self._typer = typer.Typer() + + @self._typer.command() + def main(task: str = typer.Argument("start")) -> None: + queen = machinis.queen.Queen() + + match task: + case "start": + queen.run() + case "openai": + logger.info("starting torch") + ic(queen.openai.ask("What is your favourite colour?")) + + self._typer() diff --git a/machinis/configuration/__init__.py b/machinis/configuration/__init__.py new file mode 100644 index 0000000..7f26b73 --- /dev/null +++ b/machinis/configuration/__init__.py @@ -0,0 +1,45 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +import typing +from dataclasses import dataclass + +from .alpaca import Alpaca +from .api import Api +from .openai import OpenAI +from .surrealdb import SurrealDB +from .torch import Torch +from .trader import Trader + + +@dataclass() +class Configuration: + alpaca: Alpaca + openai: OpenAI + api: Api + trader: Trader + torch: Torch + surrealdb: SurrealDB + + def __init__(self) -> None: + ini = configparser.ConfigParser() + + ini.read("machinis.ini") + + self.alpaca = Alpaca(ini) + self.openai = OpenAI(ini) + self.api = Api(ini) + self.trader = Trader(ini) + self.torch = Torch(ini) + self.surrealdb = SurrealDB(ini) + + def __getitem__(self, item: str) -> typing.Any: + return getattr(self, item) + + def is_set(self, item: str) -> bool: + return self[item] is not None diff --git a/machinis/configuration/alpaca.py b/machinis/configuration/alpaca.py new file mode 100644 index 0000000..722ea0d --- /dev/null +++ b/machinis/configuration/alpaca.py @@ -0,0 +1,19 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class Alpaca: + api_key: str + secret_key: str + + def __init__(self, ini: configparser.ConfigParser): + self.api_key = ini.get("machinis/alpaca", "api_key") + self.secret_key = ini.get("machinis/alpaca", "secret_key") diff --git a/machinis/configuration/api.py b/machinis/configuration/api.py new file mode 100644 index 0000000..31b5885 --- /dev/null +++ b/machinis/configuration/api.py @@ -0,0 +1,17 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class Api: + enabled: bool + + def __init__(self, ini: configparser.ConfigParser): + self.enabled = ini.get("machinis/api", "enabled").lower() == "true" diff --git a/machinis/configuration/openai.py b/machinis/configuration/openai.py new file mode 100644 index 0000000..62e9506 --- /dev/null +++ b/machinis/configuration/openai.py @@ -0,0 +1,19 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class OpenAI: + api_key: str + model: str + + def __init__(self, ini: configparser.ConfigParser): + self.api_key = ini.get("machinis/openai", "api_key") + self.model = ini.get("machinis/openai", "model") diff --git a/machinis/configuration/surrealdb.py b/machinis/configuration/surrealdb.py new file mode 100644 index 0000000..108141a --- /dev/null +++ b/machinis/configuration/surrealdb.py @@ -0,0 +1,25 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class SurrealDB: + url: str + namespace: str + database: str + username: str + password: str + + def __init__(self, ini: configparser.ConfigParser): + self.url = ini.get("machinis/surrealdb", "url") + self.database = ini.get("machinis/surrealdb", "database") + self.namespace = ini.get("machinis/surrealdb", "namespace") + self.username = ini.get("machinis/surrealdb", "username") + self.password = ini.get("machinis/surrealdb", "password") diff --git a/machinis/configuration/torch.py b/machinis/configuration/torch.py new file mode 100644 index 0000000..5e6f5e9 --- /dev/null +++ b/machinis/configuration/torch.py @@ -0,0 +1,17 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class Torch: + device: str + + def __init__(self, ini: configparser.ConfigParser): + self.device = ini.get("machinis/torch", "device") diff --git a/machinis/configuration/trader.py b/machinis/configuration/trader.py new file mode 100644 index 0000000..dc5c896 --- /dev/null +++ b/machinis/configuration/trader.py @@ -0,0 +1,17 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import configparser +from dataclasses import dataclass + + +@dataclass() +class Trader: + enabled: bool + + def __init__(self, ini: configparser.ConfigParser): + self.enabled = ini.get("machinis/trader", "enabled").lower() == "true" diff --git a/machinis/database/__init__.py b/machinis/database/__init__.py new file mode 100644 index 0000000..148d26f --- /dev/null +++ b/machinis/database/__init__.py @@ -0,0 +1,18 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + + +import machinis.configuration + +from .sqlite3 import Sqlite3 +from .surrealdb import SurrealDB + + +class Database: + def __init__(self, config: machinis.configuration.Configuration) -> None: + self.sqlite3 = Sqlite3.create() + self.surrealdb = SurrealDB(config) diff --git a/machinis/database/sqlite3.py b/machinis/database/sqlite3.py new file mode 100644 index 0000000..29ee2af --- /dev/null +++ b/machinis/database/sqlite3.py @@ -0,0 +1,53 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import dataclasses +from sqlite3 import Row +from typing import Any, Iterable + +import aiosqlite + + +class Sqlite3: + path: str + connection: aiosqlite.Connection + cursor: aiosqlite.Cursor + + @classmethod + async def create(cls, path: str = "machinis.db") -> Any: + """https://stackoverflow.com/a/61074795/14452787""" + + connection = aiosqlite.connect(path) + cursor = await connection.cursor() + + async def fetch(query: str, *args: Iterable[Any]) -> Iterable[Row]: + await cursor.execute(query, args) + + return await cursor.fetchall() + + async def execute(query: str, *args: Iterable[Any]) -> None: + await cursor.execute(query, args) + + if not fetch( + "SELECT name FROM sqlite_master WHERE type='table' AND name='trade'" + ): + await execute("CREATE TABLE IF NOT EXISTS trade(date, time)") + + return cls(path, connection, cursor) + + async def execute(self, query: str, *args: Iterable[Any]) -> None: + await self.cursor.execute(query, args) + await self.connection.commit() + + async def fetch(self, query: str, *args: Iterable[Any]) -> Iterable[Row]: + await self.cursor.execute(query, args) + + return await self.cursor.fetchall() + + async def close(self) -> None: + await self.connection.close() diff --git a/machinis/database/surrealdb.py b/machinis/database/surrealdb.py new file mode 100644 index 0000000..b83404b --- /dev/null +++ b/machinis/database/surrealdb.py @@ -0,0 +1,30 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + + +from typing import Any + +import surrealdb.clients.http + +from machinis.configuration import Configuration + + +class SurrealDB: + def __init__(self, config: Configuration) -> None: + self._client = surrealdb.clients.http.HTTPClient( + config.surrealdb.url, + namespace=config.surrealdb.namespace, + database=config.surrealdb.database, + username=config.surrealdb.username, + password=config.surrealdb.password, + ) + + async def execute(self, query: str) -> None: + await self._client.execute(query) + + async def fetch(self, query: str) -> list[Any]: + return await self._client.execute(query) diff --git a/machinis/openai/__init__.py b/machinis/openai/__init__.py new file mode 100644 index 0000000..5fdba5f --- /dev/null +++ b/machinis/openai/__init__.py @@ -0,0 +1,29 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import openai + +from machinis import configuration + + +class OpenAI: + def __init__(self, config: configuration.Configuration) -> None: + openai.api_key = config.openai.api_key + self.model = config.openai.model + + def ask(self, prompt: str) -> str: + response = openai.Completion.create( + model=self.model, + prompt=prompt, + temperature=0.7, + max_tokens=256, + top_p=1, + frequency_penalty=0, + presence_penalty=0, + ) + + return str(response.choices[0].text.strip()) diff --git a/machinis/queen/__init__.py b/machinis/queen/__init__.py new file mode 100644 index 0000000..45c6ec5 --- /dev/null +++ b/machinis/queen/__init__.py @@ -0,0 +1,34 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +from threading import Thread + +import machinis.api +import machinis.database +import machinis.openai +import machinis.torch +from machinis import configuration, trader + + +class Queen: + def __init__(self) -> None: + self.config = configuration.Configuration() + self.database = machinis.database.Database(self.config) + self.openai = machinis.openai.OpenAI(self.config) + + def run(self) -> None: + torch_thread = Thread(target=machinis.torch.Torch(self.config).run) + + torch_thread.start() + + if self.config.trader.enabled: + trader.Trader(self.config).run() + + if self.config.api.enabled: + machinis.api.Api().run() + + torch_thread.join() diff --git a/machinis/torch/__init__.py b/machinis/torch/__init__.py new file mode 100644 index 0000000..a5dc8b9 --- /dev/null +++ b/machinis/torch/__init__.py @@ -0,0 +1,51 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +import math + +import torch +from loguru import logger + +from machinis.configuration import Configuration + + +class Torch: + def __init__(self, config: Configuration): + self._config = config + + def run(self) -> None: + d_type = torch.float + device = torch.device(self._config.torch.device) + x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=d_type) + y = torch.sin(x) + a = torch.randn((), device=device, dtype=d_type) + b = torch.randn((), device=device, dtype=d_type) + c = torch.randn((), device=device, dtype=d_type) + d = torch.randn((), device=device, dtype=d_type) + learning_rate = 1e-6 + + for t in range(2000): + y_pred = a + b * x + c * x**2 + d * x**3 + loss = (y_pred - y).pow(2).sum().item() + + if t % 100 == 99: + logger.info(f"{t}: {loss}") + + grad_y_pred = 2.0 * (y_pred - y) + grad_a = grad_y_pred.sum() + grad_b = (grad_y_pred * x).sum() + grad_c = (grad_y_pred * x**2).sum() + grad_d = (grad_y_pred * x**3).sum() + + a -= learning_rate * grad_a + b -= learning_rate * grad_b + c -= learning_rate * grad_c + d -= learning_rate * grad_d + + logger.info( + f"Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3" + ) diff --git a/machinis/trader/__init__.py b/machinis/trader/__init__.py new file mode 100644 index 0000000..bd9240d --- /dev/null +++ b/machinis/trader/__init__.py @@ -0,0 +1,55 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +from alpaca.data.historical import CryptoHistoricalDataClient # type: ignore +from alpaca.data.live import CryptoDataStream # type: ignore +from alpaca.data.models.quotes import Quote # type: ignore +from alpaca.data.requests import CryptoLatestQuoteRequest # type: ignore +from finviz.screener import Screener # type: ignore + +from machinis.configuration import Configuration + + +async def quote_data_handler(data: Quote) -> None: + print(data.ask_price) + + +class Trader: + """Maccina, Macchina""" + + def __init__(self, config: Configuration) -> None: + self.config = config + self.stream_client = CryptoDataStream( + self.config.alpaca.api_key, self.config.alpaca.secret_key + ) + self.historical_client = CryptoHistoricalDataClient() + + # self.stream_client.subscribe_quotes(quote_data_handler, "ETH/USD") + + def run(self) -> None: + request_params = CryptoLatestQuoteRequest( + symbol_or_symbols="ETH/USD", + ) + latest_quote = self.historical_client.get_crypto_latest_quote( + request_params + ) + filters = ["exch_nasd", "idx_sp500"] + stock_list = Screener( + filters=filters, table="Performance", order="price" + ) + + for stock in stock_list[0:10]: + print(stock["Ticker"], stock["Price"]) + + stock_list.add(filters=["fa_div_high"]) + + print(stock_list) + print( + f"Hello, World! {self.config.alpaca.api_key} {latest_quote['ETH/USD'].ask_price}" + ) + + # self.stream_client.run() @@ -0,0 +1,54 @@ +# This file is part of machinis <https://github.com/Fuwn/machinis>. +# +# All rights reserved +# +# Copyright (C) 2022-2022 Fuwn <[email protected]> +# SPDX-License-Identifier: UNLICENSED + +# type: ignore + +import subprocess +import sys + +import sane + +CC: str = {"win32": "python"}.get(sys.platform, "python3") +POETRY: str = {"win32": "poetry.bat"}.get(sys.platform, "poetry") + + +def run(): + subprocess.run(f"{POETRY} run {CC} -m machinis") + + +def fmt(): + subprocess.run(f"{POETRY} run black . -q") + + +def sort(): + subprocess.run(f"{POETRY} run isort machinis make.py") + + +def typing(): + subprocess.run(f"{POETRY} run mypy . --strict --no-error-summary") + + +def spelling(): + subprocess.run(f"{POETRY} run codespell machinis make.py") + + +def safety(): + subprocess.run(f"{POETRY} run safety check --bare") # --full-report + + [email protected](recipe_deps=["fmt", "sort", "typing", "spelling", "safety"]) +def check(): + pass + + +sane.sane_run(run) diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..670fa78 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1276 @@ +[[package]] +name = "aiofiles" +version = "22.1.0" +description = "File support for asyncio." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[[package]] +name = "aiohttp" +version = "3.8.1" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.2.0" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "aiosqlite" +version = "0.17.0" +description = "asyncio bridge to the standard sqlite3 module" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing_extensions = ">=3.7.2" + +[[package]] +name = "alpaca-py" +version = "0.6.0" +description = "The Official Python SDK for Alpaca APIs" +category = "main" +optional = false +python-versions = ">=3.7.1,<4.0.0" + +[package.dependencies] +msgpack = ">=1.0.3,<2.0.0" +pandas = ">=1.3.5,<2.0.0" +pydantic = ">=1.9.0,<2.0.0" +requests = ">=2.27.1,<3.0.0" +sseclient-py = ">=1.7.2,<2.0.0" +websockets = ">=10.2,<11.0" + +[[package]] +name = "anyio" +version = "3.6.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + +[[package]] +name = "asttokens" +version = "2.0.8" +description = "Annotate AST trees with source code positions" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid (<=2.5.3)", "pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "beautifulsoup4" +version = "4.11.1" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "22.8.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +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 = "2022.9.14" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "charset-normalizer" +version = "2.1.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "codespell" +version = "2.2.1" +description = "Codespell" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["check-manifest", "flake8", "pytest", "pytest-cov", "pytest-dependency"] +hard-encoding-detection = ["chardet"] + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["hypothesis (==3.55.3)", "flake8 (==3.7.8)"] + +[[package]] +name = "cssselect" +version = "1.1.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "dparse" +version = "0.6.0" +description = "A parser for Python dependency files" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +packaging = "*" +toml = "*" + +[package.extras] +pipenv = ["pipenv"] +conda = ["pyyaml"] + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "executing" +version = "1.0.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "finviz" +version = "1.4.4" +description = "Unofficial API for finviz.com" +category = "main" +optional = false +python-versions = "^3.8" +develop = false + +[package.dependencies] +aiohttp = "^3.7.4" +beautifulsoup4 = "^4.9.3" +cssselect = "^1.1.0" +lxml = "^4.6.3" +requests = "^2.25.1" +tenacity = "^7.0.0" +tqdm = "^4.61.1" +urllib3 = "^1.26.5" +user_agent = "^0.1.9" + +[package.source] +type = "git" +url = "https://github.com/mariostoev/finviz" +reference = "master" +resolved_reference = "6d05d336dc22ba2d719e4f30cdf8da2fae80d294" + +[[package]] +name = "frozenlist" +version = "1.3.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "h11" +version = "0.12.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "httpcore" +version = "0.15.0" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +anyio = ">=3.0.0,<4.0.0" +certifi = "*" +h11 = ">=0.11,<0.13" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httptools" +version = "0.5.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.23.0" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.16.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotlicffi", "brotli"] +cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10,<13)", "pygments (>=2.0.0,<3.0.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "icecream" +version = "2.1.3" +description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = ">=2.0.1" +colorama = ">=0.3.9" +executing = ">=0.3.1" +pygments = ">=2.2.0" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "loguru" +version = "0.6.0" +description = "Python logging made (stupidly) simple" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["sphinx-rtd-theme (>=0.4.3)", "sphinx-autobuild (>=0.7.1)", "Sphinx (>=4.1.1)", "isort (>=5.1.1)", "black (>=19.10b0)", "pytest-cov (>=2.7.1)", "pytest (>=4.6.2)", "tox (>=3.9.0)", "flake8 (>=3.7.7)", "docutils (==0.16)", "colorama (>=0.3.4)"] + +[[package]] +name = "lxml" +version = "4.9.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["beautifulsoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "multidict" +version = "6.0.2" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "numpy" +version = "1.23.3" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "openai" +version = "0.23.0" +description = "Python client library for the OpenAI API" +category = "main" +optional = false +python-versions = ">=3.7.1" + +[package.dependencies] +numpy = "*" +openpyxl = ">=3.0.7" +pandas = ">=1.2.3" +pandas-stubs = ">=1.1.0.11" +requests = ">=2.20" +tqdm = "*" +typing_extensions = "*" + +[package.extras] +dev = ["black (>=21.6b0,<22.0.0)", "pytest (>=6.0.0,<7.0.0)"] +embeddings = ["scikit-learn (>=1.0.2)", "tenacity (>=8.0.1)"] + +[[package]] +name = "openpyxl" +version = "3.0.10" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandas" +version = "1.4.4" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = [ + {version = ">=1.18.5", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, + {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pandas-stubs" +version = "1.2.0.62" +description = "Type annotations for Pandas" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pathspec" +version = "0.10.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.16.2" +description = "A task runner that works well with poetry." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry_plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pydantic" +version = "1.10.2" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.13.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.3" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[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" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2022.2.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "12.5.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.6.3,<4.0.0" + +[package.dependencies] +commonmark = ">=0.9.0,<0.10.0" +pygments = ">=2.6.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] + +[[package]] +name = "ruamel.yaml" +version = "0.17.21" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "dev" +optional = false +python-versions = ">=3" + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel.yaml.clib" +version = "0.2.6" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "safety" +version = "2.1.1" +description = "Checks installed dependencies for known vulnerabilities and licenses." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +Click = ">=8.0.2" +dparse = ">=0.5.1" +packaging = ">=21.0" +requests = "*" +"ruamel.yaml" = ">=0.17.21" + +[[package]] +name = "sane-build" +version = "7.3" +description = "Make, but Sane" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sanic" +version = "22.6.2" +description = "A web server and web framework that's written to go fast. Build fast. Run fast." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +aiofiles = ">=0.6.0" +httptools = ">=0.0.10" +multidict = ">=5.0,<7.0" +sanic-routing = ">=22.3.0,<22.6.0" +ujson = {version = ">=1.35", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""} +uvloop = {version = ">=0.5.3", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""} +websockets = ">=10.0" + +[package.extras] +all = ["towncrier", "pytest-cov", "mypy (>=0.901,<0.910)", "pytest (==6.2.5)", "isort (>=5.0.0)", "flake8", "pygments", "pytest-benchmark", "black", "bandit", "pytest-sugar", "gunicorn (==20.0.4)", "docutils", "sphinx (>=2.1.2)", "sanic-testing (>=22.3.0)", "m2r2", "chardet (>=3.0.0,<4.0.0)", "cryptography", "pytest-sanic", "uvicorn (<0.15.0)", "slotscheck (>=0.8.0,<1)", "mistune (<2.0.0)", "beautifulsoup4", "sphinx-rtd-theme (>=0.4.3)", "coverage (==5.3)", "enum-tools", "tox", "types-ujson"] +dev = ["sanic-testing (>=22.3.0)", "pytest (==6.2.5)", "coverage (==5.3)", "gunicorn (==20.0.4)", "pytest-cov", "beautifulsoup4", "pytest-sanic", "pytest-sugar", "pytest-benchmark", "chardet (>=3.0.0,<4.0.0)", "flake8", "black", "isort (>=5.0.0)", "bandit", "mypy (>=0.901,<0.910)", "docutils", "pygments", "uvicorn (<0.15.0)", "slotscheck (>=0.8.0,<1)", "cryptography", "tox", "towncrier", "types-ujson"] +docs = ["sphinx (>=2.1.2)", "sphinx-rtd-theme (>=0.4.3)", "docutils", "pygments", "m2r2", "enum-tools", "mistune (<2.0.0)"] +ext = ["sanic-ext"] +http3 = ["aioquic"] +test = ["sanic-testing (>=22.3.0)", "pytest (==6.2.5)", "coverage (==5.3)", "gunicorn (==20.0.4)", "pytest-cov", "beautifulsoup4", "pytest-sanic", "pytest-sugar", "pytest-benchmark", "chardet (>=3.0.0,<4.0.0)", "flake8", "black", "isort (>=5.0.0)", "bandit", "mypy (>=0.901,<0.910)", "docutils", "pygments", "uvicorn (<0.15.0)", "slotscheck (>=0.8.0,<1)", "types-ujson"] + +[[package]] +name = "sanic-routing" +version = "22.3.0" +description = "Core routing component for Sanic" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.4" + +[[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.*" + +[[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" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sseclient-py" +version = "1.7.2" +description = "SSE client for Python" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "surrealdb" +version = "0.1.0" +description = "The official SurrealDB library for Python." +category = "main" +optional = false +python-versions = "*" +develop = false + +[package.dependencies] +aiohttp = ">=3.8.1" +httpx = ">=0.23.0" + +[package.extras] +speedups = [] + +[package.source] +type = "git" +url = "https://github.com/surrealdb/surrealdb.py" +reference = "main" +resolved_reference = "87c59d851b6416e9a60aac2bfcf599eb3bdbe95a" + +[[package]] +name = "tenacity" +version = "7.0.0" +description = "Retry code until it succeeds" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tqdm" +version = "4.64.1" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[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 = "typer" +version = "0.6.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} + +[package.extras] +test = ["rich (>=10.11.0,<13.0.0)", "isort (>=5.0.6,<6.0.0)", "black (>=22.3.0,<23.0.0)", "mypy (==0.910)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "coverage (>=5.2,<6.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest (>=4.4.0,<5.4.0)", "shellingham (>=1.3.0,<2.0.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mkdocs (>=1.1.2,<2.0.0)"] +dev = ["pre-commit (>=2.17.0,<3.0.0)", "flake8 (>=3.8.3,<4.0.0)", "autoflake (>=1.3.1,<2.0.0)"] +all = ["rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)", "colorama (>=0.4.3,<0.5.0)"] + +[[package]] +name = "typing-extensions" +version = "4.3.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "ujson" +version = "5.5.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.12" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "user-agent" +version = "0.1.10" +description = "User-Agent generator" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=22.0.0,<22.1.0)", "mypy (>=0.800)", "aiohttp"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +test = ["flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=22.0.0,<22.1.0)", "mypy (>=0.800)", "Cython (>=0.29.32,<0.30.0)", "aiohttp"] + +[[package]] +name = "websockets" +version = "10.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" # ^3.10 +content-hash = "7d8d6aaed4f485d512cd8c83cf2d0ff714a0dadfcadccd741632a9b83c2bff58" + +[metadata.files] +aiofiles = [] +aiohttp = [ + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiosignal = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, +] +aiosqlite = [] +alpaca-py = [] +anyio = [] +asttokens = [] +async-timeout = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] +attrs = [] +beautifulsoup4 = [] +black = [] +certifi = [] +charset-normalizer = [] +click = [] +codespell = [] +colorama = [] +commonmark = [] +cssselect = [] +dparse = [] +et-xmlfile = [] +executing = [] +finviz = [] +frozenlist = [] +h11 = [] +httpcore = [] +httptools = [] +httpx = [] +icecream = [] +idna = [] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +loguru = [] +lxml = [] +msgpack = [] +multidict = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] +mypy = [] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +numpy = [] +openai = [] +openpyxl = [] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pandas = [] +pandas-stubs = [] +pastel = [] +pathspec = [] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poethepoet = [] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pydantic = [] +pygments = [] +pyparsing = [] +pytest = [] +python-dateutil = [] +pytz = [] +requests = [] +rfc3986 = [] +rich = [] +"ruamel.yaml" = [] +"ruamel.yaml.clib" = [] +safety = [] +sane-build = [] +sanic = [] +sanic-routing = [] +shellingham = [] +six = [] +sniffio = [] +soupsieve = [] +sseclient-py = [] +surrealdb = [] +tenacity = [] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tqdm = [] +typer = [] +typing-extensions = [] +ujson = [] +urllib3 = [] +user-agent = [] +uvloop = [] +websockets = [] +win32-setctime = [] +yarl = [] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2471156 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,48 @@ +[tool.poetry] +name = "machinis" +version = "0.1.0" +description = "Advanced, AI-assisted Stock Market Masterpiece" +authors = ["Fuwn <[email protected]>"] +license = "UNLICENSED" + +[tool.poetry.dependencies] +python = "^3.9" # ^3.10 +alpaca-py = "^0.6.0" +uvloop = { version = "^0.17.0", platform = "linux" } +pandas = "^1.4.4" +finviz = { git = "https://github.com/mariostoev/finviz" } +openai = "^0.23.0" +loguru = "^0.6.0" +icecream = "^2.1.3" +sanic = "^22.6.2" +typer = { extras = ["all"], version = "^0.6.1" } +rich = "^12.5.1" +httpx = "0.23.0" +surrealdb = { git = "https://github.com/surrealdb/surrealdb.py", branch = "main" } +aiosqlite = "^0.17.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.3" +sane-build = "^7.3" +black = "^22.8.0" +isort = "^5.10.1" +mypy = "^0.971" +codespell = "^2.2.1" +safety = "^2.1.1" +poethepoet = "^0.16.2" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[tool.black] +line-length = 80 + +[tool.isort] +profile = "black" + +[tool.mypy] +strict = true + +[tool.poe.tasks] +force-cuda11 = "python -m pip install torch==1.12.1+cu116 -f https://download.pytorch.org/whl/torch_stable.html" |