Skip to main content

makes shitty data more fit (a smarter serializer)

Project description

MorPhit

Usage

    >>> from morphit import Parser
    >>> Parser([], '[1,2,3]')
    [1, 2, 3]

pip install morphit

sudo -H pip install morphit

morphit is a no nonsense parser that takes a template for data and converts whatever you feed it into whatever you want it to be.

Do you have "My data is fucked"? If you find yourself saying any of the following, you may to be entitled to financial compensation.

  • WTF half of these are strings instead of insert type here
  • How do I even convert from insert type A to insert type B
  • I have so much bad data I'm going to have to manually fix
  • I have hundreds of if conditions to fix weird data
  • How the hell am I supposed to fix the type of all these nested objects
  • You're telling me this float is supposed to be a date?...
  • You're telling me that I cant put a datetime object anywhere?
  • I don't know how any of these strings became numbers but...

Features

  • Processor chaining
>>> Processor.flow(["<parser|lambda|func|obj>",...])

>>> p = Processor(dict)
>>> p.then(lambda d: d['date'])
     .then(Processor.types['Date'])
>>> res = p('{"date": "2018-01-31T06:17:45.547"}')

datetime(2018, 1, 31, 6, 17, 45, 547000)
  • datetime serialization
>>> from datetime import date
>>> Parser(str, datetime(2018, 1, 31, 6, 17, 45, 547000))
"2018-01-31T06:17:45.547"
  • deep serialization of dicts
  • supports custom serializers using methods/lambda functions
  • templated parsers
  • nested templated parsers

Supported Conversions

  • any -> list
  • any -> object
  • any -> tuple
  • any -> type
  • any -> str
  • dict -> str[json]
  • dict -> dict
  • dict -> list
  • dict -> tuple
  • datetime -> str
  • datetime -> str[json]
  • datetime -> int
  • datetime -> float
  • datetime.time -> str
  • datetime.date -> str
  • float -> str
  • float -> float
  • float -> list
  • float -> tuple
  • float -> type
  • float -> datetime
  • int -> str
  • int -> int
  • int -> list
  • int -> tuple
  • int -> datetime
  • int -> type
  • list -> str[json]
  • list -> list
  • list -> tuple
  • tuple -> str[json[list]]
  • tuple -> list
  • tuple -> tuple
  • none -> str
  • none -> bool
  • none -> list
  • none -> tuple
  • str -> bool
  • str -> datetime
  • str -> dict
  • str -> list
  • str -> tuple
  • str[int] -> float
  • str[int] -> int
  • str[float] -> float
  • str[float] -> int
  • str -> type
  • str[iso8601] -> datetime
  • str[iso8601] -> float
  • str[unicode] -> any string conversions
  • str[python] -> any string conversions

iso8601 a date string formatted to the iso8601 spec json a json encoded equivilent of the data unicode strings that get messed up with u' ex: "[u'this',u'that']" python strings that are weirdly single quoted ex: "['photo', 2, 'pic', 'pics']"

Installation

pip3 install morphit

sudo -H pip3 install morphit

Deploy

python3 setup.py build       #Build:
python setup.py coverage         #Test
python3 setup.py install     #Install:

Deploy

  • Run tests as outlined above
  • Make sure you bump the version
  • Check venv is active
echo "__version__=1.x.y" > ./morphit/version.py # where x and y are the next version
python3 setup.py coverage & python3 setup.py sdist bdist_wheel & twine upload dist/*

Development

virtualenv --python=python3 venv
source ./venv/bin/activate
python setup.py easy_install
pip install -r requirements-dev.txt

Roadmap

  • Custom exceptions for bad casting (int/list/tuple -> dict)
  • Add strict parameter that enables enforcement of keys and list/tuple length
  • Add default parameter that remplaces None or non existing values with a specified default
  • Add fallback parameter that accepts a value or a lambda function to replace the value

CHANGELOG

1.1.0

Breaking changes: removed Template class, types are now attached to Processor

  • FIX: 100% test coverage, all dead code eliminated
  • FIX: primitive to iterable casting
  • FEATURE: Removed & Replaced Template with Processor callable class
  • FEATURE: Added processor chaining then flow
  • FEATURE: Added lambda Processor original data & result parameters

BUGS

Contributing

Read CONTRIBUTING_.

Make a PR and I'll give it a look

Odds are good / the goods are odd

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

morphit-1.1.0.tar.gz (6.2 kB view details)

Uploaded Source

Built Distribution

morphit-1.1.0-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file morphit-1.1.0.tar.gz.

File metadata

  • Download URL: morphit-1.1.0.tar.gz
  • Upload date:
  • Size: 6.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.22.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.5

File hashes

Hashes for morphit-1.1.0.tar.gz
Algorithm Hash digest
SHA256 327e3e8e0405e31b379cf1b2840b026efa313dc0605a6dc902a8b9c4a8118d66
MD5 371cb7b6644cf52cc9164ae05b4c3a6e
BLAKE2b-256 1b6edf2682bbd2f8135fcaad8c8f7f6dc8853bd57823ad4d9049ce1e67f13a4a

See more details on using hashes here.

Provenance

File details

Details for the file morphit-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: morphit-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 6.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.22.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.5

File hashes

Hashes for morphit-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9e33bd053b76d2c801dbbdb56a1a7784e32baf58e4dfac09062cd8a620a0bee6
MD5 4a6f1d7f36c0b2a277dea2a793d901db
BLAKE2b-256 4861f3e41e84d21204e885640612774d0f7fa5a11d1eb76fbea5758aa069a514

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page