Metadata-Version: 1.1
Name: mongoengine-goodjson
Version: 1.1.2
Summary: More human readable JSON serializer/de-serializer for MongoEngine
Home-page: https://github.com/hiroaki-yamamoto/mongoengine-goodjson
Author: Hiroaki Yamamoto
Author-email: hiroaki@hysoftware.net
License: MIT
Description: More human readable JSON serializer/de-serializer for MongoEngine
        =================================================================
        
        |Build Status| |Coverage Status| |Maintainability| |PyPI version|
        |Documentation Status Image|
        
        What This?
        ----------
        
        This script has MongoEngine Document json serialization more-natural.
        
        Why this invented?
        ------------------
        
        Using MongoEngine to create something (e.g. RESTful API), sometimes you
        might want to serialize the data from the db into JSON, but some fields
        are weird and not suitable for frontend/api:
        
        .. code:: JSON
        
            {
              "_id": {
                "$oid": "5700c32a1cbd5856815051ce"
              },
              "name": "Hiroaki Yamamoto",
              "registered_date": {
                  "$date": 1459667811724
              }
            }
        
        The points are 2 points:
        
        -  ``_id`` might not be wanted because jslint disagrees ``_`` character
           unless declaring ``jslint nomen:true``
        -  There are sub-fields such ``$oid`` and ``$date``. These fields are
           known as `MongoDB Extended
           JSON <https://docs.mongodb.org/manual/reference/mongodb-extended-json/>`__.
           However, considering MongoEngine is ODM and therefore it has
           schema-definition methods, the fields shouldn't have the special
           fields. In particular problems, you might get
           ``No such property $oid of undefined`` error when you handle above
           generated data on frontend.
        
        To solve the problems, the generated data should be like this:
        
        .. code:: JSON
        
            {
              "id": "5700c32a1cbd5856815051ce",
              "name": "Hiroaki Yamamoto",
              "registered_date": 1459667811724
            }
        
        Making above structure can be possible by doing re-mapping, but if we do
        it on `API's controller
        object <https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html>`__,
        the code might get super-dirty:
        
        .. code:: Python
        
            """Dirty code."""
            import mongoengine as db
        
        
            class User(db.Document):
              """User class."""
              name = db.StringField(required=True, unique=True)
              registered_date = db.DateTimeField()
        
        
            def get_user(self):
              """Get user."""
              models = [
                {
                  ("id" if key == "_id" else key): (
                    value.pop("$oid") if "$oid" in value and isinstance(value, dict)
                    else value.pop("$date") if "$date" in value and isinstance(value, dict)
                    else value  #What if there are the special fields in child dict?
                  )
                  for (key, value) in doc.items()
                } for doc in User.objects(pk=ObjectId("5700c32a1cbd5856815051ce"))
              ]
              return json.dumps(models, indent=2)
        
        To give the solution of this problem, I developed this scirpt. By using
        this script, you will not need to make the transform like above. i.e.
        
        .. code:: Python
        
        
            """A little-bit clean code."""
        
            import mongoengine as db
            import mongoengine_goodjson as gj
        
        
            class User(gj.Document):
              """User class."""
              name = db.StringField(required=True, unique=True)
              registered_date = db.DateTimeField()
        
        
            def get_user(self):
              """Get user."""
              return model_cls.objects(
                pk=ObjectId("5700c32a1cbd5856815051ce")
              ).to_json(indent=2)
        
        How to use it
        -------------
        
        Generally you can define the document as usual, but you might want to
        inherits ``mongoengnie_goodjson.Document`` or
        ``mongoengnie_goodjson.EmbeddedDocument``.
        
        Here is the example:
        
        .. code:: Python
        
            """Example schema."""
        
            import mongoengine_goodjson as gj
            import mongoengine as db
        
        
            class Address(gj.EmbeddedDocument):
                """Address schema."""
        
                street = db.StringField()
                city = db.StringField()
                state = db.StringField()
        
        
            class User(gj.Document):
                """User data schema."""
        
                name = db.StringField()
                email = db.EmailField()
                address = db.EmbeddedDocumentListField(Address)
        
        More details... there's the doc!
        --------------------------------
        
        If you want to know more, there's `read the
        doc <https://mongoengine-goodjson.readthedocs.io/>`__ that you want to
        read. You can now `read the
        doc <https://mongoengine-goodjson.readthedocs.io/>`__ with drinking a
        cup of coffee!!
        
        Contribute
        ----------
        
        This scirpt is coded on TDD. i.e. Writing a test that fails, and then
        write the actual code to pass the test. Therefore, ``virtualenv``,
        ``nose`` and ``tox`` will be needed to code this script (however, using
        ``detox`` instead of tox might be more effective.). Please `read the
        doc <https://mongoengine-goodjson.readthedocs.io/>`__ for the detail.
        
        License (MIT License)
        ---------------------
        
        See `LICENSE.md <LICENSE.md>`__
        
        .. |Build Status| image:: https://travis-ci.org/hiroaki-yamamoto/mongoengine-goodjson.svg?branch=master
           :target: https://travis-ci.org/hiroaki-yamamoto/mongoengine-goodjson
        .. |Coverage Status| image:: https://coveralls.io/repos/github/hiroaki-yamamoto/mongoengine-goodjson/badge.svg?branch=master
           :target: https://coveralls.io/github/hiroaki-yamamoto/mongoengine-goodjson?branch=master
        .. |Maintainability| image:: https://api.codeclimate.com/v1/badges/7efc2a1bb3040cda0d4f/maintainability
           :target: https://codeclimate.com/github/hiroaki-yamamoto/mongoengine-goodjson/maintainability
        .. |PyPI version| image:: https://badge.fury.io/py/mongoengine_goodjson.svg
           :target: https://badge.fury.io/py/mongoengine_goodjson
        .. |Documentation Status Image| image:: https://readthedocs.org/projects/mongoengine-goodjson/badge/?version=latest
           :target: https://mongoengine-goodjson.readthedocs.io/en/latest/?badge=latest
        
Keywords: json mongoengine mongodb
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.5
