From f1efca7ea8eb0e15962f5e68848f1916170f095e Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Wed, 4 Oct 2023 22:06:49 -0500 Subject: [PATCH] first --- .vscode/settings.json | 17 + README.md | 0 flake.lock | 169 ++++++++++ flake.nix | 76 +++++ jlog/__init__.py | 243 ++++++++++++++ jlog/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 11352 bytes poetry.lock | 375 ++++++++++++++++++++++ pyproject.toml | 37 +++ 8 files changed, 917 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 jlog/__init__.py create mode 100644 jlog/__pycache__/__init__.cpython-311.pyc create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8a66d96 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "black-formatter.importStrategy": "fromEnvironment", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true + }, + "files.autoSave": "afterDelay", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true, + "flake8.importStrategy": "fromEnvironment", + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true + }, + "python.analysis.autoFormatStrings": true, +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..6defc63 --- /dev/null +++ b/flake.lock @@ -0,0 +1,169 @@ +{ + "nodes": { + "bash": { + "locked": { + "lastModified": 1678247195, + "narHash": "sha256-m/wSwlSket+hob3JED4XUvoWJLtW7yhtOiZrlRDMShs=", + "ref": "refs/heads/main", + "rev": "e7a00dcc0e75bc3ef6856bdd94d7d809245f5636", + "revCount": 1, + "type": "git", + "url": "https://git.ocjtech.us/jeff/nixos-bash-prompt-builder.git" + }, + "original": { + "type": "git", + "url": "https://git.ocjtech.us/jeff/nixos-bash-prompt-builder.git" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "make-shell": { + "locked": { + "lastModified": 1634940815, + "narHash": "sha256-P69OmveboXzS+es1vQGS4bt+ckwbeIExqxfGLjGuJqA=", + "owner": "ursi", + "repo": "nix-make-shell", + "rev": "8add91681170924e4d0591b22f294aee3f5516f9", + "type": "github" + }, + "original": { + "owner": "ursi", + "repo": "nix-make-shell", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1694937365, + "narHash": "sha256-iHZSGrb9gVpZRR4B2ishUN/1LRKWtSHZNO37C8z1SmA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5d017a8822e0907fb96f7700a319f9fe2434de02", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-23.05", + "type": "indirect" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils_2", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1694940852, + "narHash": "sha256-dFn43ozbpHjh1eIb9Xk8aXsQty3mV5nLgKE1B938ZRY=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "406a97836797fde496ccb71d5cf23dfa1ed1f9b3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, + "root": { + "inputs": { + "bash": "bash", + "flake-utils": "flake-utils", + "make-shell": "make-shell", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c0007ca --- /dev/null +++ b/flake.nix @@ -0,0 +1,76 @@ +{ + description = "jlog"; + + inputs = { + nixpkgs = { + url = "nixpkgs/nixos-23.05"; + }; + flake-utils = { + url = "github:numtide/flake-utils"; + }; + bash = { + url = "git+https://git.ocjtech.us/jeff/nixos-bash-prompt-builder.git"; + }; + poetry2nix = { + url = "github:nix-community/poetry2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + make-shell = { + url = "github:ursi/nix-make-shell"; + }; + }; + + outputs = { self, nixpkgs, poetry2nix, flake-utils, bash, ... }@inputs: + flake-utils.lib.eachDefaultSystem + (system: + let + pkgs = import nixpkgs { + inherit system; + }; + in + { + devShells.default = + let + project = "jlog"; + prompt = ( + bash.build_prompt + bash.ansi_normal_blue + "${project} - ${bash.username}@${bash.hostname_short}: ${bash.current_working_directory}" + "${project}:${bash.current_working_directory}" + ); + python = pkgs.python311.withPackages (ps: with ps; [ + poetry-core + ]); + make-shell = import inputs.make-shell { + inherit system; + pkgs = pkgs; + }; + in + make-shell { + packages = [ + python + pkgs.poetry + pkgs.samba + ]; + env = { + POETRY_VIRTUALENVS_IN_PROJECT = "true"; + POETRY_VIRTUALENVS_OPTIONS_SYSTEM_SITE_PACKAGES = "true"; + PS1 = prompt; + PYTHON_KEYRING_BACKEND = "keyring.backends.null.Keyring"; + }; + setup = ''''; + }; + packages = { + jlog = + let + inherit (poetry2nix.legacyPackages.${system}) mkPoetryApplication overrides; + in + mkPoetryApplication { + python = pkgs.python311; + projectDir = ./.; + groups = [ ]; + }; + }; + } + ); +} diff --git a/jlog/__init__.py b/jlog/__init__.py new file mode 100644 index 0000000..c90cbd9 --- /dev/null +++ b/jlog/__init__.py @@ -0,0 +1,243 @@ +"""Configure logging.""" + +from enum import IntEnum +import logging +import pathlib +import re +import sys +import traceback +from typing import Self + +from PIL.ImageColor import getrgb +import pendulum + + +class ANSIColor(IntEnum): + BLACK = 0 + RED = 1 + GREEN = 2 + YELLOW = 3 + BLUE = 4 + MAGENTA = 5 + CYAN = 6 + WHITE = 8 + + +class ANSI: + def __getattr__(self: Self, item: str) -> str: + return self.color(item) + + def color(self: Self, item: str) -> str: + item = item.upper() + extra = "" + offset = 30 + + if item.startswith("BACKGROUND_"): + offset = 40 + item = item[11:] + + if item.startswith("BRIGHT_"): + extra = ";1" + item = item[7:] + + try: + color = ANSIColor[item] + return f"\u001b[1;{color+offset:d}{extra}m" + except KeyError: + return self.fg24bitrgb(*(getrgb(item)[:3])) + + @property + def yellow(self: Self) -> str: + return self.color("yellow") + + @property + def white(self: Self) -> str: + return self.color("white") + + @property + def blue(self: Self) -> str: + return self.color("blue") + + @property + def red(self: Self) -> str: + return self.color("red") + + @property + def reset(self: Self) -> str: + return "\u001b[0m" + + @property + def bold(self: Self) -> str: + return "\u001b[1m" + + @property + def faint(self: Self) -> str: + return "\u001b[2m" + + @property + def italic(self: Self) -> str: + return "\u001b[3m" + + @property + def underline(self: Self) -> str: + return "\u001b[4m" + + @property + def reversed(self: Self) -> str: + return "\u001b[7m" + + def fg8bit(self: Self, code: int) -> str: + assert code >= 0 + assert code < 256 + code = f"\u001b[38;5;{code}m" + + def bg8bit(self: Self, code: int) -> str: + assert code >= 0 + assert code < 256 + return f"\u001b[48;5;{code}m" + + def fg24bitrgb(self: Self, red: int, green: int, blue: int) -> str: + assert red >= 0 + assert red < 256 + assert green >= 0 + assert green < 256 + assert blue >= 0 + assert blue < 256 + return f"\u001b[38;2;{red};{green};{blue}m" + + def bg24bitrgb(self: Self, red: int, green: int, blue: int) -> str: + assert red >= 0 + assert red < 256 + assert green >= 0 + assert green < 256 + assert blue >= 0 + assert blue < 256 + return f"\u001b[48;2;{red};{green};{blue}m" + + # def fg24bitcmy(self, cyan: int, magenta: int, yellow: int) -> str: + # assert cyan >= 0 + # assert cyan < 256 + # assert magenta >= 0 + # assert magenta < 256 + # assert yellow >= 0 + # assert yellow < 256 + # return f"\u001b[38:2::{cyan};{magenta};{yellow}:::m" + + +ansi = ANSI() + + +class JLogFormatter(logging.Formatter): + """Format time the way it SHOULD be done.""" + + COLORS = { + "WARNING": ansi.yellow, + "INFO": ansi.white, + "DEBUG": ansi.blue, + "CRITICAL": ansi.yellow, + "ERROR": ansi.red, + } + + color: bool + ascii_only: bool + + def __init__(self: Self, color: bool = True, ascii_only: bool = False): + super().__init__("") + self.color = color + self.ascii_only = ascii_only + + def format(self: Self, record: logging.LogRecord) -> str: + message = record.msg + + if len(record.args) > 0: + message = record.msg % record.args + + created = pendulum.from_timestamp(record.created).in_timezone("America/Chicago") + + levelname_color = "" + if record.levelname in self.COLORS: + levelname_color = self.COLORS[record.levelname] + + name = record.name + if len(name) > 25: + if not self.ascii_only: + name = name[:24] + "\u2026" + else: + name = name[:22] + "..." + + pathname = record.pathname + if len(pathname) > 15: + if not self.ascii_only: + pathname = "\u2026" + pathname[-14:] + else: + pathname = "..." + pathname[:12] + + prefix = ( + f"{ansi.faint:s}{created:YYYY-MM-DD HH:mm:ss.SSSSSS Z}{ansi.reset:s} " + f"[{ansi.bold:s}{name:^25s}{ansi.reset:s}] {pathname:s}:{record.lineno:<4d} " + f"{levelname_color:s}{record.levelname:8s}{ansi.reset:s}" + ) + + msg = "" + for line in message.splitlines(): + msg += f"\n{prefix} {line.rstrip():s}" + + msg = msg.strip() + + if record.exc_info is not None: + msg += f"\n{prefix:s} exception: {type(record.exc_info)}" + + match record.exc_info: + case tuple(): + formatted = traceback.format_exception(*record.exc_info) + # case logging._ExcInfoType(): + # formatted = traceback.format_exception(*record.exc_info[2]) + # case logging._SysExcInfoType(): + # formatted = traceback.format_exception(*record.exc_info) + case _: + formatted = [] + + for chunk in formatted: + for line in chunk.splitlines(): + msg += f"\n{prefix:s} {line.rstrip():s}" + + if "\u001b" in msg: + msg += ansi.reset + + if not self.color: + msg = re.sub(r"\u001b\[\d+[^m]*m", "", msg) + + if self.ascii_only: + msg = msg.encode("ascii", errors="replace").decode("ascii") + + return msg + + +def setup_logging( + filename: pathlib.Path | None = None, color: bool = True, ascii_only: bool = False +) -> None: + """Set up logging.""" + formatter = JLogFormatter(color=color, ascii_only=ascii_only) + + root = logging.getLogger() + for handler in root.handlers: + root.removeHandler(handler) + handler.close() + + root.setLevel(logging.DEBUG) + + console = logging.StreamHandler(stream=sys.stderr) + console.setFormatter(formatter) + console.setLevel(logging.DEBUG) + + root.addHandler(console) + + if filename is not None: + file = logging.FileHandler(filename=filename, encoding="utf-8") + file.setFormatter(formatter) + file.setLevel(logging.DEBUG) + root.addHandler(file) + + logging.getLogger("urllib3.connectionpool").setLevel(logging.INFO) + logging.getLogger("aiohttp_retry").setLevel(logging.INFO) + logging.captureWarnings(True) diff --git a/jlog/__pycache__/__init__.cpython-311.pyc b/jlog/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ae2f2fc4ff20823ab9ddad5d5b525cb0bbadf8c GIT binary patch literal 11352 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 TD2-P+$2wP|r4=>-sviFX+U9^~ literal 0 HcmV?d00001 diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..fd67d35 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,375 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "black" +version = "23.9.1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[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 = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +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 = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" + +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +category = "dev" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +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 = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +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 = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "pillow" +version = "10.0.1" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pycodestyle" +version = "2.11.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, + {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, +] + +[[package]] +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] + +[[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 = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[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"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "ba12700eca3726167f286f2aae887a99cd7098ad32d78dd85a26d0827d8a1e79" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..422389e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[tool.poetry] +name = "jlog" +version = "0.1.0" +description = "" +authors = ["Jeffrey C. Ollie "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +pendulum = "^2.1.2" +arrow = "^1.2.3" +pillow = "^10.0.1" + + +[tool.poetry.group.dev.dependencies] +black = "^23.9.1" +isort = "^5.12.0" +flake8 = "^6.1.0" +flake8-pyproject = "^1.2.3" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.black] +max-line-length = 120 + +[tool.isort] +profile = "black" +line_length = 120 +force_single_line = true +from_first = false +force_sort_within_sections = true + +[tool.flake8] +max-line-length = 120 +extend-ignore = "E203"