mirror of
https://github.com/leoncvlt/loconotion.git
synced 2024-08-30 18:12:12 +00:00
Set up poetry and black formatter
This commit is contained in:
parent
bd76bc3089
commit
7e5a11cb6a
9
.gitignore
vendored
9
.gitignore
vendored
@ -108,10 +108,7 @@ dmypy.json
|
|||||||
.pyre/
|
.pyre/
|
||||||
|
|
||||||
# End of https://www.gitignore.io/api/python
|
# End of https://www.gitignore.io/api/python
|
||||||
|
.env
|
||||||
.vscode
|
.vscode
|
||||||
env
|
temp
|
||||||
dist/*
|
logs
|
||||||
test/*
|
|
||||||
logs/*
|
|
||||||
*.bat
|
|
@ -40,11 +40,13 @@ It does, but I wasn't really happy with the styling - the pages looked a bit ugl
|
|||||||
|
|
||||||
## Installation & Requirements
|
## Installation & Requirements
|
||||||
|
|
||||||
`pip install -r requirements.txt`
|
Make sure you're in your virtual environment of choiche, then run
|
||||||
|
- `poetry install --no-dev` if you have [Poetry](https://python-poetry.org/) installed
|
||||||
|
- `pip install -r requirements.txt` otherwise
|
||||||
|
|
||||||
This script uses [ChromeDriver](chromedriver.chromium.org) to automate the Google Chrome browser - therefore Google Chrome needs to be installed in order to work.
|
This script uses [ChromeDriver](chromedriver.chromium.org) to automate the Google Chrome browser - therefore Google Chrome needs to be installed in order to work.
|
||||||
|
|
||||||
The script comes bundled with the default windows chromedriver executable. On Max / Linux, download the right distribution for you from https://chromedriver.chromium.org/downloads and place the executable in this folder. Alternatively, use the `--chromedriver` argument to specify its path at runtime.
|
The script will automatically try to download and use the appropriate chromedriver distribution for your OS and Chrome version. If this doesn't work, download the right version for you from https://chromedriver.chromium.org/downloads and use the `--chromedriver` argument to specify its path at runtime.
|
||||||
|
|
||||||
## Simple Usage
|
## Simple Usage
|
||||||
|
|
||||||
|
@ -8,95 +8,121 @@ from pathlib import Path
|
|||||||
log = logging.getLogger("loconotion")
|
log = logging.getLogger("loconotion")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import requests
|
import requests
|
||||||
import toml
|
import toml
|
||||||
except ModuleNotFoundError as error:
|
except ModuleNotFoundError as error:
|
||||||
log.critical(f"ModuleNotFoundError: {error}. have your installed the requirements?")
|
log.critical(f"ModuleNotFoundError: {error}. have your installed the requirements?")
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
from notionparser import Parser
|
from notionparser import Parser
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# set up argument parser
|
# set up argument parser
|
||||||
argparser = argparse.ArgumentParser(description='Generate static websites from Notion.so pages')
|
argparser = argparse.ArgumentParser(
|
||||||
argparser.add_argument('target', help='The config file containing the site properties, or the url of the Notion.so page to generate the site from')
|
description="Generate static websites from Notion.so pages"
|
||||||
argparser.add_argument('--chromedriver', help='Use a specific chromedriver executable instead of the auto-installing one')
|
)
|
||||||
argparser.add_argument("--single-page", action="store_true", help="Only parse the first page, then stop")
|
argparser.add_argument(
|
||||||
argparser.add_argument('--clean', action='store_true', help='Delete all previously cached files for the site before generating it')
|
"target",
|
||||||
argparser.add_argument('--non-headless', action='store_true', help='Run chromedriver in non-headless mode')
|
help="The config file containing the site properties, or the url"
|
||||||
argparser.add_argument("-v", "--verbose", action="store_true", help="Increasite output log verbosity")
|
" of the Notion.so page to generate the site from",
|
||||||
args = argparser.parse_args()
|
)
|
||||||
|
argparser.add_argument(
|
||||||
|
"--chromedriver",
|
||||||
|
help="Use a specific chromedriver executable instead of the auto-installing one",
|
||||||
|
)
|
||||||
|
argparser.add_argument(
|
||||||
|
"--single-page", action="store_true", help="Only parse the first page, then stop"
|
||||||
|
)
|
||||||
|
argparser.add_argument(
|
||||||
|
"--clean",
|
||||||
|
action="store_true",
|
||||||
|
help="Delete all previously cached files for the site before generating it",
|
||||||
|
)
|
||||||
|
argparser.add_argument(
|
||||||
|
"--non-headless",
|
||||||
|
action="store_true",
|
||||||
|
help="Run chromedriver in non-headless mode",
|
||||||
|
)
|
||||||
|
argparser.add_argument(
|
||||||
|
"-v", "--verbose", action="store_true", help="Increasite output log verbosity"
|
||||||
|
)
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
# set up some pretty logs
|
# set up some pretty logs
|
||||||
log = logging.getLogger("loconotion")
|
log = logging.getLogger("loconotion")
|
||||||
log.setLevel(logging.INFO if not args.verbose else logging.DEBUG)
|
log.setLevel(logging.INFO if not args.verbose else logging.DEBUG)
|
||||||
log_screen_handler = logging.StreamHandler(stream=sys.stdout)
|
log_screen_handler = logging.StreamHandler(stream=sys.stdout)
|
||||||
log.addHandler(log_screen_handler)
|
log.addHandler(log_screen_handler)
|
||||||
log.propagate = False
|
log.propagate = False
|
||||||
try:
|
|
||||||
import colorama, copy
|
|
||||||
|
|
||||||
LOG_COLORS = {
|
|
||||||
logging.DEBUG: colorama.Fore.GREEN,
|
|
||||||
logging.INFO: colorama.Fore.BLUE,
|
|
||||||
logging.WARNING: colorama.Fore.YELLOW,
|
|
||||||
logging.ERROR: colorama.Fore.RED,
|
|
||||||
logging.CRITICAL: colorama.Back.RED
|
|
||||||
}
|
|
||||||
|
|
||||||
class ColorFormatter(logging.Formatter):
|
|
||||||
def format(self, record, *args, **kwargs):
|
|
||||||
# if the corresponding logger has children, they may receive modified
|
|
||||||
# record, so we want to keep it intact
|
|
||||||
new_record = copy.copy(record)
|
|
||||||
if new_record.levelno in LOG_COLORS:
|
|
||||||
new_record.levelname = "{color_begin}{level}{color_end}".format(
|
|
||||||
level=new_record.levelname,
|
|
||||||
color_begin=LOG_COLORS[new_record.levelno],
|
|
||||||
color_end=colorama.Style.RESET_ALL,
|
|
||||||
)
|
|
||||||
return super(ColorFormatter, self).format(new_record, *args, **kwargs)
|
|
||||||
|
|
||||||
log_screen_handler.setFormatter(ColorFormatter(fmt='%(asctime)s %(levelname)-8s %(message)s',
|
|
||||||
datefmt="{color_begin}[%H:%M:%S]{color_end}".format(
|
|
||||||
color_begin=colorama.Style.DIM,
|
|
||||||
color_end=colorama.Style.RESET_ALL
|
|
||||||
)))
|
|
||||||
except ModuleNotFoundError as identifier:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# initialise and run the website parser
|
|
||||||
try:
|
|
||||||
if urllib.parse.urlparse(args.target).scheme:
|
|
||||||
try:
|
|
||||||
response = requests.get(args.target)
|
|
||||||
if ("notion.so" in args.target):
|
|
||||||
log.info("Initialising parser with simple page url")
|
|
||||||
config = { "page" : args.target }
|
|
||||||
Parser(config = config, args = vars(args))
|
|
||||||
else:
|
|
||||||
log.critical(f"{args.target} is not a notion.so page")
|
|
||||||
except requests.ConnectionError as exception:
|
|
||||||
log.critical(f"Connection error")
|
|
||||||
else:
|
|
||||||
if Path(args.target).is_file():
|
|
||||||
with open(args.target) as f:
|
|
||||||
parsed_config = toml.loads(f.read())
|
|
||||||
log.info(f"Initialising parser with configuration file")
|
|
||||||
log.debug(parsed_config)
|
|
||||||
Parser(config = parsed_config, args = vars(args))
|
|
||||||
else:
|
|
||||||
log.critical(f"Config file {args.target} does not exists")
|
|
||||||
except FileNotFoundError as e:
|
|
||||||
log.critical(f'FileNotFoundError: {e}')
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
main()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
log.critical('Interrupted by user')
|
|
||||||
try:
|
try:
|
||||||
sys.exit(0)
|
import colorama, copy
|
||||||
except SystemExit:
|
|
||||||
os._exit(0)
|
LOG_COLORS = {
|
||||||
|
logging.DEBUG: colorama.Fore.GREEN,
|
||||||
|
logging.INFO: colorama.Fore.BLUE,
|
||||||
|
logging.WARNING: colorama.Fore.YELLOW,
|
||||||
|
logging.ERROR: colorama.Fore.RED,
|
||||||
|
logging.CRITICAL: colorama.Back.RED,
|
||||||
|
}
|
||||||
|
|
||||||
|
class ColorFormatter(logging.Formatter):
|
||||||
|
def format(self, record, *args, **kwargs):
|
||||||
|
# if the corresponding logger has children, they may receive modified
|
||||||
|
# record, so we want to keep it intact
|
||||||
|
new_record = copy.copy(record)
|
||||||
|
if new_record.levelno in LOG_COLORS:
|
||||||
|
new_record.levelname = "{color_begin}{level}{color_end}".format(
|
||||||
|
level=new_record.levelname,
|
||||||
|
color_begin=LOG_COLORS[new_record.levelno],
|
||||||
|
color_end=colorama.Style.RESET_ALL,
|
||||||
|
)
|
||||||
|
return super(ColorFormatter, self).format(new_record, *args, **kwargs)
|
||||||
|
|
||||||
|
log_screen_handler.setFormatter(
|
||||||
|
ColorFormatter(
|
||||||
|
fmt="%(asctime)s %(levelname)-8s %(message)s",
|
||||||
|
datefmt="{color_begin}[%H:%M:%S]{color_end}".format(
|
||||||
|
color_begin=colorama.Style.DIM, color_end=colorama.Style.RESET_ALL
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
except ModuleNotFoundError as identifier:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# initialise and run the website parser
|
||||||
|
try:
|
||||||
|
if urllib.parse.urlparse(args.target).scheme:
|
||||||
|
try:
|
||||||
|
response = requests.get(args.target)
|
||||||
|
if "notion.so" in args.target:
|
||||||
|
log.info("Initialising parser with simple page url")
|
||||||
|
config = {"page": args.target}
|
||||||
|
Parser(config=config, args=vars(args))
|
||||||
|
else:
|
||||||
|
log.critical(f"{args.target} is not a notion.so page")
|
||||||
|
except requests.ConnectionError as exception:
|
||||||
|
log.critical(f"Connection error")
|
||||||
|
else:
|
||||||
|
if Path(args.target).is_file():
|
||||||
|
with open(args.target) as f:
|
||||||
|
parsed_config = toml.loads(f.read())
|
||||||
|
log.info(f"Initialising parser with configuration file")
|
||||||
|
log.debug(parsed_config)
|
||||||
|
Parser(config=parsed_config, args=vars(args))
|
||||||
|
else:
|
||||||
|
log.critical(f"Config file {args.target} does not exists")
|
||||||
|
except FileNotFoundError as e:
|
||||||
|
log.critical(f"FileNotFoundError: {e}")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
log.critical("Interrupted by user")
|
||||||
|
try:
|
||||||
|
sys.exit(0)
|
||||||
|
except SystemExit:
|
||||||
|
os._exit(0)
|
||||||
|
@ -2,40 +2,54 @@ import logging
|
|||||||
|
|
||||||
log = logging.getLogger(f"loconotion.{__name__}")
|
log = logging.getLogger(f"loconotion.{__name__}")
|
||||||
|
|
||||||
class notion_page_loaded(object):
|
|
||||||
"""An expectation for checking that a notion page has loaded.
|
|
||||||
"""
|
|
||||||
def __init__(self, url):
|
|
||||||
self.url = url
|
|
||||||
|
|
||||||
def __call__(self, driver):
|
class notion_page_loaded(object):
|
||||||
notion_presence = len(driver.find_elements_by_class_name("notion-presence-container"))
|
"""An expectation for checking that a notion page has loaded."""
|
||||||
collection_view_block = len(driver.find_elements_by_class_name("notion-collection_view_page-block"));
|
|
||||||
collection_search = len(driver.find_elements_by_class_name("collectionSearch"));
|
def __init__(self, url):
|
||||||
# embed_ghosts = len(driver.find_elements_by_css_selector("div[embed-ghost]"));
|
self.url = url
|
||||||
log.debug(f"Waiting for page content to load (presence container: {notion_presence}, loaders: {loading_spinners} )")
|
|
||||||
if (notion_presence and not loading_spinners):
|
def __call__(self, driver):
|
||||||
return True
|
notion_presence = len(
|
||||||
else:
|
driver.find_elements_by_class_name("notion-presence-container")
|
||||||
return False
|
)
|
||||||
|
collection_view_block = len(
|
||||||
|
driver.find_elements_by_class_name("notion-collection_view_page-block")
|
||||||
|
)
|
||||||
|
collection_search = len(driver.find_elements_by_class_name("collectionSearch"))
|
||||||
|
# embed_ghosts = len(driver.find_elements_by_css_selector("div[embed-ghost]"));
|
||||||
|
log.debug(
|
||||||
|
f"Waiting for page content to load"
|
||||||
|
f" (presence container: {notion_presence}, loaders: {loading_spinners} )"
|
||||||
|
)
|
||||||
|
if notion_presence and not loading_spinners:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class toggle_block_has_opened(object):
|
class toggle_block_has_opened(object):
|
||||||
"""An expectation for checking that a notion toggle block has been opened.
|
"""An expectation for checking that a notion toggle block has been opened.
|
||||||
It does so by checking if the div hosting the content has enough children,
|
It does so by checking if the div hosting the content has enough children,
|
||||||
and the abscence of the loading spinner.
|
and the abscence of the loading spinner."""
|
||||||
"""
|
|
||||||
def __init__(self, toggle_block):
|
|
||||||
self.toggle_block = toggle_block
|
|
||||||
|
|
||||||
def __call__(self, driver):
|
def __init__(self, toggle_block):
|
||||||
toggle_content = self.toggle_block.find_element_by_css_selector("div:not([style]")
|
self.toggle_block = toggle_block
|
||||||
if (toggle_content):
|
|
||||||
content_children = len(toggle_content.find_elements_by_tag_name("div"))
|
def __call__(self, driver):
|
||||||
is_loading = len(self.toggle_block.find_elements_by_class_name("loading-spinner"));
|
toggle_content = self.toggle_block.find_element_by_css_selector("div:not([style]")
|
||||||
log.debug(f"Waiting for toggle block to load ({content_children} children so far and {is_loading} loaders)")
|
if toggle_content:
|
||||||
if (content_children > 3 and not is_loading):
|
content_children = len(toggle_content.find_elements_by_tag_name("div"))
|
||||||
return True
|
is_loading = len(
|
||||||
else:
|
self.toggle_block.find_elements_by_class_name("loading-spinner")
|
||||||
return False
|
)
|
||||||
else:
|
log.debug(
|
||||||
return False
|
f"Waiting for toggle block to load"
|
||||||
|
f" ({content_children} children so far and {is_loading} loaders)"
|
||||||
|
)
|
||||||
|
if content_children > 3 and not is_loading:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
File diff suppressed because it is too large
Load Diff
315
poetry.lock
generated
Normal file
315
poetry.lock
generated
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
|
name = "appdirs"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.4.4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Classes Without Boilerplate"
|
||||||
|
name = "attrs"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "19.3.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
|
||||||
|
dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
|
||||||
|
docs = ["sphinx", "zope.interface"]
|
||||||
|
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Screen-scraping library"
|
||||||
|
name = "beautifulsoup4"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "4.9.1"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
soupsieve = [">1.2", "<2.0"]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
html5lib = ["html5lib"]
|
||||||
|
lxml = ["lxml"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "The uncompromising code formatter."
|
||||||
|
name = "black"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
version = "19.10b0"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
appdirs = "*"
|
||||||
|
attrs = ">=18.1.0"
|
||||||
|
click = ">=6.5"
|
||||||
|
pathspec = ">=0.6,<1"
|
||||||
|
regex = "*"
|
||||||
|
toml = ">=0.9.4"
|
||||||
|
typed-ast = ">=1.4.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Python package for providing Mozilla's CA Bundle."
|
||||||
|
name = "certifi"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "2020.4.5.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Universal encoding detector for Python 2 and 3"
|
||||||
|
name = "chardet"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "3.0.4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Automatically install chromedriver that supports the currently installed version of chrome."
|
||||||
|
name = "chromedriver-autoinstaller"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3"
|
||||||
|
version = "0.2.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Composable command line interface toolkit"
|
||||||
|
name = "click"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "7.1.2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Cross-platform colored terminal text."
|
||||||
|
name = "colorama"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "0.4.3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "A CSS Cascading Style Sheets library for Python"
|
||||||
|
name = "cssutils"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.0.2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||||
|
name = "idna"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
version = "2.9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
|
name = "pathspec"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "0.8.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "Alternative regular expression module, to replace re."
|
||||||
|
name = "regex"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "2020.5.14"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Python HTTP for Humans."
|
||||||
|
name = "requests"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
version = "2.23.0"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
certifi = ">=2017.4.17"
|
||||||
|
chardet = ">=3.0.2,<4"
|
||||||
|
idna = ">=2.5,<3"
|
||||||
|
urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
|
||||||
|
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Python bindings for Selenium"
|
||||||
|
name = "selenium"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "3.141.0"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
urllib3 = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "A modern CSS selector implementation for Beautiful Soup."
|
||||||
|
name = "soupsieve"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.9.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||||
|
name = "toml"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "0.10.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "dev"
|
||||||
|
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
||||||
|
name = "typed-ast"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
version = "1.4.1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
category = "main"
|
||||||
|
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||||
|
name = "urllib3"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
||||||
|
version = "1.25.9"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
brotli = ["brotlipy (>=0.6.0)"]
|
||||||
|
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
|
||||||
|
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
content-hash = "ef223e0d435f4ab7f38a6499586aecdb96924ccb7bd59cd0982d0496479ad60f"
|
||||||
|
python-versions = "^3.7"
|
||||||
|
|
||||||
|
[metadata.files]
|
||||||
|
appdirs = [
|
||||||
|
{file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
|
||||||
|
{file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
|
||||||
|
]
|
||||||
|
attrs = [
|
||||||
|
{file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
|
||||||
|
{file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
|
||||||
|
]
|
||||||
|
beautifulsoup4 = [
|
||||||
|
{file = "beautifulsoup4-4.9.1-py2-none-any.whl", hash = "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c"},
|
||||||
|
{file = "beautifulsoup4-4.9.1-py3-none-any.whl", hash = "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8"},
|
||||||
|
{file = "beautifulsoup4-4.9.1.tar.gz", hash = "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7"},
|
||||||
|
]
|
||||||
|
black = [
|
||||||
|
{file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"},
|
||||||
|
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
|
||||||
|
]
|
||||||
|
certifi = [
|
||||||
|
{file = "certifi-2020.4.5.1-py2.py3-none-any.whl", hash = "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304"},
|
||||||
|
{file = "certifi-2020.4.5.1.tar.gz", hash = "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"},
|
||||||
|
]
|
||||||
|
chardet = [
|
||||||
|
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
|
||||||
|
{file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
|
||||||
|
]
|
||||||
|
chromedriver-autoinstaller = [
|
||||||
|
{file = "chromedriver-autoinstaller-0.2.0.tar.gz", hash = "sha256:e6aadc277f2c3a1d247541eecb60bfdeabb3250c56ad9998595420840d1c7f71"},
|
||||||
|
{file = "chromedriver_autoinstaller-0.2.0-py3-none-any.whl", hash = "sha256:290a72a1e60e5d806ac0d7cc14bd6aa0746bf8e007899efca48b25eb239ea851"},
|
||||||
|
]
|
||||||
|
click = [
|
||||||
|
{file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
|
||||||
|
{file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
|
||||||
|
]
|
||||||
|
colorama = [
|
||||||
|
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
|
||||||
|
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
|
||||||
|
]
|
||||||
|
cssutils = [
|
||||||
|
{file = "cssutils-1.0.2-py3-none-any.whl", hash = "sha256:c74dbe19c92f5052774eadb15136263548dd013250f1ed1027988e7fef125c8d"},
|
||||||
|
{file = "cssutils-1.0.2.tar.gz", hash = "sha256:a2fcf06467553038e98fea9cfe36af2bf14063eb147a70958cfcaa8f5786acaf"},
|
||||||
|
]
|
||||||
|
idna = [
|
||||||
|
{file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
|
||||||
|
{file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
|
||||||
|
]
|
||||||
|
pathspec = [
|
||||||
|
{file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"},
|
||||||
|
{file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"},
|
||||||
|
]
|
||||||
|
regex = [
|
||||||
|
{file = "regex-2020.5.14-cp27-cp27m-win32.whl", hash = "sha256:e565569fc28e3ba3e475ec344d87ed3cd8ba2d575335359749298a0899fe122e"},
|
||||||
|
{file = "regex-2020.5.14-cp27-cp27m-win_amd64.whl", hash = "sha256:d466967ac8e45244b9dfe302bbe5e3337f8dc4dec8d7d10f5e950d83b140d33a"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:27ff7325b297fb6e5ebb70d10437592433601c423f5acf86e5bc1ee2919b9561"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ea55b80eb0d1c3f1d8d784264a6764f931e172480a2f1868f2536444c5f01e01"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:c9bce6e006fbe771a02bda468ec40ffccbf954803b470a0345ad39c603402577"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d881c2e657c51d89f02ae4c21d9adbef76b8325fe4d5cf0e9ad62f850f3a98fd"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-win32.whl", hash = "sha256:99568f00f7bf820c620f01721485cad230f3fb28f57d8fbf4a7967ec2e446994"},
|
||||||
|
{file = "regex-2020.5.14-cp36-cp36m-win_amd64.whl", hash = "sha256:70c14743320a68c5dac7fc5a0f685be63bc2024b062fe2aaccc4acc3d01b14a1"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a7c37f048ec3920783abab99f8f4036561a174f1314302ccfa4e9ad31cb00eb4"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89d76ce33d3266173f5be80bd4efcbd5196cafc34100fdab814f9b228dee0fa4"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:51f17abbe973c7673a61863516bdc9c0ef467407a940f39501e786a07406699c"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ce5cc53aa9fbbf6712e92c7cf268274eaff30f6bd12a0754e8133d85a8fb0f5f"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-win32.whl", hash = "sha256:8044d1c085d49673aadb3d7dc20ef5cb5b030c7a4fa253a593dda2eab3059929"},
|
||||||
|
{file = "regex-2020.5.14-cp37-cp37m-win_amd64.whl", hash = "sha256:c2062c7d470751b648f1cacc3f54460aebfc261285f14bc6da49c6943bd48bdd"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:329ba35d711e3428db6b45a53b1b13a0a8ba07cbbcf10bbed291a7da45f106c3"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:579ea215c81d18da550b62ff97ee187b99f1b135fd894a13451e00986a080cad"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a9394197664e35566242686d84dfd264c07b20f93514e2e09d3c2b3ffdf78fe"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ce367d21f33e23a84fb83a641b3834dd7dd8e9318ad8ff677fbfae5915a239f7"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-win32.whl", hash = "sha256:1386e75c9d1574f6aa2e4eb5355374c8e55f9aac97e224a8a5a6abded0f9c927"},
|
||||||
|
{file = "regex-2020.5.14-cp38-cp38-win_amd64.whl", hash = "sha256:7e61be8a2900897803c293247ef87366d5df86bf701083b6c43119c7c6c99108"},
|
||||||
|
{file = "regex-2020.5.14.tar.gz", hash = "sha256:ce450ffbfec93821ab1fea94779a8440e10cf63819be6e176eb1973a6017aff5"},
|
||||||
|
]
|
||||||
|
requests = [
|
||||||
|
{file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"},
|
||||||
|
{file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"},
|
||||||
|
]
|
||||||
|
selenium = [
|
||||||
|
{file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"},
|
||||||
|
{file = "selenium-3.141.0.tar.gz", hash = "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"},
|
||||||
|
]
|
||||||
|
soupsieve = [
|
||||||
|
{file = "soupsieve-1.9.6-py2.py3-none-any.whl", hash = "sha256:feb1e937fa26a69e08436aad4a9037cd7e1d4c7212909502ba30701247ff8abd"},
|
||||||
|
{file = "soupsieve-1.9.6.tar.gz", hash = "sha256:7985bacc98c34923a439967c1a602dc4f1e15f923b6fcf02344184f86cc7efaa"},
|
||||||
|
]
|
||||||
|
toml = [
|
||||||
|
{file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"},
|
||||||
|
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
|
||||||
|
]
|
||||||
|
typed-ast = [
|
||||||
|
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
|
||||||
|
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"},
|
||||||
|
{file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"},
|
||||||
|
{file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"},
|
||||||
|
{file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"},
|
||||||
|
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"},
|
||||||
|
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"},
|
||||||
|
{file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"},
|
||||||
|
{file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"},
|
||||||
|
{file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"},
|
||||||
|
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"},
|
||||||
|
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"},
|
||||||
|
{file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"},
|
||||||
|
{file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"},
|
||||||
|
{file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"},
|
||||||
|
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"},
|
||||||
|
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"},
|
||||||
|
{file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"},
|
||||||
|
{file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"},
|
||||||
|
{file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"},
|
||||||
|
{file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
|
||||||
|
]
|
||||||
|
urllib3 = [
|
||||||
|
{file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
|
||||||
|
{file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
|
||||||
|
]
|
22
pyproject.toml
Normal file
22
pyproject.toml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
[tool.poetry]
|
||||||
|
name = "loconotion"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = ""
|
||||||
|
authors = ["Leonardo Cavaletti <impeto.blu@gmail.com>"]
|
||||||
|
|
||||||
|
[tool.poetry.dependencies]
|
||||||
|
python = "^3.7"
|
||||||
|
beautifulsoup4 = "^4.9.1"
|
||||||
|
chromedriver-autoinstaller = "^0.2.0"
|
||||||
|
colorama = "^0.4.3"
|
||||||
|
cssutils = "^1.0.2"
|
||||||
|
requests = "^2.23.0"
|
||||||
|
selenium = "^3.141.0"
|
||||||
|
toml = "^0.10.1"
|
||||||
|
|
||||||
|
[tool.poetry.dev-dependencies]
|
||||||
|
black = "^19.10b0"
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["poetry>=0.12"]
|
||||||
|
build-backend = "poetry.masonry.api"
|
@ -1,12 +1,37 @@
|
|||||||
beautifulsoup4==4.9.1
|
beautifulsoup4==4.9.1 \
|
||||||
certifi==2020.4.5.1
|
--hash=sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c \
|
||||||
chardet==3.0.4
|
--hash=sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8 \
|
||||||
chromedriver-autoinstaller==0.2.0
|
--hash=sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7
|
||||||
colorama==0.4.3
|
certifi==2020.4.5.1 \
|
||||||
cssutils==1.0.2
|
--hash=sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304 \
|
||||||
idna==2.9
|
--hash=sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519
|
||||||
requests==2.23.0
|
chardet==3.0.4 \
|
||||||
selenium==3.141.0
|
--hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 \
|
||||||
soupsieve==2.0.1
|
--hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae
|
||||||
toml==0.10.1
|
chromedriver-autoinstaller==0.2.0 \
|
||||||
urllib3==1.25.9
|
--hash=sha256:e6aadc277f2c3a1d247541eecb60bfdeabb3250c56ad9998595420840d1c7f71 \
|
||||||
|
--hash=sha256:290a72a1e60e5d806ac0d7cc14bd6aa0746bf8e007899efca48b25eb239ea851
|
||||||
|
colorama==0.4.3 \
|
||||||
|
--hash=sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff \
|
||||||
|
--hash=sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1
|
||||||
|
cssutils==1.0.2 \
|
||||||
|
--hash=sha256:c74dbe19c92f5052774eadb15136263548dd013250f1ed1027988e7fef125c8d \
|
||||||
|
--hash=sha256:a2fcf06467553038e98fea9cfe36af2bf14063eb147a70958cfcaa8f5786acaf
|
||||||
|
idna==2.9 \
|
||||||
|
--hash=sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa \
|
||||||
|
--hash=sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb
|
||||||
|
requests==2.23.0 \
|
||||||
|
--hash=sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee \
|
||||||
|
--hash=sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6
|
||||||
|
selenium==3.141.0 \
|
||||||
|
--hash=sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c \
|
||||||
|
--hash=sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d
|
||||||
|
soupsieve==1.9.6 \
|
||||||
|
--hash=sha256:feb1e937fa26a69e08436aad4a9037cd7e1d4c7212909502ba30701247ff8abd \
|
||||||
|
--hash=sha256:7985bacc98c34923a439967c1a602dc4f1e15f923b6fcf02344184f86cc7efaa
|
||||||
|
toml==0.10.1 \
|
||||||
|
--hash=sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88 \
|
||||||
|
--hash=sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f
|
||||||
|
urllib3==1.25.9 \
|
||||||
|
--hash=sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115 \
|
||||||
|
--hash=sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527
|
||||||
|
Loading…
Reference in New Issue
Block a user