diff --git a/.gitignore b/.gitignore index ce37a6d..1787488 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ dist/ eggs/ sdist/ docs/_build +docs/autoapi/ cython_debug/ # Hidden files that are definitely unwanted (redundant) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf6e5c6..2149f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ Adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html) and [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [0.2.0] - 2020-09-01 + +### Removed: +- `db` subpackage +- `toml_data` module. Use `NestedDotDict` instead. + +### Changed: +- Made `tools` require the `tools` optional package + + ## [0.1.0] - 2020-08-06 ### Added: diff --git a/README.md b/README.md index d6672b4..b596afa 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Adorable little Python functions for you to copy or import. `pip install pocketutils`. To get the optional packages, use: -`pip install pocketutils[biochem,db,misc,notebooks,plotting]` +`pip install pocketutils[tools,biochem,misc,notebooks,plotting]` Among the more useful are `zip_strict`, `frozenlist`, `SmartEnum`, `is_lambda`, `strip_paired_brackets`, `sanitize_path_node`, `TomlData`, `PrettyRecordFactory`, `parallel_with_cursor`, `groupby_parallel`, diff --git a/pocketutils/__init__.py b/pocketutils/__init__.py index ea1afaf..15bfbf8 100644 --- a/pocketutils/__init__.py +++ b/pocketutils/__init__.py @@ -3,12 +3,11 @@ """ import logging -from pathlib import Path, PurePath -from typing import Union -# importlib.metadata is compat with Python 3.8 only -from importlib_metadata import PackageNotFoundError -from importlib_metadata import metadata as __load +# If you need Python < 3.8, change to importlib_metadata and add it as a dependency +from importlib.metadata import PackageNotFoundError +from importlib.metadata import metadata as __load +from pathlib import Path logger = logging.getLogger(Path(__file__).parent.name) @@ -16,8 +15,8 @@ try: metadata = __load(Path(__file__).absolute().parent.name) __status__ = "Development" - __copyright__ = "Copyright 2016–2020" - __date__ = "2020-08-24" + __copyright__ = "Copyright 2020" + __date__ = "2020-09-01" __uri__ = metadata["home-page"] __title__ = metadata["name"] __summary__ = metadata["summary"] @@ -26,21 +25,13 @@ __author__ = metadata["author"] __maintainer__ = metadata["maintainer"] __contact__ = metadata["maintainer"] -except PackageNotFoundError: +except PackageNotFoundError: # pragma: no cover logger.error( - "Could not load package metadata for {}. Is it installed?".format( - Path(__file__).absolute().parent.name - ) + f"Could not load package metadata for {Path(__file__).absolute().parent.name}. Is it installed?" ) - -def resource(*nodes: Union[PurePath, str]) -> Path: - """Gets a path of a resource file under resources/ directory.""" - return Path(Path(__file__).parent, "resources", *nodes) - - -if __name__ == "__main__": +if __name__ == "__main__": # pragma: no cover if metadata is not None: - print("{} (v{})".format(metadata["name"], metadata["version"])) + print(f"{metadata['name']} (v{metadata['version']})") else: print("Unknown project info") diff --git a/pocketutils/biochem/tissue_expression.py b/pocketutils/biochem/tissue_expression.py index 5a0ef5a..4be037a 100644 --- a/pocketutils/biochem/tissue_expression.py +++ b/pocketutils/biochem/tissue_expression.py @@ -28,7 +28,7 @@ def load( filter_fn: Callable[[pd.DataFrame], pd.DataFrame] = pd.DataFrame.dropna, ) -> TissueTable: """ - Get a DataFrame of Human Protein Atlas tissue expression data, + Gets a DataFrame of Human Protein Atlas tissue expression data, indexed by Gene name and with the 'Gene' and 'Reliability' columns dropped. The expression level ('Level') is replaced using this map: {'Not detected': 0, 'Low': 1, 'Medium': 2, 'High': 3}. Downloads the file from http://www.proteinatlas.org/download/normal_tissue.tsv.zip diff --git a/pocketutils/biochem/uniprot_go.py b/pocketutils/biochem/uniprot_go.py index 67cfda1..b4f0aa3 100644 --- a/pocketutils/biochem/uniprot_go.py +++ b/pocketutils/biochem/uniprot_go.py @@ -24,6 +24,7 @@ class FlatGoTerm: """ A Gene Ontology term. Not to be confused with GOTerm in goatools: obo_parser.GOTerm + Attributes: ID (str); ex: GO:0005737 kind (str: 'P'==process, 'C'==component, 'F'==function) @@ -66,7 +67,9 @@ class UniprotGoTerms: def fetch_uniprot_data(self, uniprot_ids: Union[str, List[str]]) -> List[Mapping[str, str]]: """ Fetches a list of dicts of UniProt metadata, one per UniProt ID. - Raises a ValueError if a UniProt ID wasn't found. + + Raises: + ValueError: If a UniProt ID wasn't found. """ if isinstance(uniprot_ids, str): # not a list type uniprot_ids = [uniprot_ids] @@ -95,7 +98,9 @@ def go_terms_for_uniprot_id_as_df(self, uniprot_id: str) -> pd.DataFrame: class GoTermsAtLevel: """ - Example: go_term_ancestors_for_uniprot_id_as_df('P42681', 2) + Gene ontology terms organized by level. + Example: + >>> go_term_ancestors_for_uniprot_id_as_df('P42681', 2) """ def __init__(self) -> None: @@ -127,8 +132,9 @@ def get_ancestors_of_go_term(self, term_id: str, level: int) -> Iterable[GOTerm] From a GO term in the form 'GO:0007344', returns a set of ancestor GOTerm objects at the specified level. The traversal is restricted to is-a relationships. Note that the level is the minimum number of steps to the root. - Arguments: - level: starting at 0 (root) + + Args: + level: starting at 0 (root) """ def traverse_up(term, buildup_set, level): @@ -149,9 +155,10 @@ def go_term_ancestors_for_uniprot_id( Gets the GO terms associated with a UniProt ID and returns a set of their ancestors at the specified level. The traversal is restricted to is-a relationships. Note that the level is the minimum number of steps to the root. - Arguments: - level: starting at 0 (root) - kinds_allowed: a set containing any combination of 'P', 'F', or 'C' + + Args: + level: starting at 0 (root) + kinds_allowed: a set containing any combination of 'P', 'F', or 'C' """ if kinds_allowed is None: kinds_allowed = ["P", "F", "C"] diff --git a/pocketutils/core/__init__.py b/pocketutils/core/__init__.py index de9f2e2..3fcf23f 100644 --- a/pocketutils/core/__init__.py +++ b/pocketutils/core/__init__.py @@ -112,15 +112,18 @@ def _new_type( ) -> Type[LazyWrapped]: """ Creates a new mutable wrapped type. - For ex: - ``` - LazyRemoteTime = LazyWrap.new_type('RemoteTime', lambda: urllib...) - dt = LazyRemoteTime() # nothing happens - print(dt.get()) # has a value - ``` - :param dtype: The name of the data type, such as 'datetime' if generator=datetime.now - :param generator: This is called to (lazily) initialize an instance of the LazyWrapped - :return: A new class subclassing LazyWrapped + + Example: + >>> LazyRemoteTime = LazyWrap.new_type('RemoteTime', lambda: ...) + >>> dt = LazyRemoteTime() # nothing happens + >>> dt.get() # has a value + + Args: + dtype: The name of the data type, such as 'datetime' if generator=datetime.now + generator: This is called to (lazily) initialize an instance of the LazyWrapped + + Returns: + A new class subclassing LazyWrapped """ class X(superclass): @@ -144,7 +147,7 @@ class SmartEnum(enum.Enum): def of(cls, v): """ Returns the member of this enum class from a string with the member's name, - case-insentive and stripping whitespace. + case-insensitive and stripping whitespace. Will return ``v`` if ``v`` is already an instance of this class. """ if isinstance(v, cls): diff --git a/pocketutils/core/dot_dict.py b/pocketutils/core/dot_dict.py index c397369..a7e9616 100644 --- a/pocketutils/core/dot_dict.py +++ b/pocketutils/core/dot_dict.py @@ -14,7 +14,7 @@ class NestedDotDict: A thin wrapper around a nested dict to make getting values easier. Keys must not contain dots (.), which are reserved for splitting of values. This class is especially useful for TOML but also works well for JSON and Python dicts. - Also see ``toml_data``. This has some advantages. + Also see ``toml_data``. ``NestedDotDict`` has some advantages over it. """ @classmethod diff --git a/pocketutils/core/exceptions.py b/pocketutils/core/exceptions.py index 10643af..f23795f 100644 --- a/pocketutils/core/exceptions.py +++ b/pocketutils/core/exceptions.py @@ -29,8 +29,10 @@ def args(**names): """ Decorator. Add a __init__ that calls the superclass and takes any argument in names. - The __init__ will set: (self.name =value if name is passed else None) for all name in names. - :param names: A map from str to Type + The __init__ will set: (self.name=value if name is passed else None) for all name in names. + + Args: + names: A map from str to Type """ assert not any([s == "info" or s.startswith("__") and s.endswith("__") for s in names]) diff --git a/pocketutils/core/internal.py b/pocketutils/core/internal.py index 02f2aaa..d38e3ad 100644 --- a/pocketutils/core/internal.py +++ b/pocketutils/core/internal.py @@ -70,9 +70,11 @@ def expanded(cls, item, depth=1): def nicesize(nbytes: int, space: str = "") -> str: """ Uses IEC 1998 units, such as KiB (1024). - :param nbytes: Number of bytes - :param space: Separator between digits and units - :return: Formatted string + nbytes: Number of bytes + space: Separator between digits and units + + Returns: + Formatted string """ data = { "PiB": 1024 ** 5, diff --git a/pocketutils/core/iterators.py b/pocketutils/core/iterators.py index 01d8ddc..95df0ab 100644 --- a/pocketutils/core/iterators.py +++ b/pocketutils/core/iterators.py @@ -68,9 +68,11 @@ def __next__(self) -> T: class TieredIterator(SeqIterator): """ A SizedIterator that iterates over every tuples of combination from multiple sequences. - Ex: - it = TieredIterator([[1, 2, 3], [5, 6]]) - list(it) # [(1,5), (1,6), (2,5), (2,6), (3,5), (3,6)] + + Example: + >>> it = TieredIterator([[1, 2, 3], [5, 6]]) + >>> list(it) + [(1,5), (1,6), (2,5), (2,6), (3,5), (3,6)] """ # noinspection PyMissingConstructor diff --git a/pocketutils/core/toml_data.py b/pocketutils/core/toml_data.py deleted file mode 100644 index 4b11157..0000000 --- a/pocketutils/core/toml_data.py +++ /dev/null @@ -1,105 +0,0 @@ -from typing import Dict, ItemsView, Iterator, KeysView, List, ValuesView - - -class TomlData: - """ - A better TOML data structure than a plain dict. - Usage examples: - data = TomlData({'x': {'y': {'z': 155}}}) - print(data['x.y.z']) # prints 155 - data.sub('x.y') # returns a new TomlData for {'z': 155} - data.nested_keys() # returns all keys and sub-keys - """ - - def __init__(self, top_level_item: Dict[str, object]): - assert top_level_item is not None - self.top = top_level_item - - def __str__(self) -> str: - return repr(self) - - def __repr__(self) -> str: - return "TomlData({})".format(str(self.top)) - - def __getitem__(self, key: str) -> Dict[str, object]: - return self.sub(key).top - - def get_str(self, key: str) -> str: - return str(self.__as(key, str)) - - def get_int(self, key: str) -> int: - # noinspection PyTypeChecker - return int(self.__as(key, int)) - - def get_bool(self, key: str) -> int: - # noinspection PyTypeChecker - return bool(self.__as(key, bool)) - - def get_str_list(self, key: str) -> List[str]: - return self.__as_list(key, str) - - def get_int_list(self, key: str) -> List[int]: - return self.__as_list(key, int) - - def get_float_list(self, key: str) -> List[int]: - return self.__as_list(key, int) - - def get_bool_list(self, key: str) -> List[int]: - return self.__as_list(key, bool) - - def get_float(self, key: str) -> int: - # noinspection PyTypeChecker - return int(self.__as(key, float)) - - def __as_list(self, key: str, clazz): - def to(v): - if not isinstance(v, clazz): - raise TypeError("{}={} is a {}, not {}".format(key, v, type(v), clazz)) - return [to(v) for v in self[key]] - - def __as(self, key: str, clazz): - v = self[key] - if isinstance(v, clazz): - return v - else: - raise TypeError("{}={} is a {}, not {}".format(key, v, type(v), clazz)) - - def sub(self, key: str): - """Returns a new TomlData with its top set to items[1][2]...""" - items = key.split(".") - item = self.top - for i, s in enumerate(items): - if s not in item: - raise LookupError( - "{} is not in the TOML; failed at {}".format(key, ".".join(items[: i + 1])) - ) - item = item[s] - return TomlData(item) - - def items(self) -> ItemsView[str, object]: - return self.top.items() - - def keys(self) -> KeysView[str]: - return self.top.keys() - - def values(self) -> ValuesView[object]: - return self.top.values() - - def nested_keys(self, separator=".") -> Iterator[str]: - for lst in self.nested_key_lists(self.top): - yield separator.join(lst) - - def nested_key_lists(self, dictionary: Dict[str, object], prefix=None) -> Iterator[List[str]]: - prefix = prefix[:] if prefix else [] - if isinstance(dictionary, dict): - for key, value in dictionary.items(): - if isinstance(value, dict): - for result in self.nested_key_lists(value, [key] + prefix): - yield result - else: - yield prefix + [key] - else: - yield dictionary - - -__all__ = ["TomlData"] diff --git a/pocketutils/db/__init__.py b/pocketutils/db/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pocketutils/db/connection.py b/pocketutils/db/connection.py deleted file mode 100644 index 47c1e0f..0000000 --- a/pocketutils/db/connection.py +++ /dev/null @@ -1,153 +0,0 @@ -import json -import logging -import os -from typing import Dict, Iterator, Optional, Tuple, Union - -from pocketutils.core.exceptions import ContradictoryRequestError, FileDoesNotExistError - - -class Connection: - """ - Convenient way to open a database connection through an SSH tunnel for Pewee or raw SQL. - You can use an existing tunnel by giving it a local port (local_bind_port) - or have it create a new one by giving it an SSH hostname. - Example usage: - with Connection(db_name, db_user, db_password) as db: - db.connect_with_peewee() # don't worry, this will be closed with the GlobalConnection - from mymodel.model import * # you MUST import this AFTER setting global_connection.db - do_my_stuff() - - Or: - with Connection.from_json('a_json_file'): - ... - The JSON file will need to specify a value for each argument in the constructor. - """ - - def __init__( - self, - db_name: str, - db_username: str, - db_password: str, - ssh_host: Optional[str] = None, - local_bind_port: Optional[int] = None, - ssh_port: int = 22, - db_port: int = 3306, - ): - self._ssh_username = None - self._ssh_password = None - self._db_username = None - self._db_password = None - self._db_name = None - self._ssh_host = None - self._ssh_port = None - self._local_bind_port = None - self._db_port = None - self._tunnel = None - self.plain_sql_database = None - self.peewee_database = None - if (ssh_host is None) == (local_bind_port is None): - raise ContradictoryRequestError( - "Must specify either an SSH host to create a tunnel," - "or the local bind port of an existing tunnel (but not both)" - ) - self._local_bind_port = local_bind_port - self._db_username = db_username - self._db_password = db_password - self._db_name = db_name - self._ssh_host = ssh_host - self._ssh_port = ssh_port - self._db_port = db_port - if ssh_host is not None: - try: - from sshtunnel import SSHTunnelForwarder - except: - logging.error("Couldn't import sshtunnel. Cannot make new tunnel.") - raise - self._tunnel = SSHTunnelForwarder( - (self._ssh_host, self._ssh_port), - ssh_username=self._ssh_username, - ssh_password=self._ssh_password, - remote_bind_address=("localhost", self._db_port), - ) - - @classmethod - def from_json(cls, config_path: str): - if os.path.isfile(config_path) and os.access(config_path, os.R_OK): - logging.info("Using connection from '{}'".format(config_path)) - with open(config_path) as jscfg: - params = json.load(jscfg) # type: Dict[str, Union[str, int, None]] - return cls(**params) - else: - raise FileDoesNotExistError( - "{} does not exist, is not a file, or is not readable".format(config_path) - ) - - @classmethod - def from_dict(cls, dct: Dict[str, str]): - return cls(**dct) - - def connect_with_peewee(self): - import peewee - - self.peewee_database = peewee.MySQLDatabase(self._db_name, **self._connection_params()) - self.peewee_database.connect() - return self.peewee_database - - def connect_with_plain_sql(self): - import pymysql - - self.plain_sql_database = pymysql.connect( - **self._connection_params(), db=self._db_name, cursorclass=pymysql.cursors.DictCursor - ) - logging.debug("Opened raw pymysql connection to database {}".format(self._db_name)) - - def execute(self, statement: str, vals: Tuple = ()) -> None: - with self.plain_sql_database.cursor() as cursor: - cursor.execute(statement, vals) - self.plain_sql_database.commit() - - def select(self, statement: str, vals: Tuple = ()) -> Iterator[Dict]: - with self.plain_sql_database.cursor() as cursor: - cursor.execute(statement, vals) - return cursor - - def __enter__(self): - self.open() - return self - - def open(self): - if self._tunnel is not None: - self._tunnel.start() - logging.info( - "Opened SSH tunnel to host {} on port {}".format(self._ssh_host, self._ssh_port) - ) - else: - logging.info("Assuming an SSH tunnel already exists for database connection.") - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - - def close(self): - if self._tunnel is not None: - self._tunnel.close() - logging.info("Closed SSH tunnel") - if self.plain_sql_database is not None: - self.plain_sql_database.close() - logging.info("Closed raw pymysql connection") - if self.peewee_database is not None: - logging.info("Closed peewee pymysql connection") - self.peewee_database.close() - - def _connection_params(self): - local_bind_port = ( - self._tunnel.local_bind_port if self._tunnel is not None else self._local_bind_port - ) - return { - "user": self._db_username, - "password": self._db_password, - "host": "127.0.0.1", - "port": local_bind_port, - } - - -__all__ = ["Connection"] diff --git a/pocketutils/logging/fancy_logger.py b/pocketutils/logging/fancy_logger.py index fb67fb0..5511c0d 100644 --- a/pocketutils/logging/fancy_logger.py +++ b/pocketutils/logging/fancy_logger.py @@ -112,13 +112,13 @@ class AdvancedLogger(logging.Logger): - MINOR: Information that is less important than INFO but isn't just for debugging - TRACE: Low-level debug info - To create: - ``` - LogLevel.initalize() - logger = KaleLogger.create('myproject') - log_factory = KaleRecordFactory(7, 13, 5).modifying(logger) - logger.setLevel('INFO') # good start; can be changed - ``` + Example: + Using ``AdvancedLogger`` with fancy formatting:: + + LogLevel.initalize() + logger = AdvancedLogger.create('myproject') + log_factory = Log(7, 13, 5).modifying(logger) + logger.setLevel('INFO') # good start; can be changed """ @contextmanager @@ -128,8 +128,10 @@ def suppressed( """ Temporarily suppresses logging from kale, and globally if `universe=True`. Yields as a context manager. - :param suppress: If False, ignores (useful to avoid if-else) - :param universe: Disable all logging strictly below critical. Calls `logging.disable` + + Args: + suppress: If False, ignores (useful to avoid if-else) + universe: Disable all logging strictly below critical. Calls `logging.disable` """ if suppress: self._suppressed = True @@ -151,9 +153,11 @@ def suppressed_other( """ Temporarily suppress logging for another logger name. Yields as a context manager. - :param name: The name of the other logger, such as 'pandas' - :param suppress: If False, ignores (useful to avoid if-else) - :param below: Suppress only logging with levels strictly lower than this + + Args: + name: The name of the other logger, such as 'pandas' + suppress: If False, ignores (useful to avoid if-else) + below: Suppress only logging with levels strictly lower than this """ below = LogLevel.get_int(below) ell = logging.getLogger(name) diff --git a/pocketutils/logging/flexible_logger.py b/pocketutils/logging/flexible_logger.py index f32cad7..4a6415f 100644 --- a/pocketutils/logging/flexible_logger.py +++ b/pocketutils/logging/flexible_logger.py @@ -4,8 +4,10 @@ import logging import os from datetime import datetime +from pathlib import Path from typing import Optional +from pocketutils.core import PathLike from pocketutils.core.exceptions import DirDoesNotExistError @@ -26,9 +28,9 @@ def __init__( self._formatter = formatter self.datetime_started = datetime.datetime.now() - def add_file(self, path: str, level: int = logging.DEBUG): - self._make_dirs(os.path.dirname(path)) - return self._add(logging.FileHandler(path), level) + def add_file(self, path: PathLike, level: int = logging.DEBUG): + Path(path).parent.mkdir(parents=True, exist_ok=True) + return self._add(logging.FileHandler(str(path)), level) def add_stdout(self, level: int = logging.INFO): return self._add(logging.StreamHandler(), level) @@ -43,14 +45,5 @@ def _add(self, handler, level): self._underlying.addHandler(handler) return self - def _make_dirs(self, output_dir: str) -> None: - # note that we can't import from pocketutils.files (common shouldn't depend on files) - if not os.path.exists(output_dir): - os.makedirs(output_dir) - elif not os.path.isdir(output_dir): - raise DirDoesNotExistError( - "{} already exists and is not a directory".format(output_dir), path=output_dir, - ) - __all__ = ["BasicFlexLogger"] diff --git a/pocketutils/logging/log_format.py b/pocketutils/logging/log_format.py index 088634f..40300d2 100644 --- a/pocketutils/logging/log_format.py +++ b/pocketutils/logging/log_format.py @@ -7,15 +7,16 @@ class LogFormatBuilder: """ Builder for those of us who hate the Python logging Formatter syntax and can't remember the options. - Example usage: - formatter = ( - LoggingFormatterBuilder() - .level_name_fixed_width() - .asc_time() - .thread_name(left=' [', right=':') - .line_num(left='', right=']') - .message(left=': ') - ).build() + + Example: + >>> formatter = ( + >>> LogFormatBuilder() + >>> .level_name_fixed_width() + >>> .asc_time() + >>> .thread_name(left=' [', right=':') + >>> .line_num(left='', right=']') + >>> .message(left=': ') + >>> ).build() """ _s = None @@ -79,14 +80,12 @@ def build(self) -> logging.Formatter: class PrettyRecordFactory: """ - A `logging` formatter + A ``logging`` formatter Makes beautiful aligned log output. - To create: - ``` + Example: logger = logging.getLogger('myproject') log_factory = KaleRecordFactory(7, 13, 5).modifying(logger) - ``` For example: [20191228:14:20:06] kale⟩ datasets :77 INFO | Downloading QC-DR... @@ -142,11 +141,15 @@ def time_format(self) -> str: def formatter(self) -> logging.Formatter: return logging.Formatter(self.format, self.time_format) - def modifying(self, ell): + def modifying(self, ell) -> PrettyRecordFactory: """ Set the log factory of a logger to this, and set all of its (current) handlers to use it. - :param ell: A logger (ex logging.getLogger('')) - :return: This instance + + Args: + ell: A logger (ex logging.getLogger('')) + + Returns: + This instance """ logging.setLogRecordFactory(self.factory) for handler in ell.handlers: diff --git a/pocketutils/logging/warning_utils.py b/pocketutils/logging/warning_utils.py index 81db740..bee4f6b 100644 --- a/pocketutils/logging/warning_utils.py +++ b/pocketutils/logging/warning_utils.py @@ -9,12 +9,11 @@ class GlobalWarningUtils: """ Convenient API to add warning filters. Also provides ``init``, which sets a less-verbose warning formatter. - Ex: - ``` - GlobalWarningUtils.init()\ + + Example: + >>> GlobalWarningUtils.init()\ .filter_common_numeric()\ .substring_once('Number of features differ') - ``` """ def __init__(self): @@ -56,7 +55,9 @@ def substring_once(cls, substring: str): def filter_common_numeric(cls): """ Adds filters for common unavoidable warnings from numpy, pandas, scikit-learn, etc. - :return: self + + Returns: + self """ return ( cls.substring_never("libuv only supports millisecond timer resolution") diff --git a/pocketutils/misc/fancy_console.py b/pocketutils/misc/fancy_console.py index 855c45a..0c136f4 100644 --- a/pocketutils/misc/fancy_console.py +++ b/pocketutils/misc/fancy_console.py @@ -33,9 +33,9 @@ def __init__( ): """ Constructs a new environment for colored console messages. - :param color_map: A map from level to colors in colorama to override ColorMessages.DEFAULT_COLOR_MAP - :param log_fn: If set, additionally logs every message with this function - :param kwargs: Arguments 'top', 'bottom', 'sides', and 'line_length' + color_map: A map from level to colors in colorama to override ColorMessages.DEFAULT_COLOR_MAP + log_fn: If set, additionally logs every message with this function + kwargs: Arguments 'top', 'bottom', 'sides', and 'line_length' """ colorama.init(autoreset=True) _cmap = ColorMessages.default_color_map() diff --git a/pocketutils/notebooks/j.py b/pocketutils/notebooks/j.py index 40c5f9f..9e8371d 100644 --- a/pocketutils/notebooks/j.py +++ b/pocketutils/notebooks/j.py @@ -85,9 +85,11 @@ def html(cls, text: str) -> None: def styled(cls, text: str, *main, **css: str) -> None: """ Display a span element styled with free CSS arguments. - :param text: The text to include in an HTML span - :param main: Any free text of CSS, or a list of parameters - :param css: Any free dict of CSS style paramters; spaces and underscores in the keys will be replaced with hypens + + Args: + text: The text to include in an HTML span + main: Any free text of CSS, or a list of parameters + css: Any free dict of CSS style parameters; spaces and underscores in the keys will be replaced with hypens """ main = ";".join(main) css = ";".join( @@ -121,8 +123,8 @@ def one(cls, name: str) -> None: def mine(cls) -> None: """ Shows all typefaces currently in the matplotlib rcParams. - Each typeface is renderered as itself. Ex; will show Helvetica in Helvetica. - Each font family (`plt.rcParams['font.family']`) is shown separately, with all its fonts underneath. + Each typeface is rendered as itself. Ex; will show Helvetica in Helvetica. + Each font family (``plt.rcParams['font.family']``) is shown separately, with all its fonts underneath. """ import matplotlib.pyplot as plt @@ -147,7 +149,9 @@ def every(cls, n_cols: int = 4) -> None: Shows an HTML table of all typefaces rendered as themselves. Ex; will show Helvetica in Helvetica. Displays as an HTML table with `n_cols`. Thanks to http://jonathansoma.com/lede/data-studio/matplotlib/list-all-fonts-available-in-matplotlib-plus-samples/. - :param n_cols: + + Args: + n_cols: Number of columns in the created HTML table """ from matplotlib.font_manager import fontManager diff --git a/pocketutils/notebooks/magic_template.py b/pocketutils/notebooks/magic_template.py index 99c1c57..209df06 100644 --- a/pocketutils/notebooks/magic_template.py +++ b/pocketutils/notebooks/magic_template.py @@ -2,8 +2,8 @@ import logging from datetime import datetime -from pathlib import Path, PurePath -from typing import Any, Callable, Generic, Mapping, Optional, Type, TypeVar, Union +from pathlib import Path +from typing import Any, Callable, Optional, Union from pocketutils.core import LazyWrap, PathLike diff --git a/pocketutils/plotting/bound_ticks.py b/pocketutils/plotting/bound_ticks.py index 23e95bd..ae54d69 100644 --- a/pocketutils/plotting/bound_ticks.py +++ b/pocketutils/plotting/bound_ticks.py @@ -16,10 +16,13 @@ def __init__( ceiling: Optional[float] = None, rounding_digits: Optional[float] = None, ) -> None: - """Calculates new bounds for an axis based on the ticks. - :param floor: If None, sets the minimum bound based on the data - :param ceiling: If None, sets the maximum bound based on the data - :param rounding_digits: Minor argument that rounds the final bounds to some number of digits + """ + Calculates new bounds for an axis based on the ticks. + + Args: + floor: If None, sets the minimum bound based on the data + ceiling: If None, sets the maximum bound based on the data + rounding_digits: Minor argument that rounds the final bounds to some number of digits """ self.rounding_digits = rounding_digits self.floor = floor @@ -33,7 +36,7 @@ def __str__(self) -> str: def adjusted(self, ticks: np.array, bottom: float, top: float) -> typing.Tuple[float, float]: if len(ticks) < 2: - return (bottom, top) + return bottom, top floor = ticks[0] if self.floor is None else self.floor ceiling = ticks[-1] if self.ceiling is None else self.ceiling return ( @@ -48,11 +51,17 @@ class TickBounder: Pass AxisTicks as the x_ticks and y_ticks constructor arguments to perform this. This example will bound maximum width and height of the Axes to the smallest tick that fits the data, - and will set the minimum width and height to 0: + and will set the minimum width and height to 0. + + Example: + For example:: + ticker = TickBounder(x_ticks = AxisTicks(floor=0), y_ticks = AxisTicks(floor=0)) ticker.adjust(ax) - You can see the proposed new bound without changing the Axes using: - ticker.adjusted(ax) # returns a ((x0, x1), (y0, y1)) tuple + + You can see the proposed new bound without changing the Axes using:: + + ticker.adjusted(ax) # returns a ((x0, x1), (y0, y1)) tuple """ def __init__( diff --git a/pocketutils/tools/base_tools.py b/pocketutils/tools/base_tools.py index 7ede069..4398645 100644 --- a/pocketutils/tools/base_tools.py +++ b/pocketutils/tools/base_tools.py @@ -49,12 +49,18 @@ def only( """ Returns either the SINGLE (ONLY) UNIQUE ITEM in the sequence or raises an exception. Each item must have __hash__ defined on it. - :param sequence: A list of any items (untyped) - :param condition: If nonnull, consider only those matching this condition - :param name: Just a name for the collection to use in an error message - :return: The first item the sequence. - :raises: LookupError If the sequence is empty - :raises: MultipleMatchesError If there is more than one unique item. + + Args: + sequence: A list of any items (untyped) + condition: If nonnull, consider only those matching this condition + name: Just a name for the collection to use in an error message + + Returns: + The first item the sequence. + + Raises: + LookupError If the sequence is empty + MultipleMatchesError If there is more than one unique item. """ def _only(sq): @@ -86,7 +92,15 @@ def _only(sq): def zip_strict(cls, *args: Iterable[Any]) -> Generator[Tuple[Any], None, None]: """ Same as zip(), but raises an IndexError if the lengths don't match. - :raises: LengthMismatchError + + Args: + args: Same as with ``zip`` + + Yields: + Tuples corresponding to the input items + + Raises: + LengthMismatchError: If the lengths of the input iterators don't match """ # we need to catch these cases before or they'll fail # in particular, 1 element would fail with a LengthMismatchError @@ -120,9 +134,17 @@ def zip_strict(cls, *args: Iterable[Any]) -> Generator[Tuple[Any], None, None]: @classmethod def zip_list(cls, *args) -> List[Tuple[Any]]: """ - Same as `zip_strict`, but converts to a list and can provide a more detailed error message. + Same as ``zip_strict``, but converts to a list and can provide a more detailed error message. Zips two sequences into a list of tuples and raises an IndexError if the lengths don't match. - :raises: LengthMismatchError + + Args: + args: Same as with ``zip`` + + Yields: + Tuples corresponding to the input items + + Raises: + LengthMismatchError: If the lengths of the input iterators don't match """ try: return list(cls.zip_strict(*args)) @@ -145,7 +167,8 @@ def forever(cls) -> Iterator[int]: @classmethod def to_true_iterable(cls, s: Any) -> Iterable[Any]: """ - See BaseTools.is_true_iterable. + See ``BaseTools.is_true_iterable``. + Ex: - to_true_iterable('abc') # ['abc'] - to_true_iterable(['ab', 'cd')] # ['ab', 'cd'] @@ -188,18 +211,27 @@ def null_context(cls) -> Generator[None, None, None]: @classmethod def look(cls, obj: Y, attrs: Union[str, Iterable[str], Callable[[Y], Z]]) -> Optional[Z]: """ - Returns the value of a chain of attributes on object `obj`, + Returns the value of a chain of attributes on object ``obj``, or None any object in that chain is None or lacks the next attribute. - For example:: - CommonTools.look(kitten), 'breed.name') # either None or a string - :param obj: Any object - :param attrs: One of: - - A string in the form attr1.attr2, translating to `obj.attr1` + + Example: + Get a kitten's breed:: + + BaseTools.look(kitten), 'breed.name') # either None or a string + + Args: + obj: Any object + attrs: One of: + - A string in the form attr1.attr2, translating to ``obj.attr1`` - An iterable of strings of the attributes - - A function that maps `obj` to its output; - equivalent to calling `attrs(obj)` but returning None on `AttributeError`. - :return: Either None or the type of the attribute - :raises: TypeError + - A function that maps ``obj`` to its output; + equivalent to calling `attrs(obj)` but returning None on ``AttributeError``. + + Returns: + Either None or the type of the attribute + + Raises: + TypeError: """ return _look(obj, attrs) @@ -216,7 +248,9 @@ def get_log_function( - If another str or int, try using that logger level (raises an error if invalid) - If callable, returns it - If it has a callable method called 'write', uses that - :return: A function of the log message that returns None + + Returns: + A function of the log message that returns None """ if log is None: return logger.info @@ -243,6 +277,3 @@ def __str__(self): __all__ = ["BaseTools"] - -if __name__ == "__main__": - print(list(BaseTools.zip_strict([1], [3, 4]))) diff --git a/pocketutils/tools/call_tools.py b/pocketutils/tools/call_tools.py index 3e5ab98..29c2d2d 100644 --- a/pocketutils/tools/call_tools.py +++ b/pocketutils/tools/call_tools.py @@ -42,8 +42,8 @@ def silenced( def call_cmd(cls, *cmd: str, **kwargs) -> subprocess.CompletedProcess: """ Calls subprocess.run with capture_output=True, and logs a debug statement with the command beforehand. - :param cmd: A sequence to call - :param kwargs: Passed to subprocess.run + cmd: A sequence to call + kwargs: Passed to subprocess.run """ logger.debug("Calling '{}'".format(" ".join(cmd))) return subprocess.run(*[str(c) for c in cmd], capture_output=True, check=True, **kwargs) @@ -53,7 +53,7 @@ def call_cmd_utf( cls, *cmd: str, log_fn: Callable[[str], None] = logger.error, **kwargs ) -> subprocess.CompletedProcess: """ - Like `call_cmd`, but sets `text=True` and `encoding=utf8`, + Like ``call_cmd``, but sets ``text=True`` and ``encoding=utf8``, and strips stdout and stderr of start/end whitespace before returning. Can also log formatted stdout and stderr on failure. Otherwise, logs the output, unformatted and unstripped, as TRACE @@ -87,9 +87,11 @@ def log_called_process_error( ) -> None: """ Outputs some formatted text describing the error with its full stdout and stderr. - :param e: The error - :param log_fn: For example, `logger.warning` - :param wrap_length: The max number of characters of the header and footer around the stdout and stderr + + Args: + e: The error + log_fn: For example, `logger.warning` + wrap_length: The max number of characters of the header and footer around the stdout and stderr The output text is wrapped to this value - 4 The full line can be longer than this because the text of the command is not wrapped """ @@ -127,8 +129,12 @@ def stream_cmd_call( """ Processes stdout and stderr on separate threads, streamed -- can avoid filling a stdout or stderr buffer. Calls an external command, waits, and throws a ExternalCommandFailed for nonzero exit codes. - Returns (stdout, stderr). - :raises ExternalCommandError + + Returns: + (stdout, stderr) + + Raises: + ExternalCommandError: """ if log_callback is None: log_callback = cls._smart_log_callback diff --git a/pocketutils/tools/common_tools.py b/pocketutils/tools/common_tools.py index 08d3c21..876732d 100644 --- a/pocketutils/tools/common_tools.py +++ b/pocketutils/tools/common_tools.py @@ -40,10 +40,11 @@ def try_none( ) -> Optional[T]: """ Returns the value of a function or None if it raised an exception. - :param function: Try calling this function - :param fail_val: Return this value - :param exception: Restrict caught exceptions to subclasses of this type - :return: + + Args: + function: Try calling this function + fail_val: Return this value + exception: Restrict caught exceptions to subclasses of this type """ try: return function() @@ -58,7 +59,7 @@ def succeeds(cls, function: Callable[[], Any], exception=Exception) -> bool: @classmethod def or_null(cls, x: Any, dtype=lambda s: s, or_else: Any = None) -> Optional[Any]: """ - Return `None` if the operation `dtype` on `x` failed; returns the result otherwise. + Return ``None`` if the operation ``dtype`` on ``x`` failed; returns the result otherwise. """ return or_else if cls.is_null(x) else dtype(x) @@ -70,7 +71,7 @@ def or_raise( or_else: Union[None, BaseException, Type[BaseException]] = None, ) -> Any: """ - Returns `dtype(x)` if `x` is not None, or raises `or_else`. + Returns ``dtype(x)`` if ``x`` is not None, or raises ``or_else``. """ if or_else is None: or_else = LookupError("Value is {}".format(x)) @@ -83,10 +84,12 @@ def or_raise( @classmethod def iterator_has_elements(cls, x: Iterator[Any]) -> bool: """ - Returns False `next(x)` raises a `StopIteration`. - WARNING: Tries to call `next(x)`, progressing iterators. Don't use `x` after calling this. - Note that calling `iterator_has_elements([5])` will raise a `TypeError` - :param x: Must be an Iterator + Returns False iff ``next(x)`` raises a ``StopIteration``. + WARNING: Tries to call ``next(x)``, progressing iterators. Don't use ``x`` after calling this. + Note that calling ``iterator_has_elements([5])`` will raise a `TypeError` + + Args: + x: Must be an Iterator """ return cls.succeeds(lambda: next(x), StopIteration) @@ -111,8 +114,10 @@ def is_empty(cls, x: Any) -> bool: - x is None - np.is_nan(x) - x is something with 0 length - - x is iterable and has 0 elements (will call `__iter__`) - :raises RefusingRequestError If `x` is an Iterator. Calling this would empty the iterator, which is dangerous. + - x is iterable and has 0 elements (will call ``__iter__``) + + Raises: + RefusingRequestError If ``x`` is an Iterator. Calling this would empty the iterator, which is dangerous. """ if isinstance(x, Iterator): raise RefusingRequestError("Do not call is_empty on an iterator.") @@ -134,10 +139,12 @@ def is_probable_null(cls, x: Any) -> bool: - x is None - np.is_nan(x) - x is something with 0 length - - x is iterable and has 0 elements (will call `__iter__`) + - x is iterable and has 0 elements (will call ``__iter__``) - a str(x) is 'nan', 'null', or 'none'; case-insensitive In contrast to is_nan, also returns True if x==''. - :raises TypeError If `x` is an Iterator. Calling this would empty the iterator, which is dangerous. + + Raises: + TypeError If ``x`` is an Iterator. Calling this would empty the iterator, which is dangerous. """ return cls.is_empty(x) or str(x).lower() in ["nan", "null", "none"] @@ -145,8 +152,12 @@ def is_probable_null(cls, x: Any) -> bool: def unique(cls, sequence: Iterable[T]) -> Sequence[T]: """ Returns the unique items in `sequence`, in the order they appear in the iteration. - :param sequence: Any once-iterable sequence - :return: An ordered List of unique elements + + Args: + sequence: Any once-iterable sequence + + Returns: + An ordered List of unique elements """ seen = set() return [x for x in sequence if not (x in seen or seen.add(x))] @@ -154,15 +165,20 @@ def unique(cls, sequence: Iterable[T]) -> Sequence[T]: @classmethod def first(cls, collection: Iterable[Any], attr: Optional[str] = None) -> Optional[Any]: """ + Gets the first element. + + WARNING: Tries to call ``next(x)``, progressing iterators. + + Args: + collection: Any iterable + attr: The name of the attribute that might be defined on the elements, + or None to indicate the elements themselves should be used + Returns: - - The attribute of the first element if `attr` is defined on an element + - The attribute of the first element if ``attr`` is defined on an element - None if the the sequence is empty - - None if the sequence has no attribute `attr` - WARNING: Tries to call `next(x)`, progressing iterators. - :param collection: Any iterable - :param attr: The name of the attribute that might be defined on the elements, - or None to indicate the elements themselves should be used - :return: The first element, or None + - None if the sequence has no attribute ``attr`` + """ try: # note: calling iter on an iterator creates a view only @@ -174,10 +190,11 @@ def first(cls, collection: Iterable[Any], attr: Optional[str] = None) -> Optiona @classmethod def iter_rowcol(cls, n_rows: int, n_cols: int) -> Generator[Tuple[int, int], None, None]: """ - An iterator over (row column) pairs for a row-first traversal of a grid with `n_cols` columns. - Ex: - it = CommonTools.iter_rc(5, 3) - [next(it) for _ in range(5)] # [(0,0),(0,1),(0,2),(1,0),(1,1)] + An iterator over (row column) pairs for a row-first traversal of a grid with ``n_cols`` columns. + + Example: + >>> it = CommonTools.iter_rowcol(5, 3) + >>> [next(it) for _ in range(5)] # [(0,0),(0,1),(0,2),(1,0),(1,1)] """ for i in range(n_rows * n_cols): yield i // n_cols, i % n_cols @@ -190,10 +207,12 @@ def multidict( skip_none: bool = False, ) -> Mapping[Y, Sequence[Z]]: """ - Builds a mapping of some attribute in `sequence` to the containing elements of `sequence`. - :param sequence: Any iterable - :param key_attr: Usually string like 'attr1.attr2'; see `look` - :param skip_none: If None, raises a `KeyError` if the key is missing for any item; otherwise, skips it + Builds a mapping of some attribute in `sequence` to the containing elements of ``sequence``. + + Args: + sequence: Any iterable + key_attr: Usually string like 'attr1.attr2'; see `look` + skip_none: If None, raises a `KeyError` if the key is missing for any item; otherwise, skips it """ dct = defaultdict(lambda: []) for item in sequence: @@ -208,8 +227,12 @@ def multidict( def mem_size(cls, obj) -> str: """ Returns the size of the object in memory as a human-readable string. - :param obj: Any Python object - :return: A human-readable size with units + + Args: + obj: Any Python object + + Returns: + A human-readable size with units """ return nicesize(sys.getsizeof(obj)) @@ -217,11 +240,10 @@ def mem_size(cls, obj) -> str: def devnull(cls): """ Yields a 'writer' that does nothing. - Ex: - ``` - with Tools.devnull() as devnull: - devnull.write('hello') - ``` + + Example: + >>> with CommonTools.devnull() as devnull: + >>> devnull.write('hello') """ yield DevNull() @@ -229,7 +251,9 @@ def devnull(cls): def parse_bool(cls, s: str) -> bool: """ Parses a 'true'/'false' string to a bool, ignoring case. - :raises: XValueError If neither true nor false + + Raises: + ValueError: If neither true nor false """ if isinstance(s, bool): return s diff --git a/pocketutils/tools/console_tools.py b/pocketutils/tools/console_tools.py index 57b7ed6..d2c2a93 100644 --- a/pocketutils/tools/console_tools.py +++ b/pocketutils/tools/console_tools.py @@ -54,10 +54,12 @@ def confirm( ) -> bool: """ Asks for a confirmation from the user using the bulletin input(). - :param msg: If None defaults to 'Confirm? [yes/no]' - :param input_fn: Function to get the user input (its argument is always '') - :param writer: Print using this function (should not print a newline by default) - :return: True if the user answered 'yes'; False otherwise + msg: If None defaults to 'Confirm? [yes/no]' + input_fn: Function to get the user input (its argument is always '') + writer: Print using this function (should not print a newline by default) + + Returns: + True if the user answered 'yes'; False otherwise """ if msg is None: msg = "Confirm? [yes/no]" @@ -81,8 +83,8 @@ def clear_line(cls, n: int = 1, writer: Callable[[str], None] = sys.stdout.write """ Writes control characters to stdout to delete the previous line and move the curser up. This only works in a shell. - :param n: The number of lines to erase - :param writer Write here + n: The number of lines to erase + writer Write here """ for _ in range(n): writer(ConsoleTools.CURSOR_UP_ONE) diff --git a/pocketutils/tools/filesys_tools.py b/pocketutils/tools/filesys_tools.py index 1e3e6b5..7645453 100644 --- a/pocketutils/tools/filesys_tools.py +++ b/pocketutils/tools/filesys_tools.py @@ -108,8 +108,12 @@ def get_env_info(cls, extras: Optional[Mapping[str, Any]] = None) -> Mapping[str def delete_surefire(cls, path: PathLike) -> Optional[Exception]: """ Deletes files or directories cross-platform, but working around multiple issues in Windows. - :return Returns None, or an Exception for minor warnings - :raises IOError If it can't delete + + Returns: + None, or an Exception for minor warnings + + Raises: + IOError: If it can't delete """ # we need this because of Windows path = str(path) @@ -169,8 +173,12 @@ def read_properties_file(cls, path: PathLike) -> Mapping[str, str]: Reads a .properties file, which is a list of lines with key=value pairs (with an equals sign). Lines beginning with # are ignored. Each line must contain exactly 1 equals sign. - :param path: Read the file at this local path - :return: A dict mapping keys to values, both with surrounding whitespace stripped + + Args: + path: Read the file at this local path + + Returns: + A dict mapping keys to values, both with surrounding whitespace stripped """ dct = {} with FilesysTools.open_file(path, "r") as f: @@ -263,8 +271,6 @@ def read_any( Reads a variety of simple formats based on filename extension, including '.txt', 'csv', .xml', '.properties', '.json'. Also reads '.data' (binary), '.lines' (text lines). And formatted lists: '.strings', '.floats', and '.ints' (ex: "[1, 2, 3]"). - :param path: - :return: """ path = Path(path) ext = path.suffix.lstrip(".") @@ -341,8 +347,6 @@ def open_file(cls, path: PathLike, mode: str): Note that the default encoding on open() is not UTF on Windows. Raises specific informative errors. Cannot set overwrite in append mode. - :param path: - :param mode: See `OpenMode` """ path = Path(path) mode = OpenMode(mode) @@ -363,9 +367,13 @@ def write_lines(cls, iterable: Iterable[Any], path: PathLike, mode: str = "w") - Just writes an iterable line-by-line to a file, using '\n'. Makes the parent directory if needed. Checks that the iterable is a "true iterable" (not a string or bytes). - :return The number of lines written (the same as len(iterable) if iterable has a length) - :raises FileExistsError If the path exists and append is False - :raises PathIsNotFileError If append is True, and the path exists but is not a file + + Returns: + The number of lines written (the same as len(iterable) if iterable has a length) + + Raises: + FileExistsError: If the path exists and append is False + PathIsNotFileError: If append is True, and the path exists but is not a file """ path = Path(path) mode = OpenMode(mode) @@ -392,7 +400,7 @@ def sha256(cls, x: SupportsBytes) -> str: @classmethod def hash_hex(cls, x: SupportsBytes, algorithm: str) -> str: """ - Return the hex-encoded hash of the object (converted to bytes). + Returns the hex-encoded hash of the object (converted to bytes). """ m = hashlib.new(algorithm) m.update(bytes(x)) @@ -428,10 +436,6 @@ def tmpfile( ) -> Generator[Writeable, None, None]: """ Simple wrapper around tempfile.TemporaryFile, tempfile.NamedTemporaryFile, and tempfile.SpooledTemporaryFile. - :param path: - :param spooled: - :param kwargs: - :return: """ if spooled: with tempfile.SpooledTemporaryFile(**kwargs) as x: diff --git a/pocketutils/tools/numeric_tools.py b/pocketutils/tools/numeric_tools.py index c44ffdd..ba30a5b 100644 --- a/pocketutils/tools/numeric_tools.py +++ b/pocketutils/tools/numeric_tools.py @@ -36,8 +36,10 @@ def iround(cls, f: Optional[SupportsInt]) -> int: def iceil(cls, f: SupportsFloat) -> int: """ Fixes np.ceil to return an Python integer rather than a Numpy float. - :param f: A Python or Numpy float, or something else that defines __float__ - :return: An integer of the ceiling + f: A Python or Numpy float, or something else that defines __float__ + + Returns: + An integer of the ceiling """ # noinspection PyTypeChecker return int(np.ceil(f)) @@ -46,8 +48,10 @@ def iceil(cls, f: SupportsFloat) -> int: def ifloor(cls, f: SupportsFloat) -> int: """ Fixes np.floor to return an Python integer rather than a Numpy float. - :param f: A Python or Numpy float, or something else that defines __float__ - :return: An integer of the ceiling + f: A Python or Numpy float, or something else that defines __float__ + + Returns: + An integer of the ceiling """ # noinspection PyTypeChecker return int(np.floor(f)) diff --git a/pocketutils/tools/pandas_tools.py b/pocketutils/tools/pandas_tools.py index b47a402..63ebc64 100644 --- a/pocketutils/tools/pandas_tools.py +++ b/pocketutils/tools/pandas_tools.py @@ -15,7 +15,9 @@ class PandasTools(BaseTools): def cfirst(cls, df: pd.DataFrame, cols: Union[str, int, Sequence[str]]) -> pd.DataFrame: """ Moves some columns of a Pandas dataframe to the front, returning a copy. - Returns: a copy of the dataframe with col_seq as the first columns + + Returns: + A copy of the dataframe with col_seq as the first columns """ if isinstance(cols, str) or isinstance(cols, int): cols = [cols] diff --git a/pocketutils/tools/path_tools.py b/pocketutils/tools/path_tools.py index 0dda109..62a412a 100644 --- a/pocketutils/tools/path_tools.py +++ b/pocketutils/tools/path_tools.py @@ -12,10 +12,11 @@ class PathTools(BaseTools): @classmethod def updir(cls, n: int, *parts) -> Path: """ - Get an absolute path `n` parents from `os.getcwd()`. - Ex: In dir '/home/john/dir_a/dir_b': - `updir(2, 'dir1', 'dir2') # returns Path('/home/john/dir1/dir2')` + Get an absolute path ``n`` parents from ``os.getcwd()``. Does not sanitize. + + Ex: In dir '/home/john/dir_a/dir_b': + updir(2, 'dir1', 'dir2') # returns Path('/home/john/dir1/dir2') """ base = Path(os.getcwd()) for _ in range(n): @@ -86,10 +87,6 @@ def sanitize_path( Platform-dependent. A corner case is drive letters in Linux: "C:\\Users\\john" is converted to '/C:/users/john' if os.name=='posix' - :param path: - :param is_file: - :param show_warnings: - :return: """ # the idea is to sanitize for both Windows and Posix, regardless of the platform in use # the sanitization should be as uniform as possible for both platforms @@ -150,11 +147,15 @@ def sanitize_path_node( The behavior is platform-independent -- os, sys, and pathlib are not used. For ex, calling sanitize_path_node(r'C:\') returns r'C:\' on both Windows and Linux If you want to sanitize a whole path, see sanitize_path instead. - :param bit: The node - :param is_file: False for directories, True otherwise, None if unknown - :param is_root_or_drive: True if known to be the root ('/') or a drive ('C:\'), None if unknown - :param include_fat: Also make compatible with FAT filesystems - :return: A string + + Args: + bit: The node + is_file: False for directories, True otherwise, None if unknown + is_root_or_drive: True if known to be the root ('/') or a drive ('C:\'), None if unknown + include_fat: Also make compatible with FAT filesystems + + Returns: + A string """ # since is_file and is_root_or_drive are both Optional[bool], let's be explicit and use 'is' for clarity if is_file is True and is_root_or_drive is True: diff --git a/pocketutils/tools/program_tools.py b/pocketutils/tools/program_tools.py index 7ddfd62..89c39c4 100644 --- a/pocketutils/tools/program_tools.py +++ b/pocketutils/tools/program_tools.py @@ -38,10 +38,16 @@ def commit_hash(cls, git_repo_dir: str = ".") -> str: @classmethod def git_description(cls, git_repo_dir: PathLike = ".") -> GitDescription: """ - Runs `git describe` and parses the output. - :param git_repo_dir: Path to the repository - :return: A `GitDescription` instance, with fields text, tag, commits, hash, is_dirty, and is_broken - :raises: CalledProcessError + Runs ``git describe`` and parses the output. + + Args: + git_repo_dir: Path to the repository + + Returns: + A ``GitDescription`` instance, with fields text, tag, commits, hash, is_dirty, and is_broken + + Raises: + CalledProcessError: """ x = subprocess.run( "git describe --long --dirty --broken --abbrev=40 --tags".split(" "), diff --git a/pocketutils/tools/string_tools.py b/pocketutils/tools/string_tools.py index e8837a9..9b65c9f 100644 --- a/pocketutils/tools/string_tools.py +++ b/pocketutils/tools/string_tools.py @@ -57,14 +57,18 @@ def strip_empty_decimal(cls, num: Union[float, str]) -> str: @classmethod def truncate(cls, s: Optional[str], n: int, always_dots: bool = False) -> Optional[str]: """ - Returns a string if it has `n` or fewer characters; - otherwise truncates to length `n-1` and appends `…` (UTF character). - If `s` is None and `always_dots` is True, returns `n` copies of `.` (as a string). - If `s` is None otherwise, returns None. - :param s: The string - :param n: The maximum length, inclusive - :param always_dots: Use dots instead of returning None; see above - :return: A string or None + Returns a string if it has ``n`` or fewer characters; + otherwise truncates to length ``n-1`` and appends ``…`` (UTF character). + If ``s`` is None and ``always_dots`` is True, returns ``n`` copies of ``.`` (as a string). + If ``s`` is None otherwise, returns None. + + Args: + s: The string + n: The maximum length, inclusive + always_dots: Use dots instead of returning None; see above + + Returns: + A string or None """ if s is None and always_dots: return "…" * n @@ -131,7 +135,7 @@ def longest_str(cls, parts: Iterable[str]) -> str: def strip_off_start(cls, s: str, pre: str): """ Strips the full string `pre` from the start of `str`. - See `Tools.strip_off` for more info. + See ``Tools.strip_off`` for more info. """ assert isinstance(pre, str), "{} is not a string".format(pre) if s.startswith(pre): @@ -161,7 +165,7 @@ def strip_off(cls, s: str, prefix_or_suffix: str) -> str: @classmethod def strip_ends(cls, s: str, prefix: str, suffix: str) -> str: """ - Strip a substring from the start, and another substring from the end, of a string (at most 1 occurrence each). + Strips a substring from the start, and another substring from the end, of a string (at most 1 occurrence each). """ return StringTools.strip_off_start(StringTools.strip_off_end(s, suffix), prefix) @@ -196,8 +200,8 @@ def strip_any_ends( @classmethod def strip_brackets(cls, text: str) -> str: """ - Strip any and all pairs of brackets from start and end of a string, but only if they're paired. - See `strip_paired` + Strips any and all pairs of brackets from start and end of a string, but only if they're paired. + See ``strip_paired`` """ pieces = [ ("(", ")"), @@ -217,8 +221,8 @@ def strip_brackets(cls, text: str) -> str: @classmethod def strip_quotes(cls, text: str) -> str: """ - Strip any and all pairs of quotes from start and end of a string, but only if they're paired. - See `strip_paired` + Strips any and all pairs of quotes from start and end of a string, but only if they're paired. + See ``strip_paired`` """ pieces = [ ("`", "`"), @@ -232,8 +236,8 @@ def strip_quotes(cls, text: str) -> str: @classmethod def strip_brackets_and_quotes(cls, text: str) -> str: """ - Strip any and all pairs of brackets and quotes from start and end of a string, but only if they're paired. - See `strip_paired` + Strips any and all pairs of brackets and quotes from start and end of a string, but only if they're paired. + See ``strip_paired`` """ pieces = [ ("(", ")"), @@ -258,11 +262,12 @@ def strip_brackets_and_quotes(cls, text: str) -> str: @classmethod def strip_paired(cls, text: str, pieces: Iterable[Tuple[str, str]]) -> str: """ - Strip pairs of (start, end) from the ends of strings. For example: - ``` - Tools.strip_paired('[(abc]', ['()', '[]']) # returns '(abc' - Also see `strip_brackets` - ``` + Strips pairs of (start, end) from the ends of strings. + + Example: + >>> StringTools.strip_paired('[(abc]', ['()', '[]']) # returns '(abc' + + Also see ``strip_brackets`` """ if any([a for a in pieces if len(a) != 2]): raise ValueError( @@ -399,10 +404,12 @@ def pretty_function( NOTE 1: If function is None, returns '⌀' NOTE 2: If function does not have __name__, returns prefix + type(function) +
+ suffix NOTE 3: If it's a primitive, returns str(function) - :param function: Can be anything, but especially useful for functions - :param with_address: Include `@ hex-mem-addr` in the name - :param prefix: Prefix to the whole string - :param suffix: Suffix to the whole string + + Args: + function: Can be anything, but especially useful for functions + with_address: Include `@ hex-mem-addr` in the name + prefix: Prefix to the whole string + suffix: Suffix to the whole string """ if function is None: return Chars.null @@ -506,12 +513,14 @@ def join( - StringTools.join([1,2,3]) # "1 2 3" - StringTools.join(cars, sep=',', attr='make', prefix="(", suffix=")")` # "(Ford),(Ford),(BMW)" - :param seq: Sequence of elements - :param sep: Delimiter - :param attr: Get this attribute from each element (in `seq`), or use the element itself if None - :param prefix: Prefix before each item - :param suffix: Suffix after each item - :return: A string + seq: Sequence of elements + sep: Delimiter + attr: Get this attribute from each element (in `seq`), or use the element itself if None + prefix: Prefix before each item + suffix: Suffix after each item + + Returns: + A string """ if attr is None: return sep.join([prefix + str(s) + suffix for s in seq]) @@ -525,12 +534,15 @@ def join_kv( """ Joins dict elements into a str like 'a=1, b=2, c=3`. Won't break with ValueError if the keys or values aren't strs. - :param seq: Dict-like, with `items()` - :param sep: Delimiter - :param eq: Separates a key with its value - :param prefix: Prepend before every key - :param suffix: Append after every value - :return: A string + + Args: + seq: Dict-like, with ``items()`` + eq: Separates a key with its value + prefix: Prepend before every key + suffix: Append after every value + + Returns: + A string """ return sep.join([prefix + str(k) + eq + str(v) + suffix for k, v in seq.items()]) diff --git a/pocketutils/tools/unit_tools.py b/pocketutils/tools/unit_tools.py index 8318b00..8fc7b9b 100644 --- a/pocketutils/tools/unit_tools.py +++ b/pocketutils/tools/unit_tools.py @@ -18,10 +18,12 @@ def delta_time_to_str(cls, delta_sec: float, space: str = "") -> str: Returns a pretty string from a difference in time in seconds. Rounds hours and minutes to 2 decimal places, and seconds to 1. Ex: delta_time_to_str(313) == 5.22min - :param delta_sec: The time in seconds - :param space: Space char between digits and units; + delta_sec: The time in seconds + space: Space char between digits and units; good choices are empty, ASCII space, Chars.narrownbsp, Chars.thinspace, and Chars.nbsp. - :return: A string with units 'hr', 'min', or 's' + + Returns: + A string with units 'hr', 'min', or 's' """ if abs(delta_sec) > 60 * 60 * 3: return ( @@ -41,10 +43,14 @@ def ms_to_minsec(cls, ms: int, space: str = "") -> str: - 10:15:33 if < 1 day - 5d:10:15:33 if > 1 day Prepends a minus sign (−) if negative. - :param ms: The milliseconds - :param space: Space char between digits and 'ms' or 'd' for day (if used); - good choices are empty, ASCII space, Chars.narrownbsp, Chars.thinspace, and Chars.nbsp. - :return: A string of one of the formats above + + Args: + ms: The milliseconds + space: Space char between digits and 'ms' or 'd' for day (if used); + good choices are empty, ASCII space, Chars.narrownbsp, Chars.thinspace, and Chars.nbsp. + + Returns: + A string of one of the formats above """ is_neg = ms < 0 ms = abs(int(ms)) @@ -76,9 +82,13 @@ def friendly_size(cls, n_bytes: int) -> str: def round_to_sigfigs(cls, num: SupportsFloat, sig_figs: int) -> int: """ Round to specified number of sigfigs. - :param num: A Python or Numpy float or something that supports __float__ - :param sig_figs: The number of significant figures, non-negative - :return: A Python integer + + Args: + num: A Python or Numpy float or something that supports __float__ + sig_figs: The number of significant figures, non-negative + + Returns: + A Python integer """ if sig_figs < 0: raise OutOfRangeError("sig_figs {} is negative".format(sig_figs), minimum=0) @@ -100,13 +110,17 @@ def nice_dose( """ Returns a dose with units, with the units scaled as needed. Can handle millimolar, micromolar, nanomolar, and picomolar. - :param use_sigfigs: If True, rounds to a number of significant figures; otherwise round to decimal places - :param micromolar_dose: The dose in micromolar - :param n_sigfigs: For rounding; no rounding if None - :param adjust_units: If False, will always use micromolar - :param space: Space char between digits and units; + + Args: + use_sigfigs: If True, rounds to a number of significant figures; otherwise round to decimal places + micromolar_dose: The dose in micromolar + n_sigfigs: For rounding; no rounding if None + adjust_units: If False, will always use micromolar + space: Space char between digits and units; good choices are empty, ASCII space, Chars.narrownbsp, Chars.thinspace, and Chars.nbsp. - :return: The dose with a suffix of µM, mM, nM, or mM + + Returns: + The dose with a suffix of µM, mM, nM, or mM """ d = micromolar_dose m = abs(d) diff --git a/poetry.lock b/poetry.lock index acf3846..f7bdfb6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,36 +1,36 @@ [[package]] -category = "dev" -description = "A configurable sidebar-enabled Sphinx theme" name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" optional = false python-versions = "*" -version = "0.7.12" [[package]] -category = "dev" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = "*" -version = "1.4.4" [[package]] -category = "main" -description = "Disable App Nap on OS X 10.9" -marker = "sys_platform == \"darwin\"" name = "appnope" +version = "0.1.0" +description = "Disable App Nap on OS X 10.9" +category = "main" optional = true python-versions = "*" -version = "0.1.0" +marker = "sys_platform == \"darwin\"" [[package]] -category = "dev" -description = "An abstract syntax tree for Python with inference support." -marker = "python_version >= \"3\"" name = "astroid" +version = "2.4.2" +description = "An abstract syntax tree for Python with inference support." +category = "dev" optional = false python-versions = ">=3.5" -version = "2.4.2" +marker = "python_version >= \"3\"" [package.dependencies] lazy-object-proxy = ">=1.4.0,<1.5.0" @@ -38,25 +38,25 @@ six = ">=1.12,<2.0" wrapt = ">=1.11,<2.0" [package.dependencies.typed-ast] -python = "<3.8" version = ">=1.4.0,<1.5" +python = "<3.8" [[package]] -category = "main" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" +marker = "sys_platform == \"win32\"" [[package]] -category = "main" -description = "Classes Without Boilerplate" name = "attrs" +version = "20.1.0" +description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.1.0" [package.extras] dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] @@ -64,232 +64,141 @@ docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] [[package]] -category = "dev" -description = "Internationalization utilities" name = "babel" +version = "2.8.0" +description = "Internationalization utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" [package.dependencies] pytz = ">=2015.7" [[package]] -category = "main" -description = "Specifications for callback functions passed in to an API" name = "backcall" -optional = true -python-versions = "*" version = "0.2.0" - -[[package]] +description = "Specifications for callback functions passed in to an API" category = "main" -description = "Modern password hashing for your software and your servers" -name = "bcrypt" optional = true -python-versions = ">=3.6" -version = "3.2.0" - -[package.dependencies] -cffi = ">=1.1" -six = ">=1.4.1" - -[package.extras] -tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)"] -typecheck = ["mypy"] - -[[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"] +python-versions = "*" [[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" -optional = false -python-versions = "*" version = "2020.6.20" - -[[package]] +description = "Python package for providing Mozilla's CA Bundle." category = "main" -description = "Foreign Function Interface for Python calling C code." -name = "cffi" -optional = true +optional = false python-versions = "*" -version = "1.14.2" - -[package.dependencies] -pycparser = "*" [[package]] -category = "dev" -description = "Validate configuration and produce human readable error messages." name = "cfgv" +version = "3.2.0" +description = "Validate configuration and produce human readable error messages." +category = "dev" optional = false python-versions = ">=3.6.1" -version = "3.2.0" [[package]] -category = "main" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" -optional = false -python-versions = "*" version = "3.0.4" - -[[package]] -category = "dev" -description = "Composable command line interface toolkit" -name = "click" +description = "Universal encoding detector for Python 2 and 3" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "7.1.2" +python-versions = "*" [[package]] -category = "main" -description = "Cross-platform colored terminal text." name = "colorama" +version = "0.4.3" +description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" [[package]] -category = "main" -description = "Code coverage measurement for Python" name = "coverage" +version = "5.2.1" +description = "Code coverage measurement for Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.2.1" - -[package.dependencies] -[package.dependencies.toml] -optional = true -version = "*" [package.extras] toml = ["toml"] -[[package]] -category = "dev" -description = "Show coverage stats online via coveralls.io" -name = "coveralls" -optional = false -python-versions = ">= 3.5" -version = "2.1.2" - [package.dependencies] -coverage = ">=4.1,<6.0" -docopt = ">=0.6.1" -requests = ">=1.0.0" - -[package.extras] -yaml = ["PyYAML (>=3.10)"] - -[[package]] -category = "main" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -name = "cryptography" +[package.dependencies.toml] +version = "*" optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "3.0" - -[package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" -six = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -idna = ["idna (>=2.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] [[package]] -category = "main" -description = "Composable style cycles" name = "cycler" +version = "0.10.0" +description = "Composable style cycles" +category = "main" optional = true python-versions = "*" -version = "0.10.0" [package.dependencies] six = "*" [[package]] -category = "main" -description = "Decorators for Humans" name = "decorator" +version = "4.4.2" +description = "Decorators for Humans" +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.2" [[package]] -category = "main" -description = "serialize all of python" name = "dill" -optional = false -python-versions = ">=2.6, !=3.0.*" version = "0.3.2" +description = "serialize all of python" +category = "main" +optional = true +python-versions = ">=2.6, !=3.0.*" [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] -category = "dev" -description = "Distribution utilities" name = "distlib" +version = "0.3.1" +description = "Distribution utilities" +category = "dev" optional = false python-versions = "*" -version = "0.3.1" [[package]] -category = "main" -description = "Pythonic argument parser, that will make you smile" name = "docopt" -optional = false -python-versions = "*" version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "main" +optional = true +python-versions = "*" [[package]] -category = "dev" -description = "Docutils -- Python Documentation Utilities" name = "docutils" +version = "0.16" +description = "Docutils -- Python Documentation Utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.16" [[package]] -category = "dev" -description = "A platform independent file lock." name = "filelock" +version = "3.0.12" +description = "A platform independent file lock." +category = "dev" optional = false python-versions = "*" -version = "3.0.12" [[package]] -category = "dev" -description = "the modular source code checker: pep8 pyflakes and co" name = "flake8" +version = "3.8.3" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "3.8.3" [package.dependencies] mccabe = ">=0.6.0,<0.7.0" @@ -297,40 +206,40 @@ pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" [package.dependencies.importlib-metadata] -python = "<3.8" version = "*" +python = "<3.8" [[package]] -category = "dev" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." name = "flake8-bugbear" +version = "20.1.4" +description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." +category = "dev" optional = false python-versions = ">=3.6" -version = "20.1.4" [package.dependencies] attrs = ">=19.2.0" flake8 = ">=3.0.0" [[package]] -category = "dev" -description = "Extension for flake8 which uses pydocstyle to check docstrings" name = "flake8-docstrings" +version = "1.5.0" +description = "Extension for flake8 which uses pydocstyle to check docstrings" +category = "dev" optional = false python-versions = "*" -version = "1.5.0" [package.dependencies] flake8 = ">=3" pydocstyle = ">=2.1" [[package]] -category = "main" -description = "Python scripts to find enrichment of GO terms" name = "goatools" +version = "1.0.6" +description = "Python scripts to find enrichment of GO terms" +category = "main" optional = true python-versions = "*" -version = "1.0.6" [package.dependencies] docopt = "*" @@ -348,16 +257,12 @@ xlrd = "*" xlsxwriter = "*" [[package]] -category = "dev" -description = "A library for property-based testing" name = "hypothesis" +version = "5.30.0" +description = "A library for property-based testing" +category = "dev" optional = false python-versions = ">=3.5.2" -version = "5.29.0" - -[package.dependencies] -attrs = ">=19.2.0" -sortedcontainers = ">=2.1.0,<3.0.0" [package.extras] all = ["black (>=19.10b0)", "click (>=7.0)", "django (>=2.2)", "dpcontracts (>=0.4)", "lark-parser (>=0.6.5)", "numpy (>=1.9.0)", "pandas (>=0.19)", "pytest (>=4.3)", "python-dateutil (>=1.4)", "pytz (>=2014.1)"] @@ -372,76 +277,67 @@ pandas = ["pandas (>=0.19)"] pytest = ["pytest (>=4.3)"] pytz = ["pytz (>=2014.1)"] +[package.dependencies] +attrs = ">=19.2.0" +sortedcontainers = ">=2.1.0,<3.0.0" + [[package]] -category = "dev" -description = "File identification library for Python" name = "identify" +version = "1.4.30" +description = "File identification library for Python" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "1.4.29" [package.extras] license = ["editdistance"] [[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" [[package]] -category = "dev" -description = "Getting image size from png/jpeg/jpeg2000/gif file" name = "imagesize" +version = "1.2.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [[package]] -category = "main" -description = "Read metadata from Python packages" name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.7.0" - -[package.dependencies] -zipp = ">=0.5" [package.extras] docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +[package.dependencies] +zipp = ">=0.5" + [[package]] -category = "main" -description = "iniconfig: brain-dead simple config-ini parsing" name = "iniconfig" +version = "1.0.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "main" optional = false python-versions = "*" -version = "1.0.1" [[package]] -category = "main" -description = "IPython: Productive Interactive Computing" name = "ipython" +version = "7.18.1" +description = "IPython: Productive Interactive Computing" +category = "main" optional = true python-versions = ">=3.7" -version = "7.17.0" - -[package.dependencies] -appnope = "*" -backcall = "*" -colorama = "*" -decorator = "*" -jedi = ">=0.10" -pexpect = "*" -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -setuptools = ">=18.5" -traitlets = ">=4.2" [package.extras] all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] @@ -454,112 +350,112 @@ parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] +[package.dependencies] +appnope = "*" +backcall = "*" +colorama = "*" +decorator = "*" +jedi = ">=0.10" +pexpect = ">4.3" +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + [[package]] -category = "main" -description = "Vestigial utilities from IPython" name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "main" optional = true python-versions = "*" -version = "0.2.0" [[package]] -category = "dev" -description = "A Python utility / library to sort Python imports." -name = "isort" -optional = false -python-versions = ">=3.6,<4.0" -version = "5.4.2" - -[package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] - -[[package]] -category = "main" -description = "An autocompletion tool for Python that can be used for text editors." name = "jedi" +version = "0.17.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.2" - -[package.dependencies] -parso = ">=0.7.0,<0.8.0" [package.extras] qa = ["flake8 (3.7.9)"] testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] +[package.dependencies] +parso = ">=0.7.0,<0.8.0" + [[package]] -category = "dev" -description = "A very fast and expressive template engine." name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.2" - -[package.dependencies] -MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[package.dependencies] +MarkupSafe = ">=0.23" + [[package]] -category = "main" -description = "Lightweight pipelining: using Python functions as pipeline jobs." name = "joblib" -optional = false -python-versions = ">=3.6" version = "0.16.0" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +category = "main" +optional = true +python-versions = ">=3.6" [[package]] -category = "main" -description = "Python library for serializing any arbitrary object graph into JSON" name = "jsonpickle" -optional = false -python-versions = ">=2.7" version = "1.4.1" - -[package.dependencies] -importlib-metadata = "*" +description = "Python library for serializing any arbitrary object graph into JSON" +category = "main" +optional = true +python-versions = ">=2.7" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["coverage (<5)", "pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov", "ecdsa", "feedparser", "numpy", "pandas", "pymongo", "sqlalchemy", "enum34", "jsonlib"] "testing.libs" = ["demjson", "simplejson", "ujson", "yajl"] +[package.dependencies] +importlib-metadata = "*" + [[package]] -category = "main" -description = "A fast implementation of the Cassowary constraint solver" name = "kiwisolver" +version = "1.2.0" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" optional = true python-versions = ">=3.6" -version = "1.2.0" [[package]] -category = "dev" -description = "A fast and thorough lazy object proxy." -marker = "python_version >= \"3\"" name = "lazy-object-proxy" +version = "1.4.3" +description = "A fast and thorough lazy object proxy." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.3" +marker = "python_version >= \"3\"" [[package]] -category = "dev" -description = "Safely add untrusted strings to HTML/XML markup." name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" [[package]] -category = "main" -description = "Python plotting package" name = "matplotlib" +version = "3.3.1" +description = "Python plotting package" +category = "main" optional = true python-versions = ">=3.6" -version = "3.3.1" [package.dependencies] certifi = ">=2020.06.20" @@ -571,194 +467,147 @@ pyparsing = ">=2.0.3,<2.0.4 || >2.0.4,<2.1.2 || >2.1.2,<2.1.6 || >2.1.6" python-dateutil = ">=2.1" [[package]] -category = "dev" -description = "McCabe checker, plugin for flake8" name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" -version = "0.6.1" [[package]] -category = "main" -description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" -optional = false -python-versions = ">=3.5" -version = "8.4.0" - -[[package]] +version = "8.5.0" +description = "More routines for operating on iterables, beyond itertools" category = "main" -description = "Simple yet flexible natural sorting in Python." -name = "natsort" optional = false -python-versions = ">=3.4" -version = "7.0.1" - -[package.extras] -fast = ["fastnumbers (>=2.0.0)"] -icu = ["PyICU (>=1.0.0)"] +python-versions = ">=3.5" [[package]] -category = "dev" -description = "Node.js virtual environment builder" name = "nodeenv" +version = "1.5.0" +description = "Node.js virtual environment builder" +category = "dev" optional = false python-versions = "*" -version = "1.5.0" [[package]] -category = "main" -description = "nose extends unittest to make testing easier" name = "nose" +version = "1.3.7" +description = "nose extends unittest to make testing easier" +category = "main" optional = true python-versions = "*" -version = "1.3.7" [[package]] -category = "main" -description = "NumPy is the fundamental package for array computing with Python." name = "numpy" -optional = false -python-versions = ">=3.6" version = "1.19.1" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = true +python-versions = ">=3.6" [[package]] -category = "main" -description = "Core utilities for Python packages" name = "packaging" +version = "20.4" +description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.4" [package.dependencies] pyparsing = ">=2.0.2" six = "*" [[package]] -category = "main" -description = "Powerful data structures for data analysis, time series, and statistics" name = "pandas" -optional = false -python-versions = ">=3.6.1" version = "1.1.1" - -[package.dependencies] -numpy = ">=1.15.4" -python-dateutil = ">=2.7.3" -pytz = ">=2017.2" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = true +python-versions = ">=3.6.1" [package.extras] test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] -[[package]] -category = "main" -description = "SSH2 protocol library" -name = "paramiko" -optional = true -python-versions = "*" -version = "2.7.1" - [package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" - -[package.extras] -all = ["pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "bcrypt (>=3.1.3)", "invoke (>=1.3)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["pynacl (>=1.0.1)", "bcrypt (>=3.1.3)"] -gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] +numpy = ">=1.15.4" +python-dateutil = ">=2.7.3" +pytz = ">=2017.2" [[package]] -category = "main" -description = "A Python Parser" name = "parso" +version = "0.7.1" +description = "A Python Parser" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.7.1" [package.extras] testing = ["docopt", "pytest (>=3.0.7)"] [[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 = "main" -description = "A Python package for describing statistical models and for building design matrices." name = "patsy" +version = "0.5.1" +description = "A Python package for describing statistical models and for building design matrices." +category = "main" optional = true python-versions = "*" -version = "0.5.1" [package.dependencies] numpy = ">=1.4" six = "*" [[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." category = "main" -description = "a little orm" -name = "peewee" optional = true python-versions = "*" -version = "3.13.3" - -[[package]] -category = "main" -description = "Pexpect allows easy control of interactive console applications." marker = "sys_platform != \"win32\"" -name = "pexpect" -optional = true -python-versions = "*" -version = "4.8.0" [package.dependencies] ptyprocess = ">=0.5" [[package]] -category = "main" -description = "Tiny 'shelve'-like database with concurrency support" name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "main" optional = true python-versions = "*" -version = "0.7.5" [[package]] -category = "main" -description = "Python Imaging Library (Fork)" name = "pillow" +version = "7.2.0" +description = "Python Imaging Library (Fork)" +category = "main" optional = true python-versions = ">=3.5" -version = "7.2.0" [[package]] -category = "main" -description = "plugin and hook calling mechanisms for python" name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" + +[package.extras] +dev = ["pre-commit", "tox"] [package.dependencies] [package.dependencies.importlib-metadata] -python = "<3.8" version = ">=0.12" - -[package.extras] -dev = ["pre-commit", "tox"] +python = "<3.8" [[package]] -category = "dev" -description = "A framework for managing and maintaining multi-language pre-commit hooks." name = "pre-commit" +version = "2.7.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" optional = false python-versions = ">=3.6.1" -version = "2.7.1" [package.dependencies] cfgv = ">=2.0.0" @@ -769,145 +618,125 @@ toml = "*" virtualenv = ">=20.0.8" [package.dependencies.importlib-metadata] -python = "<3.8" version = "*" +python = "<3.8" + +[[package]] +name = "pre-commit-hooks" +version = "3.2.0" +description = "Some out-of-the-box hooks for pre-commit." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +"ruamel.yaml" = ">=0.15" +toml = "*" [[package]] -category = "main" -description = "Library for building powerful interactive command lines in Python" name = "prompt-toolkit" +version = "3.0.7" +description = "Library for building powerful interactive command lines in Python" +category = "main" optional = true python-versions = ">=3.6.1" -version = "3.0.6" [package.dependencies] wcwidth = "*" [[package]] -category = "main" -description = "Cross-platform lib for process and system monitoring in Python." name = "psutil" +version = "5.7.2" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "5.7.2" [package.extras] test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] [[package]] -category = "main" -description = "Run a subprocess in a pseudo terminal" -marker = "sys_platform != \"win32\"" name = "ptyprocess" +version = "0.6.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" optional = true python-versions = "*" -version = "0.6.0" +marker = "sys_platform != \"win32\"" [[package]] -category = "main" -description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" +version = "1.9.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.9.0" [[package]] -category = "dev" -description = "Python style guide checker" name = "pycodestyle" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.6.0" - -[[package]] -category = "main" -description = "C parser in Python" -name = "pycparser" -optional = true +description = "Python style guide checker" +category = "dev" +optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" [[package]] -category = "dev" -description = "Python docstring style checker" name = "pydocstyle" +version = "5.1.1" +description = "Python docstring style checker" +category = "dev" optional = false python-versions = ">=3.5" -version = "5.1.0" [package.dependencies] snowballstemmer = "*" [[package]] -category = "main" -description = "Python interface to Graphviz's Dot" name = "pydot" +version = "1.4.1" +description = "Python interface to Graphviz's Dot" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.1" [package.dependencies] pyparsing = ">=2.1.4" [[package]] -category = "dev" -description = "passive checker of Python programs" name = "pyflakes" +version = "2.2.0" +description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.2.0" [[package]] -category = "main" -description = "Pygments is a syntax highlighting package written in Python." name = "pygments" -optional = false -python-versions = ">=3.5" version = "2.6.1" - -[[package]] -category = "main" -description = "Pure Python MySQL Driver" -name = "pymysql" -optional = true -python-versions = "*" -version = "0.10.0" - -[package.extras] -ed25519 = ["PyNaCl (>=1.4.0)"] -rsa = ["cryptography"] - -[[package]] +description = "Pygments is a syntax highlighting package written in Python." category = "main" -description = "Python binding to the Networking and Cryptography (NaCl) library" -name = "pynacl" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" - -[package.dependencies] -cffi = ">=1.4.1" -six = "*" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)", "hypothesis (>=3.27.0)"] +optional = false +python-versions = ">=3.5" [[package]] -category = "main" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" [[package]] -category = "main" -description = "pytest: simple powerful testing with Python" name = "pytest" +version = "6.0.1" +description = "pytest: simple powerful testing with Python" +category = "main" optional = false python-versions = ">=3.5" -version = "6.0.1" + +[package.extras] +checkqa_mypy = ["mypy (0.780)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [package.dependencies] atomicwrites = ">=1.0" @@ -921,70 +750,62 @@ py = ">=1.8.2" toml = "*" [package.dependencies.importlib-metadata] -python = "<3.8" version = ">=0.12" - -[package.extras] -checkqa_mypy = ["mypy (0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +python = "<3.8" [[package]] -category = "main" -description = "Pytest plugin for measuring coverage." name = "pytest-cov" +version = "2.10.1" +description = "Pytest plugin for measuring coverage." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.10.1" + +[package.extras] +testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] [package.dependencies] coverage = ">=4.4" pytest = ">=4.6" -[package.extras] -testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] - [[package]] -category = "main" -description = "Extensions to the standard Python datetime module" name = "python-dateutil" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = true +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] six = ">=1.5" [[package]] -category = "main" -description = "World timezone definitions, modern and historical" name = "pytz" +version = "2020.1" +description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" -version = "2020.1" [[package]] -category = "dev" -description = "YAML parser and emitter for Python" name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "5.3.1" - -[[package]] +description = "YAML parser and emitter for Python" category = "dev" -description = "Alternative regular expression module, to replace re." -name = "regex" optional = false -python-versions = "*" -version = "2020.7.14" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] -category = "main" -description = "Python HTTP for Humans." name = "requests" +version = "2.24.0" +description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" + +[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.dependencies] certifi = ">=2017.4.17" @@ -992,62 +813,89 @@ 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]] +name = "ruamel.yaml" +version = "0.16.10" +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 = "*" + [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[package.dependencies] +[package.dependencies."ruamel.yaml.clib"] +version = ">=0.1.2" +python = "<3.9" + +[[package]] +name = "ruamel.yaml.clib" +version = "0.2.0" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "dev" +optional = false +python-versions = "*" +marker = "platform_python_implementation == \"CPython\" and python_version < \"3.9\"" [[package]] -category = "main" -description = "SciPy: Scientific Library for Python" name = "scipy" +version = "1.5.2" +description = "SciPy: Scientific Library for Python" +category = "main" optional = true python-versions = ">=3.6" -version = "1.5.2" [package.dependencies] numpy = ">=1.14.5" [[package]] -category = "main" -description = "Python 2 and 3 compatibility utilities" name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" [[package]] -category = "dev" -description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." name = "snowballstemmer" +version = "2.0.0" +description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +category = "dev" optional = false python-versions = "*" -version = "2.0.0" [[package]] -category = "dev" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" name = "sortedcontainers" +version = "2.2.2" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" optional = false python-versions = "*" -version = "2.2.2" [[package]] -category = "dev" -description = "Python documentation generator" name = "sphinx" +version = "3.2.1" +description = "Python documentation generator" +category = "dev" optional = false python-versions = ">=3.5" -version = "3.2.1" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] [package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" colorama = ">=0.3.5" docutils = ">=0.12" imagesize = "*" +Jinja2 = ">=2.3" packaging = "*" +Pygments = ">=2.0" requests = ">=2.5.0" setuptools = "*" snowballstemmer = ">=1.1" @@ -1058,18 +906,17 @@ sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = "*" -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] - [[package]] -category = "dev" -description = "Sphinx API documentation generator" name = "sphinx-autoapi" +version = "1.5.0" +description = "Sphinx API documentation generator" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -version = "1.4.0" + +[package.extras] +dotnet = ["sphinxcontrib-dotnetdomain"] +go = ["sphinxcontrib-golangdomain"] [package.dependencies] Jinja2 = "*" @@ -1078,199 +925,178 @@ sphinx = ">=1.6" unidecode = "*" [package.dependencies.astroid] -python = ">=3" version = "*" - -[package.extras] -dotnet = ["sphinxcontrib-dotnetdomain"] -go = ["sphinxcontrib-golangdomain"] +python = ">=3" [[package]] -category = "dev" -description = "Read the Docs theme for Sphinx" name = "sphinx-rtd-theme" +version = "0.5.0" +description = "Read the Docs theme for Sphinx" +category = "dev" optional = false python-versions = "*" -version = "0.5.0" - -[package.dependencies] -sphinx = "*" [package.extras] dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"] +[package.dependencies] +sphinx = "*" + [[package]] -category = "dev" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" name = "sphinxcontrib-htmlhelp" +version = "1.0.3" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.3" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest", "html5lib"] [[package]] -category = "dev" -description = "A sphinx extension which renders display math in HTML via JavaScript" name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.1" [package.extras] test = ["pytest", "flake8", "mypy"] [[package]] -category = "dev" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.3" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." name = "sphinxcontrib-serializinghtml" +version = "1.1.4" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.1.4" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] +name = "statsmodels" +version = "0.12.0" +description = "Statistical computations and models for Python" category = "main" -description = "Pure python SSH tunnels" -name = "sshtunnel" optional = true -python-versions = "*" -version = "0.1.5" - -[package.dependencies] -paramiko = ">=1.15.2" +python-versions = ">=3.6" [package.extras] -build_sphinx = ["sphinx", "sphinxcontrib-napoleon"] -dev = ["check-manifest"] -test = ["tox (>=1.8.1)"] - -[[package]] -category = "main" -description = "Statistical computations and models for Python" -name = "statsmodels" -optional = true -python-versions = ">=3.5" -version = "0.11.1" +build = ["cython (>=0.29)"] +develop = ["cython (>=0.29)"] +docs = ["sphinx", "nbconvert", "jupyter-client", "ipykernel", "matplotlib", "nbformat", "numpydoc", "pandas-datareader"] [package.dependencies] -numpy = ">=1.14" +numpy = ">=1.15" pandas = ">=0.21" patsy = ">=0.5" -scipy = ">=1.0" - -[package.extras] -build = ["cython (>=0.29)"] -develop = ["cython (>=0.29)"] -docs = ["sphinx", "nbconvert", "jupyter-client", "ipykernel", "matplotlib", "nbformat", "numpydoc", "pandas-datareader"] +scipy = ">=1.1" [[package]] -category = "main" -description = "Python Library for Tom's Obvious, Minimal Language" name = "toml" +version = "0.10.1" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" optional = false python-versions = "*" -version = "0.10.1" [[package]] -category = "main" -description = "Style preserving TOML library" name = "tomlkit" +version = "0.7.0" +description = "Style preserving TOML library" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.7.0" [[package]] -category = "main" -description = "Traitlets Python config system" name = "traitlets" +version = "5.0.0" +description = "Traitlets Python configuration system" +category = "main" optional = true -python-versions = "*" -version = "4.3.3" +python-versions = ">=3.7" + +[package.extras] +test = ["pytest"] [package.dependencies] -decorator = "*" ipython-genutils = "*" -six = "*" - -[package.extras] -test = ["pytest", "mock"] [[package]] -category = "dev" -description = "a fork of Python 2 and 3 ast modules with type comment support" name = "typed-ast" +version = "1.4.1" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" optional = false python-versions = "*" -version = "1.4.1" +marker = "implementation_name == \"cpython\" and python_version < \"3.8\" and python_version >= \"3\"" [[package]] -category = "dev" -description = "ASCII transliterations of Unicode text" name = "unidecode" +version = "1.1.1" +description = "ASCII transliterations of Unicode text" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.1" [[package]] -category = "main" -description = "retrieve protein sequence identifiers and metadata from http://uniprot.org" name = "uniprot" +version = "1.3" +description = "retrieve protein sequence identifiers and metadata from http://uniprot.org" +category = "main" optional = true python-versions = "*" -version = "1.3" [package.dependencies] requests = "*" [[package]] -category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" +version = "1.25.10" +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.*, <4" -version = "1.25.10" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1278,12 +1104,16 @@ secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0 socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] -category = "dev" -description = "Virtual Python Environment builder" name = "virtualenv" +version = "20.0.31" +description = "Virtual Python Environment builder" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "20.0.31" + +[package.extras] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] +testing = ["coverage (>=5)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-xdist (>=1.31.0)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] [package.dependencies] appdirs = ">=1.4.3,<2" @@ -1292,78 +1122,74 @@ filelock = ">=3.0.0,<4" six = ">=1.9.0,<2" [package.dependencies.importlib-metadata] -python = "<3.8" version = ">=0.12,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] -testing = ["coverage (>=5)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-xdist (>=1.31.0)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] +python = "<3.8" [[package]] -category = "main" -description = "Measures the displayed width of unicode strings in a terminal" name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" optional = true python-versions = "*" -version = "0.2.5" [[package]] -category = "main" -description = "pure python download utility" name = "wget" +version = "3.2" +description = "pure python download utility" +category = "main" optional = true python-versions = "*" -version = "3.2" [[package]] -category = "dev" -description = "Module for decorators, wrappers and monkey patching." -marker = "python_version >= \"3\"" name = "wrapt" +version = "1.12.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" optional = false python-versions = "*" -version = "1.12.1" +marker = "python_version >= \"3\"" [[package]] -category = "main" -description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" name = "xlrd" +version = "1.2.0" +description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [[package]] -category = "main" -description = "A Python module for creating Excel XLSX files." name = "xlsxwriter" +version = "1.3.3" +description = "A Python module for creating Excel XLSX files." +category = "main" optional = true python-versions = "*" -version = "1.3.3" [[package]] -category = "main" -description = "Backport of pathlib-compatible object wrapper for zip files" name = "zipp" +version = "3.1.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.6" -version = "3.1.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [extras] -biochem = ["goatools", "uniprot"] -db = ["PyMySQL", "peewee", "sshtunnel"] -dev = [] -misc = ["colorama", "psutil"] -notebooks = ["ipython"] +tools = ["dill", "jsonpickle", "joblib", "numpy", "pandas"] plotting = ["matplotlib"] +notebooks = ["ipython", "pandas"] +misc = ["colorama", "psutil"] +biochem = ["goatools", "requests", "uniprot", "numpy", "pandas"] +all = ["dill", "jsonpickle", "joblib", "numpy", "pandas", "matplotlib", "ipython", "colorama", "psutil", "goatools", "requests", "uniprot"] +dev = [] [metadata] -content-hash = "759e67883cdd13f02e84af9f8d3e159788abc99bd5bf8719cd7b1ce33f01f406" -lock-version = "1.0" python-versions = ">=3.7, <4" +content-hash = "f5479c29d2375bbab073b5966217aaff57674554c0a7b8644f7582cffaad8a76" [metadata.files] alabaster = [ @@ -1398,53 +1224,10 @@ backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] -bcrypt = [ - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, - {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, - {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, - {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, -] -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.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ] -cffi = [ - {file = "cffi-1.14.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82"}, - {file = "cffi-1.14.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4"}, - {file = "cffi-1.14.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e"}, - {file = "cffi-1.14.2-cp27-cp27m-win32.whl", hash = "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c"}, - {file = "cffi-1.14.2-cp27-cp27m-win_amd64.whl", hash = "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1"}, - {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7"}, - {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c"}, - {file = "cffi-1.14.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731"}, - {file = "cffi-1.14.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0"}, - {file = "cffi-1.14.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e"}, - {file = "cffi-1.14.2-cp35-cp35m-win32.whl", hash = "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487"}, - {file = "cffi-1.14.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad"}, - {file = "cffi-1.14.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2"}, - {file = "cffi-1.14.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123"}, - {file = "cffi-1.14.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1"}, - {file = "cffi-1.14.2-cp36-cp36m-win32.whl", hash = "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281"}, - {file = "cffi-1.14.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4"}, - {file = "cffi-1.14.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798"}, - {file = "cffi-1.14.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4"}, - {file = "cffi-1.14.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f"}, - {file = "cffi-1.14.2-cp37-cp37m-win32.whl", hash = "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650"}, - {file = "cffi-1.14.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15"}, - {file = "cffi-1.14.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa"}, - {file = "cffi-1.14.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c"}, - {file = "cffi-1.14.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75"}, - {file = "cffi-1.14.2-cp38-cp38-win32.whl", hash = "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e"}, - {file = "cffi-1.14.2-cp38-cp38-win_amd64.whl", hash = "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c"}, - {file = "cffi-1.14.2.tar.gz", hash = "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b"}, -] cfgv = [ {file = "cfgv-3.2.0-py2.py3-none-any.whl", hash = "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d"}, {file = "cfgv-3.2.0.tar.gz", hash = "sha256:cf22deb93d4bcf92f345a5c3cd39d3d41d6340adc60c78bbbd6588c384fda6a1"}, @@ -1453,10 +1236,6 @@ chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] -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"}, @@ -1497,31 +1276,6 @@ coverage = [ {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, ] -coveralls = [ - {file = "coveralls-2.1.2-py2.py3-none-any.whl", hash = "sha256:b3b60c17b03a0dee61952a91aed6f131e0b2ac8bd5da909389c53137811409e1"}, - {file = "coveralls-2.1.2.tar.gz", hash = "sha256:4430b862baabb3cf090d36d84d331966615e4288d8a8c5957e0fd456d0dd8bd6"}, -] -cryptography = [ - {file = "cryptography-3.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f"}, - {file = "cryptography-3.0-cp27-cp27m-win32.whl", hash = "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6"}, - {file = "cryptography-3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67"}, - {file = "cryptography-3.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd"}, - {file = "cryptography-3.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77"}, - {file = "cryptography-3.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c"}, - {file = "cryptography-3.0-cp35-cp35m-win32.whl", hash = "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b"}, - {file = "cryptography-3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07"}, - {file = "cryptography-3.0-cp36-cp36m-win32.whl", hash = "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559"}, - {file = "cryptography-3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71"}, - {file = "cryptography-3.0-cp37-cp37m-win32.whl", hash = "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2"}, - {file = "cryptography-3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756"}, - {file = "cryptography-3.0-cp38-cp38-win32.whl", hash = "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261"}, - {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, - {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, -] cycler = [ {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"}, {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"}, @@ -1564,12 +1318,12 @@ goatools = [ {file = "goatools-1.0.6.tar.gz", hash = "sha256:3deeee5d207e5a2053a874e4e37e1f76de227aed72ca6abb7df8b888607c5e52"}, ] hypothesis = [ - {file = "hypothesis-5.29.0-py3-none-any.whl", hash = "sha256:fc0f087e403175e6a9db36e1361bf336592f7641be21d51535a2537610410ac7"}, - {file = "hypothesis-5.29.0.tar.gz", hash = "sha256:67f6261176d22019bbb82dea463d9c3890dcc9722607cb2a7869f16c05d076ec"}, + {file = "hypothesis-5.30.0-py3-none-any.whl", hash = "sha256:4a57b7add9203c6244912ce6d67a2dc040fabb600d90268a022b2c7ca3bce046"}, + {file = "hypothesis-5.30.0.tar.gz", hash = "sha256:d810af02dcb0edabb36dd77f3db01b89a4028098dad237bafeaf23060e1dd5be"}, ] identify = [ - {file = "identify-1.4.29-py2.py3-none-any.whl", hash = "sha256:b1aa2e05863dc80242610d46a7b49105e2eafe00ef0c8ff311c1828680760c76"}, - {file = "identify-1.4.29.tar.gz", hash = "sha256:9f5fcf22b665eaece583bd395b103c2769772a0f646ffabb5b1f155901b07de2"}, + {file = "identify-1.4.30-py2.py3-none-any.whl", hash = "sha256:f9f84a4ff44e29b9cc23c4012c2c8954089860723f80ce63d760393e5f197108"}, + {file = "identify-1.4.30.tar.gz", hash = "sha256:e105a62fd3a496c701fd1bc4e24eb695455b5efb97e722816d5bd988c3344311"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, @@ -1588,17 +1342,13 @@ iniconfig = [ {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, ] ipython = [ - {file = "ipython-7.17.0-py3-none-any.whl", hash = "sha256:5a8f159ca8b22b9a0a1f2a28befe5ad2b703339afb58c2ffe0d7c8d7a3af5999"}, - {file = "ipython-7.17.0.tar.gz", hash = "sha256:b70974aaa2674b05eb86a910c02ed09956a33f2dd6c71afc60f0b128a77e7f28"}, + {file = "ipython-7.18.1-py3-none-any.whl", hash = "sha256:2e22c1f74477b5106a6fb301c342ab8c64bb75d702e350f05a649e8cb40a0fb8"}, + {file = "ipython-7.18.1.tar.gz", hash = "sha256:a331e78086001931de9424940699691ad49dfb457cea31f5471eae7b78222d5e"}, ] ipython-genutils = [ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, ] -isort = [ - {file = "isort-5.4.2-py3-none-any.whl", hash = "sha256:60a1b97e33f61243d12647aaaa3e6cc6778f5eb9f42997650f1cc975b6008750"}, - {file = "isort-5.4.2.tar.gz", hash = "sha256:d488ba1c5a2db721669cc180180d5acf84ebdc5af7827f7aaeaa75f73cf0e2b8"}, -] jedi = [ {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, @@ -1698,6 +1448,12 @@ matplotlib = [ {file = "matplotlib-3.3.1-1-cp36-cp36m-win32.whl", hash = "sha256:fab11637734eb14affb9c5e20d44d69429c18b49595d6e67c69295de24827fc4"}, {file = "matplotlib-3.3.1-1-cp36-cp36m-win_amd64.whl", hash = "sha256:24392ac1a382ed753505286f1a1483bcfd67ed0c72d51be10c4c2013e386d0b7"}, {file = "matplotlib-3.3.1-1-cp37-cp37m-win32.whl", hash = "sha256:c4ffb25b9855bdb6cdaf21bbd4ab2c229be539248304ac5215b94c816ea6e32e"}, + {file = "matplotlib-3.3.1-1-cp37-cp37m-win_amd64.whl", hash = "sha256:5a42c84264a1acbbf01c073a7bd05a0e80d99f94f10020d613b1b0526af9dcc2"}, + {file = "matplotlib-3.3.1-1-cp38-cp38-win32.whl", hash = "sha256:bc978374b43737f2bbc4a6ec48e52ae8c92be6278a80d0e2ce92f0eb0841f15c"}, + {file = "matplotlib-3.3.1-1-cp38-cp38-win_amd64.whl", hash = "sha256:6d0f03079f655ca0a2d2e0bf49c28e1ec43d9d544c33d8da1a88765f23018ecc"}, + {file = "matplotlib-3.3.1-1-cp39-cp39-win32.whl", hash = "sha256:2375f039b8c6ad6c1d03f01bf31f086bbbf997bf25e246f3b67f69969cde3d98"}, + {file = "matplotlib-3.3.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:233bef5e3b3494f3b7057595ca814f23ba0ce67a03632ddf677be5132128b3db"}, + {file = "matplotlib-3.3.1-1-pp36-pypy36_pp73-win32.whl", hash = "sha256:f62c0b9a5d38c26673a8862cbae4d26cffcda260848e4278246b4e00f5a95eaf"}, {file = "matplotlib-3.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:282f8a077a1217f9f2ac178596f27c1ae94abbc6e7b785e1b8f25e83918e9199"}, {file = "matplotlib-3.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:83ae7261f4d5ab387be2caee29c4f499b1566f31c8ac97a0b8ab61afd9e3da92"}, {file = "matplotlib-3.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1f9cf2b8500b833714a193cb24281153f5072d55b2e486009f1e81f0b7da3410"}, @@ -1722,12 +1478,8 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ - {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, - {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, -] -natsort = [ - {file = "natsort-7.0.1-py3-none-any.whl", hash = "sha256:d3fd728a3ceb7c78a59aa8539692a75e37cbfd9b261d4d702e8016639820f90a"}, - {file = "natsort-7.0.1.tar.gz", hash = "sha256:a633464dc3a22b305df0f27abcb3e83515898aa1fd0ed2f9726c3571a27258cf"}, + {file = "more-itertools-8.5.0.tar.gz", hash = "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20"}, + {file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"}, ] nodeenv = [ {file = "nodeenv-1.5.0-py2.py3-none-any.whl", hash = "sha256:5304d424c529c997bc888453aeaa6362d242b6b4631e90f3d4bf1b290f1c84a9"}, @@ -1788,25 +1540,14 @@ pandas = [ {file = "pandas-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:57c5f6be49259cde8e6f71c2bf240a26b071569cabc04c751358495d09419e56"}, {file = "pandas-1.1.1.tar.gz", hash = "sha256:53328284a7bb046e2e885fd1b8c078bd896d7fc4575b915d4936f54984a2ba67"}, ] -paramiko = [ - {file = "paramiko-2.7.1-py2.py3-none-any.whl", hash = "sha256:9c980875fa4d2cb751604664e9a2d0f69096643f5be4db1b99599fe114a97b2f"}, - {file = "paramiko-2.7.1.tar.gz", hash = "sha256:920492895db8013f6cc0179293147f830b8c7b21fdfc839b6bad760c27459d9f"}, -] parso = [ {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, ] -pathspec = [ - {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, - {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, -] patsy = [ {file = "patsy-0.5.1-py2.py3-none-any.whl", hash = "sha256:5465be1c0e670c3a965355ec09e9a502bf2c4cbe4875e8528b0221190a8a5d40"}, {file = "patsy-0.5.1.tar.gz", hash = "sha256:f115cec4201e1465cd58b9866b0b0e7b941caafec129869057405bfe5b5e3991"}, ] -peewee = [ - {file = "peewee-3.13.3.tar.gz", hash = "sha256:1269a9736865512bd4056298003aab190957afe07d2616cf22eaf56cb6398369"}, -] pexpect = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, @@ -1840,6 +1581,8 @@ pillow = [ {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, ] @@ -1851,9 +1594,13 @@ pre-commit = [ {file = "pre_commit-2.7.1-py2.py3-none-any.whl", hash = "sha256:810aef2a2ba4f31eed1941fc270e72696a1ad5590b9751839c90807d0fff6b9a"}, {file = "pre_commit-2.7.1.tar.gz", hash = "sha256:c54fd3e574565fe128ecc5e7d2f91279772ddb03f8729645fa812fe809084a70"}, ] +pre-commit-hooks = [ + {file = "pre_commit_hooks-3.2.0-py2.py3-none-any.whl", hash = "sha256:8a174237326576c5f2279eba18ccbf2ca2a19fcaab8844db80f576c8fe76c2c2"}, + {file = "pre_commit_hooks-3.2.0.tar.gz", hash = "sha256:917bce8feb048f8271e3a4a900c6d780118d23e8ddf4557ddec9384c0d1dba79"}, +] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.6-py3-none-any.whl", hash = "sha256:683397077a64cd1f750b71c05afcfc6612a7300cb6932666531e5a54f38ea564"}, - {file = "prompt_toolkit-3.0.6.tar.gz", hash = "sha256:7630ab85a23302839a0f26b31cc24f518e6155dea1ed395ea61b42c45941b6a6"}, + {file = "prompt_toolkit-3.0.7-py3-none-any.whl", hash = "sha256:83074ee28ad4ba6af190593d4d4c607ff525272a504eb159199b6dd9f950c950"}, + {file = "prompt_toolkit-3.0.7.tar.gz", hash = "sha256:822f4605f28f7d2ba6b0b09a31e25e140871e96364d1d377667b547bb3bf4489"}, ] psutil = [ {file = "psutil-5.7.2-cp27-none-win32.whl", hash = "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2"}, @@ -1880,13 +1627,9 @@ pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] pydocstyle = [ - {file = "pydocstyle-5.1.0-py3-none-any.whl", hash = "sha256:08374b9d4d2b7164bae50b71bb24eb0d74a56b309029d5d502264092fa7db0c3"}, - {file = "pydocstyle-5.1.0.tar.gz", hash = "sha256:4ca3c7736d36f92bb215dd74ef84ac3d6c146edd795c7afc5154c10f1eb1f65a"}, + {file = "pydocstyle-5.1.1-py3-none-any.whl", hash = "sha256:aca749e190a01726a4fb472dd4ef23b5c9da7b9205c0a7857c06533de13fd678"}, + {file = "pydocstyle-5.1.1.tar.gz", hash = "sha256:19b86fa8617ed916776a11cd8bc0197e5b9856d5433b777f51a3defe13075325"}, ] pydot = [ {file = "pydot-1.4.1-py2.py3-none-any.whl", hash = "sha256:67be714300c78fda5fd52f79ec994039e3f76f074948c67b5ff539b433ad354f"}, @@ -1900,28 +1643,6 @@ pygments = [ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] -pymysql = [ - {file = "PyMySQL-0.10.0-py2.py3-none-any.whl", hash = "sha256:adef15ceccf1ff544a23a6f46609f65187261dc8b0cf94c9644189c173b0a451"}, - {file = "PyMySQL-0.10.0.tar.gz", hash = "sha256:e14070bc84e050e0f80bf6063e31d276f03a0bb4d46b9eca2854566c4ae19837"}, -] -pynacl = [ - {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, - {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, - {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, - {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, - {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, -] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1955,32 +1676,35 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] -regex = [ - {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, - {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, - {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, - {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, - {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, - {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, - {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, - {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, - {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, -] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, ] +"ruamel.yaml" = [ + {file = "ruamel.yaml-0.16.10-py2.py3-none-any.whl", hash = "sha256:0962fd7999e064c4865f96fb1e23079075f4a2a14849bcdc5cdba53a24f9759b"}, + {file = "ruamel.yaml-0.16.10.tar.gz", hash = "sha256:099c644a778bf72ffa00524f78dd0b6476bca94a1da344130f4bf3381ce5b954"}, +] +"ruamel.yaml.clib" = [ + {file = "ruamel.yaml.clib-0.2.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c6d040d0396c28d3eaaa6cb20152cb3b2f15adf35a0304f4f40a3cf9f1d2448"}, + {file = "ruamel.yaml.clib-0.2.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d55386129291b96483edcb93b381470f7cd69f97585829b048a3d758d31210a"}, + {file = "ruamel.yaml.clib-0.2.0-cp27-cp27m-win32.whl", hash = "sha256:8073c8b92b06b572e4057b583c3d01674ceaf32167801fe545a087d7a1e8bf52"}, + {file = "ruamel.yaml.clib-0.2.0-cp27-cp27m-win_amd64.whl", hash = "sha256:615b0396a7fad02d1f9a0dcf9f01202bf9caefee6265198f252c865f4227fcc6"}, + {file = "ruamel.yaml.clib-0.2.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a0ff786d2a7dbe55f9544b3f6ebbcc495d7e730df92a08434604f6f470b899c5"}, + {file = "ruamel.yaml.clib-0.2.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:ea4362548ee0cbc266949d8a441238d9ad3600ca9910c3fe4e82ee3a50706973"}, + {file = "ruamel.yaml.clib-0.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:77556a7aa190be9a2bd83b7ee075d3df5f3c5016d395613671487e79b082d784"}, + {file = "ruamel.yaml.clib-0.2.0-cp35-cp35m-win32.whl", hash = "sha256:392b7c371312abf27fb549ec2d5e0092f7ef6e6c9f767bfb13e83cb903aca0fd"}, + {file = "ruamel.yaml.clib-0.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:ed5b3698a2bb241b7f5cbbe277eaa7fe48b07a58784fba4f75224fd066d253ad"}, + {file = "ruamel.yaml.clib-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7aee724e1ff424757b5bd8f6c5bbdb033a570b2b4683b17ace4dbe61a99a657b"}, + {file = "ruamel.yaml.clib-0.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d0d3ac228c9bbab08134b4004d748cf9f8743504875b3603b3afbb97e3472947"}, + {file = "ruamel.yaml.clib-0.2.0-cp36-cp36m-win32.whl", hash = "sha256:f9dcc1ae73f36e8059589b601e8e4776b9976effd76c21ad6a855a74318efd6e"}, + {file = "ruamel.yaml.clib-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e77424825caba5553bbade750cec2277ef130647d685c2b38f68bc03453bac6"}, + {file = "ruamel.yaml.clib-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d10e9dd744cf85c219bf747c75194b624cc7a94f0c80ead624b06bfa9f61d3bc"}, + {file = "ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:550168c02d8de52ee58c3d8a8193d5a8a9491a5e7b2462d27ac5bf63717574c9"}, + {file = "ruamel.yaml.clib-0.2.0-cp37-cp37m-win32.whl", hash = "sha256:57933a6986a3036257ad7bf283529e7c19c2810ff24c86f4a0cfeb49d2099919"}, + {file = "ruamel.yaml.clib-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b1b7fcee6aedcdc7e62c3a73f238b3d080c7ba6650cd808bce8d7761ec484070"}, + {file = "ruamel.yaml.clib-0.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:be018933c2f4ee7de55e7bd7d0d801b3dfb09d21dad0cce8a97995fd3e44be30"}, + {file = "ruamel.yaml.clib-0.2.0.tar.gz", hash = "sha256:b66832ea8077d9b3f6e311c4a53d06273db5dc2db6e8a908550f3c14d67e718c"}, +] scipy = [ {file = "scipy-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cca9fce15109a36a0a9f9cfc64f870f1c140cb235ddf27fe0328e6afb44dfed0"}, {file = "scipy-1.5.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1c7564a4810c1cd77fcdee7fa726d7d39d4e2695ad252d7c86c3ea9d85b7fb8f"}, @@ -2016,8 +1740,8 @@ sphinx = [ {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"}, ] sphinx-autoapi = [ - {file = "sphinx-autoapi-1.4.0.tar.gz", hash = "sha256:f76ef71d443c6a9ad5e1b326d4dfc196e2080e8b46141c45d1bb47a73a34f190"}, - {file = "sphinx_autoapi-1.4.0-py2.py3-none-any.whl", hash = "sha256:eb86024fb04f6f1c61d8be73f56db40bf730a932cf0c8d0456a43bae4c11b508"}, + {file = "sphinx-autoapi-1.5.0.tar.gz", hash = "sha256:95ffb69e7618284d84d4947a1cd386c1829e43e0648e80d6fc669737813609c3"}, + {file = "sphinx_autoapi-1.5.0-py2.py3-none-any.whl", hash = "sha256:8a32c6cc26ed0bc0c15c37bce1da9f745f0765741a302e918e9c91775ae69b04"}, ] sphinx-rtd-theme = [ {file = "sphinx_rtd_theme-0.5.0-py2.py3-none-any.whl", hash = "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"}, @@ -2047,31 +1771,23 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, ] -sshtunnel = [ - {file = "sshtunnel-0.1.5.tar.gz", hash = "sha256:c813fdcda8e81c3936ffeac47cb69cfb2d1f5e77ad0de656c6dab56aeebd9249"}, -] statsmodels = [ - {file = "statsmodels-0.11.1-cp35-cp35m-macosx_10_13_intel.whl", hash = "sha256:47e0f27fe515fae06240a1f1dbcdce8b93417ea294b4965335f538627f711b10"}, - {file = "statsmodels-0.11.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:92536c3579a6c7fbdaeb1c026781a17d4760e4b76ca861eaae05b2a43309dca5"}, - {file = "statsmodels-0.11.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1e3ae5671cae0da8f94ce5e9331fc9880fe6210ffd5750ac961f84203d262763"}, - {file = "statsmodels-0.11.1-cp35-none-win32.whl", hash = "sha256:e728156ae279f05574ef9e840ec57f44c96c85ba14010169e9b4e1085d89642f"}, - {file = "statsmodels-0.11.1-cp35-none-win_amd64.whl", hash = "sha256:f2ac0559d6ef824d5a47576f572de62b0f088ef4f912dd40298ee9ab20d3ef9b"}, - {file = "statsmodels-0.11.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:5e7afc596164c1c7464ba3943721a9668aa0ce07853ce9881ac49d3a043784dd"}, - {file = "statsmodels-0.11.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bce1e6b94ade985a8319621c9ea4f7e312ed8cfcb5d93ab0cb0013c58b98680c"}, - {file = "statsmodels-0.11.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:9efd2e27c08077330cecdbfb589cf84d735abface94e9a6387282a6a7c91362d"}, - {file = "statsmodels-0.11.1-cp36-none-win32.whl", hash = "sha256:02e95c567ac77834210ecbe96a64eb939fc42669f95d583ac6184b00830db743"}, - {file = "statsmodels-0.11.1-cp36-none-win_amd64.whl", hash = "sha256:49aa8ffbe0b0e2e86afa58dec6bd5c483898e9b8223d8a7d13b69b5ad144b674"}, - {file = "statsmodels-0.11.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:59403da80bdba84713d93f36897fba4fd3b2964a1b983816ed488a405abc18b1"}, - {file = "statsmodels-0.11.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6e7e2cb74d8ae56cffc0581f3467cdcd16d8f7e97297974cefdf0d727020c287"}, - {file = "statsmodels-0.11.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:67e1a5d9fc6900209203cd446b2ed6822eb4b03581dea669c4fe97f512cfde36"}, - {file = "statsmodels-0.11.1-cp37-none-win32.whl", hash = "sha256:f5e4928e230332260cb55458953dbbae6a63356f91d3242c7ba2d17dc6c4bd7f"}, - {file = "statsmodels-0.11.1-cp37-none-win_amd64.whl", hash = "sha256:434240abd14f4998ec6350473cd105e9977e930635ecf7e352d641d729dbc2a2"}, - {file = "statsmodels-0.11.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:621f2ec00ff8a4749cef3c9cc11c12ac2ee549ecf3ccfde626b3f1461165f0e6"}, - {file = "statsmodels-0.11.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a4fcb03d2a5d0f37d0ecb38f6d9d10a3ab6f9e2e583c3be4d4615484d5d10e88"}, - {file = "statsmodels-0.11.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6243bc78bc805acee7690098fa749094895bb3c2dd0b7f7ac8d57f97fe2b1eb2"}, - {file = "statsmodels-0.11.1-cp38-none-win32.whl", hash = "sha256:6371267d051b555898611913afa4a46144e9d29a234ef32c2e36e558e88a8de9"}, - {file = "statsmodels-0.11.1-cp38-none-win_amd64.whl", hash = "sha256:b9b9cb6ced4f9b644cfd0b6a9d4a88e406c643dba4f2ad61e22d03ee48bc7731"}, - {file = "statsmodels-0.11.1.tar.gz", hash = "sha256:5bde3fa0a35a91b45dba7cbc28270b5b649ff1d721c89290883f6e831672d5f0"}, + {file = "statsmodels-0.12.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c8eb0f602e92e59b480001d4f3edac96736f47130a0d4485245cfc168e0ab116"}, + {file = "statsmodels-0.12.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:abb266fb5273fea512a9dac2097e66cbd574d119d162f1c7eab392ae069ee640"}, + {file = "statsmodels-0.12.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cb317ab297b4196ac16d4ab671854f2e029916210ab6c93a642b7b94686327fc"}, + {file = "statsmodels-0.12.0-cp36-none-win32.whl", hash = "sha256:63126117af7b402b500742df39b3e5fec2dc3c9084a71852f9c52ac8bfa4c035"}, + {file = "statsmodels-0.12.0-cp36-none-win_amd64.whl", hash = "sha256:e2c513846ffeecf38f901005b06c596e9b115e7c631b43bb5354339de5ee8e95"}, + {file = "statsmodels-0.12.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:6aa45c4182cd80926222fcff851850ff02778b16c0fb1381e04c1cf1cfbd4a8d"}, + {file = "statsmodels-0.12.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6f795ba042f0f183e60d0177da4fb85ebad6fe90f1c0ce2c4ed20336253aacf2"}, + {file = "statsmodels-0.12.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9ada3ddf13e60a5728304e6ca176e6ad8ca83b80c85db593087d853c5c6d4a98"}, + {file = "statsmodels-0.12.0-cp37-none-win32.whl", hash = "sha256:20e275f63e7e4c79133af444043a6ea95846b6165ecb21c7a4983fa7dbaf5396"}, + {file = "statsmodels-0.12.0-cp37-none-win_amd64.whl", hash = "sha256:b4d549d8502b349e8e3bdd19ab424b1c5a5cd0b2e14e9aa2156e99d7396276a3"}, + {file = "statsmodels-0.12.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:8a555397609e01e7802393dedff19a8811a5fd0d2b177b88dd8a2e156824bbd3"}, + {file = "statsmodels-0.12.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6ef6b8c26ea3ab45ed4f5dce3e79ea725ab8896c15ed6ac405f619e33fa321da"}, + {file = "statsmodels-0.12.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9e9845db4fcd06272da5db95c75a2e30366d3116260a6e559881a1c9d9bccfba"}, + {file = "statsmodels-0.12.0-cp38-none-win32.whl", hash = "sha256:5d93e7650632ffb05bd407248a673cc8b4a5dfc47bf6def4066c502a331fb5f4"}, + {file = "statsmodels-0.12.0-cp38-none-win_amd64.whl", hash = "sha256:8cf730e37c5f21d9dabfb9af144fb9654d1211ec88eb6aa771ed96d814f7398d"}, + {file = "statsmodels-0.12.0.tar.gz", hash = "sha256:5c7d6707ad3112b67f564abaf1845d3c02ecc7174c2d990d539f45c37e98ad35"}, ] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, @@ -2082,8 +1798,8 @@ tomlkit = [ {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] traitlets = [ - {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, - {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, + {file = "traitlets-5.0.0-py3-none-any.whl", hash = "sha256:62a037f12ccb823fb05823afbe35fe0273bc18fa3202d0cf0ea8f24e97e464be"}, + {file = "traitlets-5.0.0.tar.gz", hash = "sha256:0d9c4005506b306b0a99551e96174b8bedc675c2dd048f92b3bbbb7d86ac93a9"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, diff --git a/pyproject.toml b/pyproject.toml index 56f2f6f..cec209b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ build-backend = "poetry.masonry.api" [tool.poetry] name = "pocketutils" -version = "0.1.1" +version = "0.2.0" description = "Adorable little Python code for you to copy or import." keywords = ["python", "snippets", "utils", "gists", "bioinformatics"] authors = ["Douglas Myers-Turnbull"] @@ -25,7 +25,6 @@ documentation = "https://pocketutils.readthedocs.io" classifiers = [ "Development Status :: 4 - Beta", "Natural Language :: English", - "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", @@ -52,24 +51,20 @@ Download = "https://pypi.org/project/pocketutils/" [tool.poetry.dependencies] python = ">=3.7, <4" -numpy = ">=1.18, <2.0" -tomlkit = ">=0.5, <1.0" -importlib-metadata = "^1" -requests = "^2" -dill = "^0.3" -jsonpickle = "^1" -natsort = "^7" -pandas = "^1" -joblib = ">=0.16, <1.0" - -PyMySQL = {version=">=0.10, <1.0", optional=true} -peewee = {version="^3.13", optional=true} -sshtunnel = {version=">=0.1, <1.0", optional=true} - -matplotlib = {version="^3", optional=true} +importlib_metadata = ">=1.7, <2.0" +tomlkit = ">=0.7, <1.0" + +dill = {version=">=0.3, <1.0", optional=true} +jsonpickle = {version="^1", optional=true} +joblib = {version=">=0.16, <1.0", optional=true} +numpy = {version=">=1.18, <2.0", optional=true} +pandas = {version=">=1.1, <2.0", optional=true} + +matplotlib = {version=">=3.3, <4.0", optional=true} goatools = {version="^1", optional=true} -uniprot = {version="^1", optional=true} +requests = {version="^2", optional=true} +uniprot = {version=">=1.3, <2.0", optional=true} colorama = {version=">=0.4, <1.0", optional=true} psutil = {version="^5", optional=true} @@ -78,34 +73,38 @@ ipython = {version="^7", optional=true} [tool.poetry.dev-dependencies] -pre-commit = "^2" +pre-commit = ">=2.7, <3.0" +pre-commit-hooks = ">=3.2, <4.0" pytest = "^6" coverage = {extras = ["toml"], version = "^5"} pytest-cov = "^2" sphinx = "^3" sphinx-autoapi = "^1" sphinx-rtd-theme = ">=0.5, <1.0" -flake8 = "^3" -flake8-docstrings = "^1" -black = "=19.10b0" -isort = "^5" -hypothesis = "^5" +flake8 = ">=3.8, <4.0" +flake8-docstrings = ">=1.5, <2.0" flake8-bugbear = "^20" -coveralls = "^2" +hypothesis = "^5" [tool.poetry.extras] -db = ["PyMySQL", "peewee", "sshtunnel"] +tools = ["dill", "jsonpickle", "joblib", "numpy", "pandas"] plotting = ["matplotlib"] -notebooks = ["ipython"] +notebooks = ["ipython", "pandas"] misc = ["colorama", "psutil"] -biochem = ["goatools", "uniprot"] -dev = [ - "pre-commit", "pytest", "coverage", "pytest-cov", "hypothesis", - "sphinx", "sphinx-autoapi", - "mypy", - "flake8", "flake8-docstrings", - "black", "isort", - "flake8-bugbear" +biochem = ["goatools", "requests", "uniprot", "numpy", "pandas"] +all = [ + "dill", "jsonpickle", "joblib", "numpy", "pandas", + "matplotlib", + "ipython", + "colorama", "psutil", + "goatools", "requests", "uniprot" +] +dev = [ + "pre-commit", "pre-commit-hooks", + "pytest", "coverage", "pytest-cov", "hypothesis", + "sphinx", "sphinx-autoapi", + "flake8", "flake8-docstrings", + "flake8-bandit", "flake8-bugbear" ] @@ -172,7 +171,7 @@ show_missing = true [tool.black] line-length = 100 -target-version = ["py37", "py38"] +target-version = ["py38"] [tool.isort] line_length = 100 diff --git a/tests/pocketutils/misc/test_toml_data.py b/tests/pocketutils/misc/test_toml_data.py deleted file mode 100644 index 3e8b543..0000000 --- a/tests/pocketutils/misc/test_toml_data.py +++ /dev/null @@ -1,13 +0,0 @@ -import pytest - -from pocketutils.core.toml_data import * - - -class TestTomlData: - def test(self): - t = TomlData({"a": "0", "b": 1, "c": {"c1": 8, "c2": ["abc", "xyz"]}}) - assert list(t.keys()) == ["a", "b", "c"] - - -if __name__ == "__main__": - pytest.main() diff --git a/tox.ini b/tox.ini index 71a487a..67266a1 100644 --- a/tox.ini +++ b/tox.ini @@ -16,11 +16,11 @@ commands = pre-commit run check-json poetry check poetry build - poetry install -v + poetry install --extras all poetry run pytest --cov - poetry run flake8 pocketutils - poetry run flake8 docs - - poetry run flake8 --ignore=D100,D101,D102,D103,D104,S101 tests + - poetry run flake8 --ignore=D100,D101,D102,D103,D104,S101,W503,E203,E225,E301,E302,E501,D200,D205,D400,D403,D409,D410,D411,D212,W391,W293 tests sphinx-build -b html docs docs/html