Metadata-Version: 2.0
Name: owlmixin
Version: 2.0.0a11
Summary: Mixin which converts ``data class instance`` and others each other more simple.
Home-page: https://github.com/tadashi-aikawa/owlmixin.git
Author: tadashi-aikawa
Author-email: syou.maman@gmail.com
License: MIT
Keywords: data class mixin instance dict json yaml csv convert parse each other functional
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Utilities
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.6
Requires-Dist: pyyaml
Provides-Extra: test
Requires-Dist: mock; extra == 'test'
Requires-Dist: pytest; extra == 'test'
Requires-Dist: pytest-cov; extra == 'test'

========
OwlMixin
========

|pypi| |docslatest| |travis| |coverage| |complexity| |versions| |license|

Mixin which converts ``data class instance`` and others each other more simple.

.. warning::

    `OwlMixin >= 2.0.0` support python 3.6 and upper only, and has many breaking changes since `OwlMixin` < 2.0.0


Motivation
==========

Have you ever wanted to write robust code in Python? This library will make such your wishes come true.

Define your data class which is extend OwlMixin, you can use some useful methods which help your codes robust.
See following ``Example`` and ``API Reference`` sections.


Installation
============

.. code-block:: bash

    pip install owlmixin


Example
=======

.. code-block:: python

    from owlmixin import OwlMixin
    from owlmixin.owlenum import OwlEnum
    from owlmixin.owloption import TOption
    from owlmixin.owlcollections import TList

    class Color(OwlEnum):
        RED = "red"
        GREEN = "green"
        BLUE = "blue"

    class Food(OwlMixin):
        id: int
        name: str
        color: TOption[Color]

    class Human(OwlMixin):
        id: int
        name: str
        favorite: TList[Food]

    jiro = Human.from_dict({
        "id": 10,
        "name": "jiro",
        "favorite": [
            {"id": 1, "name": "apple"},
            {"id": 2, "name": "orange", "color": "green"}
        ]
    })

    >>> jiro.id
    10
    >>> jiro.name
    'jiro'

    >>> print(jiro.to_dict())
    {'id': 10, 'name': 'jiro', 'favorite': [{'id': 1, 'name': 'apple'}, {'id': 2, 'name': 'orange', 'color': 'green'}]}

    >>> print(jiro.favorite[0].to_pretty_json())
    {
        "id": 1,
        "name": "apple"
    }

    >>> print(jiro.to_yaml())
    favorite:
      - id: 1
        name: apple
      - color: green
        id: 2
        name: orange
    id: 10
    name: jiro

    >>> print(jiro.favorite.to_csv(['id', 'name', 'color'], with_header=True))
    id,name,color
    1,apple,
    2,orange,green


You can also use methods chains as following.

.. note::

    Below sample code uses `kachayev/fn.py <https://github.com/kachayev/fn.py>`_, great package!!


.. code-block:: python

    >>> from owlmixin.owloption import TOption
    >>> from owlmixin.owlcollections import TList
    >>>
    >>> from fn import _
    >>>
    >>>
    >>> class Repository(OwlMixin):
    ...     id: int
    ...     name: str
    ...     description: TOption[str]
    ...     stargazers_count: int
    ...
    >>>
    >>> class GithubRepository(OwlMixin):
    ...     total_count: int
    ...     incomplete_results: bool
    ...     items: TList[Repository]
    ...
    >>>
    >>> print(
    ...     GithubRepository \
    ...         .from_json_url("https://api.github.com/search/repositories?q=git") \
    ...         .items \
    ...         .filter(_.stargazers_count > 100) \
    ...         .order_by(_.stargazers_count, True) \
    ...         .head(5) \
    ...         .emap(lambda v, i: {
    ...             'RANK': i+1,
    ...             'STAR': v.stargazers_count,
    ...             'NAME': v.name,
    ...             'DESCRIPTION': v.description
    ...         }) \
    ...         .to_csv(fieldnames=["RANK", "STAR", "NAME", "DESCRIPTION"], with_header=True)
    ... )

    RANK,STAR,NAME,DESCRIPTION
    1,50787,gitignore,A collection of useful .gitignore templates
    2,19308,gogs,Gogs is a painless self-hosted Git service.
    3,17750,git,Git Source Code Mirror - This is a publish-only repository and all pull requests are ignored. Please follow Documentation/SubmittingPatches procedure for any of your improvements.
    4,10744,hub,hub helps you win at git.
    5,10338,tips,Most commonly used git tips and tricks.

Don't you think smart?


API Reference
=============

* |docslatest| for master
* |docs| for current stable version


.. |travis| image:: https://api.travis-ci.org/tadashi-aikawa/owlmixin.svg?branch=master
    :target: https://travis-ci.org/tadashi-aikawa/owlmixin/builds
    :alt: Build Status
.. |coverage| image:: https://codeclimate.com/github/tadashi-aikawa/owlmixin/badges/coverage.svg
    :target: https://codeclimate.com/github/tadashi-aikawa/owlmixin/coverage
    :alt: Test Coverage
.. |complexity| image:: https://codeclimate.com/github/tadashi-aikawa/owlmixin/badges/gpa.svg
    :target: https://codeclimate.com/github/tadashi-aikawa/owlmixin
    :alt: Code Climate
.. |pypi| image::   https://img.shields.io/pypi/v/owlmixin.svg
.. |docs| image:: https://readthedocs.org/projects/owlmixin/badge/?version=stable
    :target: http://owlmixin.readthedocs.io/en/stable/
    :alt: Documentation Status
.. |docslatest| image:: https://readthedocs.org/projects/owlmixin/badge/?version=latest
    :target: http://owlmixin.readthedocs.io/en/latest/
    :alt: Documentation Status
.. |versions| image:: https://img.shields.io/pypi/pyversions/owlmixin.svg
.. |license| image:: https://img.shields.io/github/license/mashape/apistatus.svg


