Metadata-Version: 2.0
Name: table-enforcer
Version: 0.3.0
Summary: ORM-like package for defining, loading, and validating table schemas in pandas.
Home-page: https://github.com/xguse/table_enforcer
Author: Gus Dunn
Author-email: w.gus.dunn@gmail.com
License: MIT license
Description-Content-Type: UNKNOWN
Keywords: table_enforcer
Platform: UNKNOWN
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Requires-Dist: munch
Requires-Dist: logzero
Requires-Dist: python-box
Requires-Dist: xlrd
Requires-Dist: numpy
Requires-Dist: pandas
Requires-Dist: numexpr
Requires-Dist: xlwt

==============
Table Enforcer
==============


.. image:: https://img.shields.io/pypi/v/table_enforcer.svg
        :target: https://pypi.python.org/pypi/table_enforcer

.. image:: https://img.shields.io/travis/xguse/table_enforcer.svg
        :target: https://travis-ci.org/xguse/table_enforcer

.. image:: https://readthedocs.org/projects/table-enforcer/badge/?version=latest
        :target: https://table-enforcer.readthedocs.io/en/latest/?badge=latest
        :alt: Documentation Status

..        .. image:: https://pyup.io/repos/github/xguse/table_enforcer/shield.svg
        :target: https://pyup.io/repos/github/xguse/table_enforcer/
        :alt: Updates

Demo Usage
----------

Have a look at this `Demo Notebook <https://nbviewer.jupyter.org/github/xguse/table_enforcer/blob/master/docs/demo_notebook/Usage_Demo.ipynb>`_

Description
-----------

A python package to facilitate the iterative process of developing and using schema-like representations of DataFrames in pandas for recoding and validating instances of these data.

This is a very young attempt at solving a recurrent problem many people have.  So far I have looked at multiple solutions, but none really did it for me.

I need to load, recode, and validate tables all day everyday. Sometimes its simple; you can ``pandas.read_table()`` and all is good. But sometimes you have a 400 column long RedCap data dump that is complicated `af` and you need to develop your recoding logic through an iterative process.

This is an attempt to apply a sort of "test driven development" approach to data cleaning.


Basic Workflow
--------------

#. For each column that you care about in your source table:

        #. Define a ``Column`` object that represents the ideal state of your data by passing a list of small, independent, reusable validator functions and some descriptive information.

        #. Use this object to validate the column data from your source table.

                * It WILL fail.

        #. Add small, composable, reusable recoding functions to the column object and iterate until your validations pass.

#. Define an ``Enforcer`` object by passing it a list of your column representation objects.

#. This enforcer can be used to recode or validate recoded tables of the same kind as your source table wherever your applications use that type of data.


.. note:: Soon, I want to add more kinds of ``Column`` objects that implement one-to-many and many-to-one recoding logic as sometimes a column tries to do too much and should really be multiple columns as well as the reverse.


Please take a look and offer thoughts/advice.

* Free software: MIT license
* Web site: https://github.com/xguse/table_enforcer
* Documentation: https://table-enforcer.readthedocs.io.


Features
--------

  * ``Enforcer`` and ``Column`` classes to define what columns should look like in a table.
  * Small but growing cadre of built-in validator functions and decorators.
  * Decorators for use in defining parameterized validators like ``between_4_and_60()``.
  * Declaration syntax for ``Enforcer`` is loosely based on SqlAlchemy's `Table <http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table>`_ pattern.



Credits
---------

This package was created with Cookiecutter_ and the `xguse/cookiecutter-pypackage`_ project template which is based on `audreyr/cookiecutter-pypackage`_.

.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage
.. _`xguse/cookiecutter-pypackage`: https://github.com/xguse/cookiecutter-pypackage


*******
History
*******

v0.3.0 / 2018-02-07
===================

  * main_classes: OTMColumn is functional
  * updated testing for OTMColumn
  * main_classes: replace Munch w/ Box (probationary)
  * add python-box to reqs (probationary)
  * conftest: modularize paths
  * add testing for OTMColumn
  * test_column: fix typos and style
  * import all from main_classes
  * Bump version: 0.1.5 → 0.2.0
  * changelog(v0.2.0)
  * Updated Docs version Usage_Demo.ipynb

v0.2.0 / 2018-02-02
===================

  * Enforcer.recode lets Column.recode do the validation now
  * Enforcer.validate no longer recodes
  * Enforcer: make_validations now private
  * Column: added find_failed_rows()
  * columns now take series not dataframe
  * added system-lvl tests based on Usage_Demo.ipynb
  * Enforcer.recode create new df rather than copy
  * added RecoderError and focused ValidationError
  * remove testing for 3.5
  * dont lint tests
  * ignore flake8:W292
  * formatting

v0.1.5 / 2018-02-01
===================

  * Added tests for imports and more Class behavior
  * main_classes: calling recode with validate is now prefered

v0.1.4 / 2018-01-26
===================

  * main_classes.py: removed faulty imports

v0.1.3 / 2018-01-26
===================

  * corrected Usage_Demo.ipynb
  * formatting and typing
  * table_enforcer.py -> main_classes.py

v0.1.2 / 2017-11-17
===================

  * flake8
  * set up basic testing
  * changed travis build settings
  * updated usage demo and readme

v0.1.1 / 2017-11-16
===================

  * Added usage notebook link to docs.
  * reorganized import strategy of Enforcer/Column objs
  * added more builtin validators/recoders/decorators
  * updated reqs
  * initialized travis integration
  * updated docs
  * Added usage demo notebook for docs
  * updated ignore patterns
  * validators.py: renamed

v0.1.0 / 2017-11-15
===================

  * first minimally functional package
  * Enforcer and Column classes defined and operational
  * small cadre of built-in validator functions and decorators
  * ignore jupyter stuff
  * linter setups

v0.0.1 / 2017-11-14
===================

* First commit


