diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d0c3cbf..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 6247f7e..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css deleted file mode 100644 index d4be59d..0000000 --- a/docs/source/_static/custom.css +++ /dev/null @@ -1,87 +0,0 @@ -@import url("css/theme.css"); - -.modname { - font-size: 0.8em; - opacity: 0.4; -} -.modname::before { - content: '- '; -} -.title { - font-weight: bold; - font-size: 1.2em; - background-color: #eee; - display: block; - padding: 1px 5px; - border-left: 2px solid #ddd; -} - -/*colour of the text in the toc*/ -.wy-menu-vertical header, .wy-menu-vertical p.caption{ - color: #b26d46;; -} - -/*colour of the top left header*/ -.wy-side-nav-search{ - background-color: #31465a; -} - -/*colours of the class definitions*/ -.rst-content dl:not(.docutils) dt{ - background: #e2d7d1; - color: #0b2852; - border-top: solid 3px #31465a; -} - -/*colour of the link in the class defintions*/ -.rst-content .viewcode-link, .rst-content .viewcode-back{ - color: #4b674a; -} - -/*colour of the function definitions*/ -.rst-content dl:not(.docutils) dl dt{ - border-left: solid 3px #31465a; - background: #e2d7d1; - color: #0b2852; -} - -/*colour of the link in the function definitions*/ -.rst-content .viewcode-link, .rst-content .viewcode-back{ - color: #4b674a; -} - -/*edit the width of the body*/ -.wy-nav-content{ - max-width: 1200px; -} - -/*code example blocks*/ -.rst-content pre.literal-block, .rst-content div[class^="highlight"] pre, .rst-content .linenodiv pre{ - background: #b4bec8; - color: black; - /*border-style: solid;*/ - /*border-width: thin;*/ -} - -/*colour of inline code blocks using ``*/ -.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal{ - color: #b26d46; -} - -/* Change code blocks font and bump up font size slightly (normally 12px)*/ -.rst-content pre.literal-block, .rst-content div[class^="highlight"] pre, .rst-content .linenodiv pre { - font-family: 'Inconsolata', monospace !important; - font-size: 14px !important; - white-space: pre-wrap; -} - -/* Change code descriptions and literal blocks (inline code via ``) to match the normal font size being used in the sphinx_RTD_theme text (normally 14px)*/ -.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname, code.docutils { - font-family: 'Inconsolata', monospace !important; - font-size: 14px !important; -} - -/*variables text*/ -dl.class > dd > table.docutils.field-list tbody tr.field-odd.field th.field-name::before{ - content: '(Class Attributes) '; -} diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst deleted file mode 100644 index 3211a29..0000000 --- a/docs/source/changelog.rst +++ /dev/null @@ -1,17 +0,0 @@ -Version history -================ - -1.1 ----- - -- Adding overwrite to ``__header__`` functionality. See the Configuration documentation page on how to configure. - -1.0.2 ------- - -- Minor fixes and documentation updates. - -1.0 --------- - -- Initial release. diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 513c6a7..0000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,95 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) -import panaetius -from panaetius.__version__ import __version__ as version -import sphinx_rtd_theme - -# -- Project information ----------------------------------------------------- - -project = 'panaetius' -copyright = '2019, Daniel Tomlinson' -author = 'Daniel Tomlinson' - -# The full version, including alpha/beta/rc tags -release = version - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.viewcode', - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', -] - -# -- Napoleon Settings ----------------------------------------------------- -napoleon_google_docstring = False -napoleon_numpy_docstring = True -napoleon_include_init_with_doc = True -napoleon_include_private_with_doc = False -napoleon_include_special_with_doc = False -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False -napoleon_use_ivar = True -napoleon_use_param = True -napoleon_use_rtype = True -napoleon_use_keyword = True -autodoc_member_order = 'bysource' - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The master toctree document. -master_doc = 'index' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". - -html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -html_static_path = ['_static'] -html_context = {'css_files': ['_static/custom.css']} -html_theme_options = { - 'collapse_navigation': True, - 'display_version': True, - 'prev_next_buttons_location': 'both', - #'navigation_depth': 3, -} - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# Enable todo -todo_include_todos = True diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst deleted file mode 100644 index 129cba9..0000000 --- a/docs/source/configuration.rst +++ /dev/null @@ -1,68 +0,0 @@ -Configuration -============= - -panaetius is fairly easy to configure. There are just a couple of options to be aware of. - -Manual configuration of ``Config`` instance --------------------------------------------- - -Configuring with a ``__header__.py`` is deprecated. Manually set this value. - -Use the following snippet to configure (in ``__init__.py``): - -.. code-block:: python - - import panaetius - from panaetius.config import Config - - CONFIG = Config(path="~/.config/island-code-extractor", header="island-code-extractor") - - panaetius.set_config(CONFIG, "reddit.secret") - -Access this in your code by importing the ``CONFIG`` instance from your module: - -.. code-block:: python - - from island_code_extractor import CONFIG - from island_code_extractor import panaetius - - CONFIG.reddit_output_path - panaetius.logger.info("Using logger") - -__header__.py -------------- - -You should set a ``__header__.py`` next to your script or module. - -This ``__header__.py`` should contain a ``__header__`` variable that sets the name of your project/script. - -E.g a ``__header__.py`` for the module ``plex_posters`` would look like: - -.. code-block:: python - - __header__ = 'plex_posters' - -Your config file can then be created at ``~/.config/__header__/config.toml``. - -Your environment variables can be created with: - -.. code-block:: bash - - HEADER_FOO = "bar" - HEADER_SUBSECTION_FOO = "bar" - -The headers of the toml file would look like: - -.. code-block:: toml - - [__header__] - foo = bar - - [__header__.subsection] - foo = bar - -If you are writing a script, simply place this ``__header__.py`` along side your script. Panaetius will pick this up when the script is ran. - -If you are writing a module, you can either place the ``__header__.py`` alongside the script that uses your module. If this is not possible, panaetius will set the default ``__header__`` variable to the name of the virtualenv that the script is activated from. - -If neither of the above aren't possible (say your script is running in a lambda on AWS), then ``__header__`` will be set to the default of ``panaetius``. diff --git a/docs/source/global.rst b/docs/source/global.rst deleted file mode 100644 index b117004..0000000 --- a/docs/source/global.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. role:: modname - :class: modname - -.. role:: title - :class: title diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index 176e544..0000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,3 +0,0 @@ -Table of Contents -================= -.. include:: toc.rst diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst deleted file mode 100644 index 86d6c6e..0000000 --- a/docs/source/introduction.rst +++ /dev/null @@ -1,154 +0,0 @@ -Introduction -============= - -.. image:: https://img.shields.io/readthedocs/panaetius?style=for-the-badge :target: https://panaetius.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -.. image:: https://img.shields.io/github/v/tag/dtomlinson91/panaetius?style=for-the-badge :alt: GitHub tag (latest by date) - -.. image:: https://img.shields.io/github/commit-activity/m/dtomlinson91/panaetius?style=for-the-badge :alt: GitHub commit activity - -.. image:: https://img.shields.io/github/issues/dtomlinson91/panaetius?style=for-the-badge :alt: GitHub issues - -.. image:: https://img.shields.io/github/license/dtomlinson91/panaetius?style=for-the-badge :alt: GitHubtbc - -Python module to gracefully handle a .config file/environment variables for scripts, with built in masking for sensitive options. Provides a Splunk friendly formatted logger instance. - -Usage ------- - -Setting a config file -~~~~~~~~~~~~~~~~~~~~~~ - -The main functionality of ``panaetius`` is using a config file to store variables. - -Your ``config.toml`` can be created and found in ``~/.config/__header__/config.toml`` where ``__header__`` is equal to the variable configured/set. `See how to configure`_ this variable in the configuration section of panaetius. - -.. _See how to configure: https://panaetius.readthedocs.io/en/latest/configuration.html#header-py - -Setting values in a config.toml/environment variables -####################################################### - -A ``config.toml`` can be created in the default folder for the module. In this example this would be found in ``~/.config/example_module/config.toml``. - -An example ``config.toml`` could look like: - -.. code-block:: toml - - [example_module] - test = "a6cbf36649b029f3618a0cc1" - - [example_module.logging] - path = "~/.config/example_module" - level = "DEBUG" - - [example_module.foo] - bar = "6b3b96815218960ceaf7cceb" - -These are equivalent to the environment variables: - -.. code-block:: bash - - EXAMPLE_MODULE_TEST - EXAMPLE_MODULE_LOGGING_PATH - EXAMPLE_MODULE_LOGGING_LEVEL - EXAMPLE_MODULE_FOO_BAR - - -.. Attention:: - Environment variables take precedent over the ``config.toml``. If both are set then the environment variable will be used. - -You can overwrite the ``config.toml`` location by setting the environment variable: - -.. code-block:: bash - - DEFAULT_CONFIG_PATH = "~/path/to/config" - - -Setting values in your code -############################ - -Values in a ``config.toml`` or from an environment variable need to be set in your work in order for you to use them. You can do this easily by - -- importing panaetius. -- using the :func:`~panaetius.library.set_config` function. - -E.g your script could contain: - -.. code-block:: python - - import panaetius - panaetius.set_config(panaetius.CONFIG, 'logging.path') - -.. Note:: - - The ``key`` attribute in :func:`~panaetius.library.set_config` is specified as a string, with the hirearchy in the config file split with a ``.`` - -.. Important:: - - The default value for a variable defined using :func:`~panaetius.library.set_config` is ``None``. See the documentation of this function to see all the options available. - - -Accessing values -################# - -You can then access the result of this variable later in your code: - -.. code-block:: python - - panaetius.CONFIG.logging_path - - -Logging -~~~~~~~~ - -In order to save to disk, you need to specify a path for the log file in the config file/environment variable. There is no need to register this with :func:`~panaetius.library.set_config` as ``panaetius`` will do this automatically. - -There are other options available for you to configure a logger. These are (including the default values which can be overwritten): - -.. code-block:: toml - - [example_module.logging] - backup_count = 3 - format = "{\n\t"time": "%(asctime)s",\n\t"file_name": "%(filename)s",' - '\n\t"module": "%(module)s",\n\t"function":"%(funcName)s",\n\t' - '"line_number": "%(lineno)s",\n\t"logging_level":' - '"%(levelname)s",\n\t"message": "%(message)s"\n}" - level = "INFO" # Level should be in CAPS - rotate_bytes = 512000 - -You can use the logger in your code by: - -.. code-block:: python - - panaetius.logger.info('some log message') - -which gives an output of: - -.. code-block:: json - - { - "time": "2020-01-13 23:07:17,913", - "file_name": "test.py", - "module": "test", - "function":"", - "line_number": "33", - "logging_level":"INFO", - "message": "some logging message" - } - - -Importing and using the api -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -See `panaetius api page`_ on how to use and import the module. - -.. _panaetius api page: https://panaetius.readthedocs.io/en/latest/modules/panaetius.html - - -Configuration ---------------- - -See `configuration page`_ on how to configure ``panaetius``. - -.. _configuration page: https://panaetius.readthedocs.io/en/latest/configuration.html diff --git a/docs/source/modules/panaetius.config.rst b/docs/source/modules/panaetius.config.rst deleted file mode 100644 index 285cc5d..0000000 --- a/docs/source/modules/panaetius.config.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.config :modname:`panaetius.config` ---------------------------------------------- - -.. automodule:: panaetius.config - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.config_inst.rst b/docs/source/modules/panaetius.config_inst.rst deleted file mode 100644 index 984af9e..0000000 --- a/docs/source/modules/panaetius.config_inst.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.config_inst :modname:`panaetius.config_inst` --------------------------------------------------------- - -.. automodule:: panaetius.config_inst - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.db.rst b/docs/source/modules/panaetius.db.rst deleted file mode 100644 index 6ef6d90..0000000 --- a/docs/source/modules/panaetius.db.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.db :modname:`panaetius.db` -------------------------------------- - -.. automodule:: panaetius.db - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.header.rst b/docs/source/modules/panaetius.header.rst deleted file mode 100644 index f4bb770..0000000 --- a/docs/source/modules/panaetius.header.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.header :modname:`panaetius.header` ---------------------------------------------- - -.. automodule:: panaetius.header - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.library.rst b/docs/source/modules/panaetius.library.rst deleted file mode 100644 index 7904df0..0000000 --- a/docs/source/modules/panaetius.library.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.library :modname:`panaetius.library` ------------------------------------------------- - -.. automodule:: panaetius.library - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.logging.rst b/docs/source/modules/panaetius.logging.rst deleted file mode 100644 index e284181..0000000 --- a/docs/source/modules/panaetius.logging.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. include:: ../global.rst - -panaetius.logging :modname:`panaetius.logging` ----------------------------------------------- - -.. automodule:: panaetius.logging - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/modules/panaetius.rst b/docs/source/modules/panaetius.rst deleted file mode 100644 index 2506923..0000000 --- a/docs/source/modules/panaetius.rst +++ /dev/null @@ -1,66 +0,0 @@ -.. include:: ../global.rst - -********* -panaetius -********* - -API -=== - -The following is availble by importing the module: - -.. code-block:: python - - import panaetius - - -panaetius.CONFIG ----------------- - -:obj:`panaetius.CONFIG` provides an instance of :class:`panaetius.config.Config` - - -panaetius.set_config() ------------------------ - -Conveniently provides :func:`panaetius.library.set_config` - -Use in your module/script with: - -.. code-block:: python - - panaetius.set_config(panaetius.CONFIG, 'aws.secret_key', str, mask=True) - - -panaetius.CONFIG.aws_secret_key -------------------------------- - -Conveniently provides access to all attributes that have been declared with :func:`panaetius.library.set_config`: - -.. code-block:: python - - my_secret_key = panaetius.CONFIG.aws_secret_key - - -panaetius.logger ------------------ - -:obj:`panaetius.logger` provides a logger instance already formatted with a nice json output. - -.. code-block:: python - - panaetius.logger.info('some logging message') - -This gives a logger output of: - -.. code-block:: json - - { - "time": "2020-01-13 23:07:17,913", - "file_name": "test.py", - "module": "test", - "function":"", - "line_number": "33", - "logging_level":"INFO", - "message": "some logging message" - } diff --git a/docs/source/toc.rst b/docs/source/toc.rst deleted file mode 100644 index f6bea3e..0000000 --- a/docs/source/toc.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. toctree:: - :maxdepth: 1 - :caption: Overview - :titlesonly: - - introduction - configuration - changelog - -.. toctree:: - :maxdepth: 4 - :caption: Modules - :titlesonly: - - modules/panaetius.rst - -.. toctree:: - :maxdepth: 4 - :caption: Submodules - :titlesonly: - - modules/panaetius.config.rst - modules/panaetius.config_inst.rst - modules/panaetius.db.rst - modules/panaetius.header.rst - modules/panaetius.library.rst - modules/panaetius.logging.rst diff --git a/duties.py b/duties.py index 03216d4..26e49a1 100644 --- a/duties.py +++ b/duties.py @@ -101,3 +101,75 @@ def build(ctx): # cleanup shutil.rmtree(extracted_path) + + +@duty +def export(ctx): + """ + Export the dependencies to a requirements.txt file. + + Example: + `duty export` + """ + requirements_content = ctx.run( + [ + "poetry", + "export", + "-f", + "requirements.txt", + "--without-hashes", + ] + ) + requirements_dev_content = ctx.run( + [ + "poetry", + "export", + "-f", + "requirements.txt", + "--without-hashes", + "--dev", + ] + ) + + requirements = pathlib.Path(".") / "requirements.txt" + requirements_dev = pathlib.Path(".") / "requirements_dev.txt" + + with requirements.open("w", encoding="utf-8") as req: + req.write(requirements_content) + + with requirements_dev.open("w", encoding="utf-8") as req: + req.write(requirements_dev_content) + + +@duty +def publish(ctx, password:str): + """ + Publish the package to pypi.org. + + Args: + password (str): pypi.org password. + + Example: + `duty publish password=$my_password` + """ + dist_dir = pathlib.Path(".") / "dist" + rm_result = rm_tree(dist_dir) + print(rm_result) + + publish_result = ctx.run(["poetry", "publish", "-u", "dtomlinson", "-p", password, "--build"]) + print(publish_result) + + +def rm_tree(directory: pathlib.Path): + """ + Recursively delete a directory and all its contents. + + Args: + directory (pathlib.Path): The directory to delete. + """ + for child in directory.glob('*'): + if child.is_file(): + child.unlink() + else: + rm_tree(child) + directory.rmdir() diff --git a/panaetius/_version.py b/panaetius/_version.py index 8a6fc0a..42dd00f 100644 --- a/panaetius/_version.py +++ b/panaetius/_version.py @@ -1,3 +1,3 @@ """Module containing the version of panaetius.""" -__version__ = "2.3.1" +__version__ = "2.3.2" diff --git a/pyproject.toml b/pyproject.toml index aea3687..926a01f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,10 @@ [tool.poetry] name = "panaetius" -version = "2.3.1" +version = "2.3.2" description = "Python module to gracefully handle a .config file/environment variables for scripts, with built in masking for sensitive options. Provides a Splunk friendly formatted logger instance." license = "MIT" authors = ["dtomlinson "] -readme = "./README.rst" +readme = "./README.md" homepage = "https://github.com/dtomlinson91/panaetius" repository = "https://github.com/dtomlinson91/panaetius" documentation = "https://panaetius.readthedocs.io/en/latest/introduction.html" diff --git a/requirements.txt b/requirements.txt index fb60879..c7fa3e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,2 @@ -pylite==0.1.0 \ - --hash=sha256:e338d20d3f8f72dd84d1e58f2fd6dba008d593e0cfacfb5fbdd5a297b830628e \ - --hash=sha256:eb46f5beb1f2102672fd4355c013ac2feebc0df284d65f7711f2041a0a410141 -toml==0.10.0 \ - --hash=sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c \ - --hash=sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e \ - --hash=sha256:f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3 +pyyaml==6.0; python_version >= "3.6" +toml==0.10.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..421e659 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,60 @@ +ansimarkup==1.5.0; python_version >= "3.6" +astroid==2.8.2; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.1" +atomicwrites==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") +attrs==21.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +bandit==1.7.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.5" +cached-property==1.5.2; python_version < "3.8" and python_version >= "3.6" +colorama==0.4.4; sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.6.1" and python_version < "4.0" and platform_system == "Windows" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") +coverage==6.0.2; python_version >= "3.6" +dodgy==0.2.1; python_full_version >= "3.6.1" and python_version < "4.0" +duty==0.7.0; python_version >= "3.6" +execnet==1.9.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +failprint==0.8.0; python_version >= "3.6" +flake8-polyfill==1.0.2; python_full_version >= "3.6.1" and python_version < "4.0" +flake8==2.3.0; python_full_version >= "3.6.1" and python_version < "4.0" +gitdb==4.0.7; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.7" +gitpython==3.1.24; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.7" +importlib-metadata==4.8.1; python_version < "3.8" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") and python_full_version >= "3.6.1" +iniconfig==1.1.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +isort==5.9.3; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +jinja2==3.0.3; python_version >= "3.6" +lazy-object-proxy==1.6.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.1" +markupsafe==2.0.1; python_version >= "3.6" +mccabe==0.6.1; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +mypy-extensions==0.4.3; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.5" +mypy==0.910; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.5" +packaging==21.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +pbr==5.6.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +pep8-naming==0.10.0; python_full_version >= "3.6.1" and python_version < "4.0" +pep8==1.7.1; python_full_version >= "3.6.1" and python_version < "4.0" +platformdirs==2.4.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.1" +pluggy==1.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +prospector==1.5.1; python_full_version >= "3.6.1" and python_version < "4.0" +ptyprocess==0.7.0; sys_platform != "win32" and python_version >= "3.6" +py==1.10.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pycodestyle==2.8.0; python_full_version >= "3.6.1" and python_version < "4.0" +pydocstyle==6.1.1; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +pyflakes==2.3.1; python_full_version >= "3.6.1" and python_version < "4.0" +pylint-celery==0.3; python_full_version >= "3.6.1" and python_version < "4.0" +pylint-django==2.4.4; python_full_version >= "3.6.1" and python_version < "4.0" +pylint-flask==0.6; python_full_version >= "3.6.1" and python_version < "4.0" +pylint-plugin-utils==0.6; python_full_version >= "3.6.1" and python_version < "4.0" +pylint==2.11.1; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.1" +pyparsing==2.4.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" +pytest-datadir==1.3.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") +pytest-forked==1.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pytest-xdist==2.4.0; python_version >= "3.6" +pytest==6.2.5; python_version >= "3.6" +pyyaml==6.0; python_version >= "3.6" +requirements-detector==0.7; python_full_version >= "3.6.1" and python_version < "4.0" +setoptconf-tmp==0.3.1; python_full_version >= "3.6.1" and python_version < "4.0" +six==1.16.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.5" +smmap==4.0.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.7" +snowballstemmer==2.1.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +stevedore==3.4.0; python_full_version >= "3.6.1" and python_version < "4.0" and python_version >= "3.6" +toml==0.10.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") +typed-ast==1.4.3; python_full_version >= "3.6.1" and python_version < "3.8" and python_version >= "3.6" and implementation_name == "cpython" +types-toml==0.10.1 +typing-extensions==3.10.0.2; python_full_version >= "3.6.1" and python_version < "3.8" and python_version >= "3.7" +wrapt==1.12.1; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.1" +zipp==3.6.0; python_version < "3.8" and python_version >= "3.6" diff --git a/rewrite.todo b/rewrite.todo deleted file mode 100644 index 7fe7bb4..0000000 --- a/rewrite.todo +++ /dev/null @@ -1,56 +0,0 @@ -Testing: - To Write: - ☐ Document coverage commands - `coverage run --source=./panaetius -m pytest` - `coverage report` & `coverage html` > gives ./htmlcov/index.html -Documentation: - ☐ Rewrite documentation using `mkdocs` and using `.md`. - ☐ Update the metadata in the `pyproject.toml`. - ☐ Create a new `Readme.md` and remove the `.rst`. - ☐ Document the logging strategy - CLI tools should use `logger.critical` and raise SystemExit(1) - Libraries should raise custom errors and have a `logger.critical(exec_info=1)` -Typing: - ☐ Go over typing, make sure what's passed in are generics where possible. -Docstrings: - ☐ Update class docstrings so attributes are in class. -Misc: - ☐ Use the python runner to build the docs & run the tests (including coverage html) - coverage run -m pytest && coverage report && coverage html - ☐ document this in trilium - -Archive: - ✔ Test the Config file skipping header with `skip_header_init` @done(21-10-25 23:34) @project(Testing.To Write) - ✔ Document for abstract methods should raise NotImplementedError @done(21-10-25 23:39) @project(Testing.To Write) - ✔ Document https://stackoverflow.com/a/9212387 @done(21-10-25 23:40) @project(Testing.To Write) - ✘ Bump the version to release 2.0 @cancelled(21-10-23 05:36) @project(Misc) - ✔ Handle if a bool is passed in as a default @done(21-10-16 05:25) @project(Coding.No Config File) - ✔ Handle if a bool is passed in as a default @done(21-10-16 05:25) @project(Coding.Config File) - ✔ Create SimpleLogger, AdvancedLogger, CustomLogger classes @done(21-10-16 16:22) @project(Coding.Logging) - ✔ Logging path should take by default the config path unless overwritten? @done(21-10-16 23:49) @project(Coding.Logging) - ✔ Check logging path + config path are valid, if not raise error. @done(21-10-18 00:04) @project(Coding.Errors) - ✔ Add tests for these. @done(21-10-18 00:04) @project(Coding.Errors) - ✔ Check for a key > 2 levels, raise custom error, write test @done(21-10-17 23:30) @project(Coding.Errors) - ✔ Check all functions and annotations. @done(21-10-18 01:07) @project(Coding.Linting) - ✔ Write the docstrings for public functions/methods. @done(21-10-18 02:29) @project(Coding.Docstrings) - ✔ When both a config file and a env var is found, use the env var. @done(21-10-18 00:38) @project(Coding.Functionality) - ✔ If loading from a default, don't covert to TOML @done(21-10-17 20:33) @project(Tests.Bugfixes) - ✔ Env Vars should be given as python objects @done(21-10-17 20:33) @project(Tests.Bugfixes) - The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None. - use ast.literal_eval() - https://docs.python.org/3/library/ast.html#ast.literal_eval - ✔ Test default config path set to "~/.config" @done(21-10-17 17:25) @project(Tests.__init__) - ✔ Test config path is set when passed in @done(21-10-17 17:25) @project(Tests.__init__) - ✔ Check testing config file is returned as dict @done(21-10-17 17:25) @project(Tests.config property) - ✔ Check _self.missing_config and empty dict is returned @done(21-10-17 17:25) @project(Tests.config property) - ✔ Arrays & tables loaded correctly from config file @done(21-10-17 20:34) @project(Tests.get_value.config_file) - ✔ test when key length is 1 the value is returned @done(21-10-17 18:55) @project(Tests.get_value.config_file) - ✔ test when key length is 2 the value is returned @done(21-10-17 18:55) @project(Tests.get_value.config_file) - ✔ test when key not found and no env var default is loaded @done(21-10-17 19:01) @project(Tests.get_value.config_file) - ✔ test bool's are properly converted @done(21-10-17 19:01) @project(Tests.get_value.config_file) - ✔ test when key not found and env var is set value is loaded @done(21-10-17 20:43) @project(Tests.get_value.config_file) - ✔ check if env key is missing the default is read in @done(21-10-17 20:55) @project(Tests.get_value.env_var) - ✔ check if env key is present the values are read in @done(21-10-17 22:24) @project(Tests.get_value.env_var) - ✔ parametrise a test to read in values form env vars and they're set correctly @done(21-10-17 22:24) @project(Tests.get_value.env_var) - ✔ test that the env var is valid python @done(21-10-18 01:03) @project(Tests.get_value.env_var) - ✔ test set_config works @done(21-10-17 23:29) @project(Tests.library) diff --git a/setup.py b/setup.py index 84ac77c..acec652 100644 --- a/setup.py +++ b/setup.py @@ -12,9 +12,9 @@ install_requires = \ setup_kwargs = { 'name': 'panaetius', - 'version': '2.2.2', + 'version': '2.3.1', 'description': 'Python module to gracefully handle a .config file/environment variables for scripts, with built in masking for sensitive options. Provides a Splunk friendly formatted logger instance.', - 'long_description': 'Author\n=======\n\nDaniel Tomlinson (dtomlinson@panaetius.co.uk)\n\nRequires\n=========\n\n`>= python3.7`\n\nPython requirements\n====================\n\n- toml = "^0.10.0"\n- pylite = "^0.1.0"\n\nDocumentation\n==============\n\nRead the documentation on `read the docs`_.\n\n.. _read the docs: https://panaetius.readthedocs.io/en/latest/introduction.html\n\nInstallation\n==============\n\nYou can install ``panaetius`` the following ways:\n\nPython\n-------\n\n.. Attention:: You should install in a python virtual environment\n\nFrom pypi using pip\n~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n pip install panaetius\n\nFrom local wheel\n~~~~~~~~~~~~~~~~~\n\nDownload the latest verion from the `releases`_ page.\n\n.. _releases: https://github.com/dtomlinson91/panaetius/releases\n\nInstall with pip:\n\n.. code-block:: bash\n\n pip install -U panaetius-1.0.2-py3-none-any.whl\n\n\nFrom source\n~~~~~~~~~~~~\n\nClone the repo and install using ``setup.py``:\n\n.. code-block:: bash\n\n python setup.py\n', + 'long_description': '# Panaetius\n\nThis package provides:\n\n- Functionality to read user variables from a `config.yml` or environment variables.\n- A convenient default logging formatter printing `json` that can save to disk and rotate.\n- Utility functions.\n\n## Config\n\n### options\n\n#### skip_header_init\n\nIf `skip_header_init=True` then the `config_path` will not use the `header_variable` as the\nsub-directory in the `config_path`.\n\nE.g\n\n`CONFIG = panaetius.Config("tembo", "~/tembo/.config", skip_header_init=True)`\n\nWill look in `~/tembo/config/config.yml`.\n\nIf `skip_header_init=False` then would look in `~/tembo/config/tembo/config.yml`.\n\n### Module\n\nConvenient to place in a package/sub-package `__init__.py`.\n\nSee Tembo for an example: \n\nExample snippet to use in a module:\n\n```python\nimport os\n\nimport panaetius\nfrom panaetius.exceptions import LoggingDirectoryDoesNotExistException\n\n\nif (config_path := os.environ.get("TEMBO_CONFIG")) is not None:\n CONFIG = panaetius.Config("tembo", config_path, skip_header_init=True)\nelse:\n CONFIG = panaetius.Config("tembo", "~/tembo/.config", skip_header_init=True)\n\n\npanaetius.set_config(CONFIG, "base_path", "~/tembo")\npanaetius.set_config(CONFIG, "template_path", "~/tembo/.templates")\npanaetius.set_config(CONFIG, "scopes", {})\npanaetius.set_config(CONFIG, "logging.level", "DEBUG")\npanaetius.set_config(CONFIG, "logging.path")\n\ntry:\n logger = panaetius.set_logger(\n CONFIG, panaetius.SimpleLogger(logging_level=CONFIG.logging_level)\n )\nexcept LoggingDirectoryDoesNotExistException:\n _LOGGING_PATH = CONFIG.logging_path\n CONFIG.logging_path = ""\n logger = panaetius.set_logger(\n CONFIG, panaetius.SimpleLogger(logging_level=CONFIG.logging_level)\n )\n logger.warning("Logging directory %s does not exist", _LOGGING_PATH)\n\n```\n\nThis means in `./tembo/cli/cli.py` you can\n\n```python\nimport tembo.cli\n\n# access the CONFIG instance + variables from the config.yml\ntembo.cli.CONFIG\n```\n\n\n## Utility Functions\n\n### Squasher\n\nSquashes a json object or Python dictionary into a single level dictionary.\n', 'author': 'dtomlinson', 'author_email': 'dtomlinson@panaetius.co.uk', 'maintainer': None,