Code Monkey home page Code Monkey logo

namlook / mongokit Goto Github PK

View Code? Open in Web Editor NEW
676.0 26.0 134.0 2.58 MB

MongoKit framework try to keep its simplicity when you manage mongodb in python. MongoKit was developed to be fast and light with KISS and DRY in mind. MongoKit brings structured schema and validation layer on top of the great pymongo driver. Discuss with us on Google group : http://groups.google.com/group/mongokit or follow the news on Twitter: http://twitter.com/namlook

Home Page: http://namlook.github.com/mongokit/

License: Other

Makefile 0.22% Python 99.78%

mongokit's Issues

Mongokit + Pylons

I tried setting up a default pylons project to use mongokit as directed here:
http://namlook.github.com/mongokit/pylons.html

However it gives me the error:

Traceback (most recent call last):
File "/usr/bin/paster", line 18, in
command.run()
File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 84, in run
invoke(command, command_name, options, args[1:])
File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 123, in invoke
exit_code = runner.run(args)
File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 218, in run
result = self.command()
File "/usr/lib/pymodules/python2.6/paste/script/serve.py", line 276, in command
relative_to=base, global_conf=vars)
File "/usr/lib/pymodules/python2.6/paste/script/serve.py", line 313, in loadapp
*_kw)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 204, in loadapp
return loadobj(APP, uri, name=name, *_kw)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 224, in loadobj
global_conf=global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 248, in loadcontext
global_conf=global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 278, in _loadconfig
return loader.get_context(object_type, name, global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 409, in get_context
section)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 431, in _context_from_use
object_type, name=use, global_conf=global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 361, in get_context
global_conf=global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 248, in loadcontext
global_conf=global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 285, in _loadegg
return loader.get_context(object_type, name, global_conf)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 561, in get_context
object_type, name=name)
File "/usr/lib/pymodules/python2.6/paste/deploy/loadwsgi.py", line 587, in find_egg_entry_point
possible.append((entry.load(), protocol, entry.name))
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 1954, in load
entry = import(self.module_name, globals(),globals(), ['name'])
File "/home/ciferkey/Projects/runnr-site/runnrsite/config/middleware.py", line 11, in
from runnrsite.config.environment import load_environment
File "/home/ciferkey/Projects/runnr-site/runnrsite/config/environment.py", line 8, in
import runnrsite.lib.app_globals as app_globals
File "/home/ciferkey/Projects/runnr-site/runnrsite/lib/app_globals.py", line 2, in
from ekeet.models import register_models
ImportError: No module named ekeet.models

I haven't been able to find any help anywhere else. Do you have any ideas as to why this is happening?

Made some enhancements

I am bringing data into Mongo from an external process using YAML. Because of that, I needed to loosen up some of the validation that MongoKit was doing for me and have MongoKit fill in some gaps in my data. So I added the following config variables:

autofill_incomplete_records = False
allow_nonrequired_to_be_missing = False
allow_unspecified_fields = False
auto_promote_str_and_int = False

The first one is the major enhancement. It tells MongoKit to accept a sparse record from Mongo and just fill in the missing data for me. This turned out to be really easy to do since namlook already had most of the work done to make this work. This is great for creating initial data, and for automatically adding to your structure without having to do an actual migrate.

In my case, if my collection is empty, I drop a bunch of documents in with only the 'url' filled out. When I read through the records, MongoKit will fix them up and add everything I left out.

One set of data I am storing is a dict of attributes on a corresponding file. Some files have 5 attributes while others have 30. Some are numeric, some dates, etc. So I want to specify the types for those I care about, but I don't even want to list many of the attributes in my structure. This is where allow_nonrequired_to_be_missing and allow_unspecified_fields come in. If allow_nonrequired_to_be_missing is True, validate will not complain about a missing field unless it is on the required fields list. If allow_unspecified_fields in True, validate won't complain about extra fields it doesn't know about.

Finally, since the YAML output often contains strings rather than unicode, I added auto_promote_str_and_int. I don't really care if a field should be unicode but it actually contains a str. I also don't care if it is supposed to be long but actually has an int. So set this to True and MongoKit will accept str for unicode and int for long.

I only had to change about a dozen lines of code in schema_document.py and a few lines in document.py. I'm happy to share but I don't know what the standard procedure is for submitting possible enhancements. All of the new code still passes all of the unit tests that 0.6 passed so nothing should change for current users unless they turn on some of my switches. (I'm not married to any of my config names, BTW.)

Is there an easy way for me to submit my changes for review?

Cheers,

Scott Maxwell
Code Cobblers, Inc.

A '_type' field that can be used to automatically case documents

Currently mongokit uses the structure dictionary to decide which class of document to cast to when autoreferencing. That can cause problems when you want to have a document autoreference another document, if that referenced document's class is not known ahead of time.
Below is a some code where verification fails because the Run document casts run.result into its base class when you save run.
Rather that using the structure property to cast an autoreferenced document to its proper class, why not include a _type field that is used to select which class to cast a document to. Along with that, a generic, mongokit 'document reference type' would need to be created to allow one document to reference another, without specifying what kind of document it is. When the document is loaded from the database, it would be automatically converted into the correct class based on the _type field.

http://gist.github.com/636106

KeyError when saving partially loaded documents

class User(Document):
    structure = {
        "username": unicode,
        "password": unicode,
    }
    required_fields = ["username", "password"]
    validators = {
        "username": lambda v: re.match(r"[A-Za-z0-9@_-]{3,}", v),
        "password": lambda v: len(v) >= 6,
    }

>>> from app import *
>>> u = connection.User.find_one({}, {"password": 0})
>>> u
{u'_id': ObjectId('4d44fdefebd2536140000000'), u'username': u'iggy'}
>>> u.save()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "models.py", line 47, in save
    super(User, self).save(*args, **kwargs)
  File "/home/bobry/.virtualenvs/mb-env/lib/python2.7/site-packages/mongokit/document.py", line 398, in save
    self.validate(auto_migrate=False)
  File "/home/bobry/.virtualenvs/mb-env/lib/python2.7/site-packages/mongokit/document.py", line 247, in validate
    super(Document, self).validate()
  File "/home/bobry/.virtualenvs/mb-env/lib/python2.7/site-packages/mongokit/schema_document.py", line 346, in validate
    self._process_validators(self, self.structure)
  File "/home/bobry/.virtualenvs/mb-env/lib/python2.7/site-packages/mongokit/schema_document.py", line 613, in _process_validators
    if doted_doc[key] is not None:
KeyError: 'password'

creating index on fields not in structure

i have a structure like this:
structure = { 'meta': dict }

when i set indexes like this:

indexes = [{'field': 'meta.title', 'checked': False}]

i get the following exception:
ValueError: Error in indexes: can't find meta.title in structure

i thought 'checked': False would prevent this?

i can't put 'title' in the structure for 2 reason:

  1. it's optionnal
  2. it would conflict with the fact that meta contains a dict of arbitrary key/value

Allow Set to accept list type

We should be able to do this:

class MyDoc(Document):
    structure = {
        "tags": Set(unicode),
    }
>>> doc = db.col.MyDoc()
>>> doc['tags'] = [u'foo', u'bar', u'foo']
>>> doc.save()

>>> fetched_doc = db.col.get_from_id(doc['_id'])
>>> fetched_doc['tags']
set([u'foo', u'bar'])

typo in the doc

So if you need to use another mongo tools or another ODM in another languages, your data won’t be pollued by MongoKit’s staff.

should be

So if you need to use other mongo tools or ODMs in other languages, your data won’t be polluted by MongoKit’s stuff.

unable to install (debian lenny, py 2.5)

cron:/# easy_install mongokit
Searching for mongokit
Reading http://pypi.python.org/simple/mongokit/
Reading http://bitbucket.org/namlook/mongokit/
Best match: mongokit 0.5.13
Downloading http://pypi.python.org/packages/source/m/mongokit/mongokit-0.5.13.tar.gz#md5=e8d65011e112571968c32d1a92a812ee
Processing mongokit-0.5.13.tar.gz
Running mongokit-0.5.13/setup.py -q bdist_egg --dist-dir /tmp/easy_install-xjR6j4/mongokit-0.5.13/egg-dist-tmp-BkZU97
Traceback (most recent call last):
File "/usr/bin/easy_install", line 8, in
load_entry_point('setuptools==0.6c12dev-r85381', 'console_scripts', 'easy_install')()
File "/usr/lib/python2.5/site-packages/easy_install.py", line 1712, in main

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 1700, in with_ei_usage

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 1716, in <lambda>

  File "/usr/lib/python2.5/distutils/core.py", line 151, in setup
dist.run_commands()
  File "/usr/lib/python2.5/distutils/dist.py", line 974, in run_commands
self.run_command(cmd)
  File "/usr/lib/python2.5/distutils/dist.py", line 994, in run_command
cmd_obj.run()
  File "/usr/lib/python2.5/site-packages/easy_install.py", line 211, in run

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 446, in easy_install

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 476, in install_item

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 655, in install_eggs

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 930, in build_and_install

  File "/usr/lib/python2.5/site-packages/easy_install.py", line 919, in run_setup

  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/sandbox.py", line 62, in run_setup
  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/sandbox.py", line 105, in run
  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/sandbox.py", line 64, in <lambda>
  File "setup.py", line 66, in <module>
  File "/usr/lib/python2.5/distutils/core.py", line 151, in setup
dist.run_commands()
  File "/usr/lib/python2.5/distutils/dist.py", line 974, in run_commands
self.run_command(cmd)
  File "/usr/lib/python2.5/distutils/dist.py", line 994, in run_command
cmd_obj.run()
  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/command/bdist_egg.py", line 167, in run
  File "/usr/lib/python2.5/distutils/cmd.py", line 333, in run_command
self.distribution.run_command(command)
  File "/usr/lib/python2.5/distutils/dist.py", line 994, in run_command
cmd_obj.run()
  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/command/egg_info.py", line 170, in run
  File "/usr/lib/python2.5/site-packages/setuptools-0.6c12dev_r85381-py2.5.egg/setuptools/command/egg_info.py", line 379, in write_pkg_info
  File "/usr/lib/python2.5/distutils/dist.py", line 1076, in write_pkg_info
self.write_pkg_file(pkg_info)
  File "/usr/lib/python2.5/distutils/dist.py", line 1101, in write_pkg_file
file.write('Description: %s\n' % long_desc)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 1292: ordinal not in range(128)

required_fields weird behavior with autorefs

via Peter Bengtsson

I've upgraded to Pymongo 1.9 and MongoKit 0.5.13-dev and this code
used to work just fine before. Here's my structure (simplified)::

class BaseDocument(Document):
   structure = {
     'add_date': datetime.datetime,
     'modify_date': datetime.datetime,
   }

   default_values = {
     'add_date': datetime.datetime.now,
     'modify_date': datetime.datetime.now
   }
   use_autorefs = True
   use_dot_notation = True

class User(BaseDocument):
   structure = {
     'guid': unicode,
     'username': unicode,
     'email': unicode,
     'password': unicode,
     'first_name': unicode,
     'last_name': unicode,
   }

   required_fields = ['guid']
   default_values = {
     'guid': lambda:unicode(uuid.uuid4()),
   }

   indexes = [
     {'fields': 'guid',
      'unique': True},
   ]

class Event(BaseDocument):
   structure = {
     'user': User,
     'title': unicode,
   }
   required_fields = ['user', 'title']

   indexes = [
     {'fields': ['user']},
   ]

And here is my unit test that now breaks:

   def test_create_event(self):
       user = self.db.users.User()
       user.save()
       event = self.db.events.Event()
       event.user = user
       event.title = u"Test"
       print event.user
       event.validate()
       event.save()

Traceback (most recent call last):
 File "/home/peterbe/dev/TORNADO/worklog/tests/test_models.py", line
52, in test_create_event
   event.validate()
 File "/home/peterbe/virtualenvs/worklog/lib/python2.6/site-packages/
mongokit-0.5.13_dev-py2.6.egg/mongokit/document.py", line 249, in
validate
   super(Document, self).validate()
 File "/home/peterbe/virtualenvs/worklog/lib/python2.6/site-packages/
mongokit-0.5.13_dev-py2.6.egg/mongokit/schema_document.py", line 351,
in validate
   self._validate_required(self, self.structure)
 File "/home/peterbe/virtualenvs/worklog/lib/python2.6/site-packages/
mongokit-0.5.13_dev-py2.6.egg/mongokit/schema_document.py", line 772,
in _validate_required
   self._raise_exception(RequireFieldError, req, "%s is required" %
req)
 File "/home/peterbe/virtualenvs/worklog/lib/python2.6/site-packages/
mongokit-0.5.13_dev-py2.6.egg/mongokit/schema_document.py", line 519,
in _raise_exception
   raise exception(message)
RequireFieldError: user is required

It succeeds if I make 'user' NOT a required field.

GEO2D index

MongoKit only allows INDEX_ASCENDING and INDEX_DESCENDING. However, since 1.5.1 mongodb also has a GEO2D index specifier. Please allow this.

VersionedDocument.get_last_revision_id raises StopIteration

The type of strings used in a pymongo collection.find() need to match. The original code doesn't find just inserted IDs, because it's not looking for a unicode string.
The one liner patch (excuse the cut/paste) below corrects the issue for me (it now finds the relevant record).
StopIteration occurs due to the generator iterating over an empty query result set when its .next() method is called.
The test did not fail before; I'm presently working on modifying the test so that it fails before the patch, below, is applied. I'll send a pull request at that time if you'd prefer.

$ hg diff diff -r 43dd8afd9305 mongokit/versioned_document.py --- a/mongokit/versioned_document.py  Mon Aug 09 16:12:14 2010 +0200 +++ b/mongokit/versioned_document.py Thu Aug 26 23:53:36 2010 +1000 @@ -97,7 +97,7 @@
def get_last_revision_id(self): last_doc = self.versioning_collection.find(
- {'id':self['_id']}).sort('revision', -1).next()
+ {'id': unicode(self['_id'])}).sort('revision', -1).next() if last_doc: return last_doc['revision']

Structure aliases to save disk space

from Christian Joudrey
We could add a dict called "structure_aliases" to Document which would serve as an alias when performing writes and reads.
For instance:

class User(Document):
    structure = {
      'u': unicode,
      'p': unicode
    }
    required_fields = [
      'u', 'p'
    ]
    structure_aliases = {
      'u': 'username',
      'p': 'password'
    }

The size of a collection can dramatically increase in size when there are many columns with long names.
Structure aliases would allow one to perform read and writes using "username" and "password" as column names, but they would really be stored as "u" and "p" in MongoDb thus saving (in theory) 14 bytes per row.

Populating a Document using the constructor causes problems with migrations

Sample code:

from mongokit import Connection, Document, DocumentMigration

class TestDocMigration(DocumentMigration):
  pass

class TestDoc(Document):
  structure = {'name': unicode}
  migration_handler = TestDocMigration

con = Connection()
con.register([TestDoc])

collection = con['test'].foos

a = collection.TestDoc()
a['name'] = a

b = collection.TestDoc({'name': 'b'})

The latter syntax (with b) doesn't seem to be documented, but it works until you add migrations to your document. Once you add a migration handler, a KeyError is raised because MongoKit thinks the document has already been saved to the db:

...
File "python2.6/site-packages/mongokit/document.py", line 132, in _migrate
  old_doc = self.collection.get_from_id(self['_id'])
KeyError: '_id'

I suppose the solution is to either (a) discourage the use of the constructing documents with an initial structure — I'm not sure how I started doing that since it doesn't seem to be documented anyway — or (b) prevent migration of documents which haven't yet been saved.

MongoKit is great. Keep up the good work!

Remove old doc (was: ImportError: No module named ext.pylons_env)

When I try to setup pylons with mongokit I get the error

from mongokit.ext.pylons_env import MongoPylonsEnv
ImportError: No module named ext.pylons_env

from the line:

from mongokit.ext.pylons_env import MongoPylonsEnv

from this document: http://bytebucket.org/namlook/mongokit/wiki/html/pylons_support.html
Have mongokit and mongokit-pylons not been fully merged yet? Though I tried using the origin mongokit-pylons and i still get the same error. Any help would be appreciated.

Allow custom cursor class

At the moment all Document classes must use MongoDocumentCursor.

It should be possible to instead have a cursor_class class property (with MongoDocumentCursor as default) to allow a custom cursor class to be used instead - for example like the "objects" property in the Django ORM.

allow circular references

As auto referencing is currently implement, there can be no circular references.
This is not allowed currently: Doc1 referencing Doc2 and Doc2 referencing Doc1
Circular references are common in graph data structures. Currently, to implement circular references the user needs to implement their own dbref functions, and can not use the mongokit's auto referencing feature.
Graphs are a common data structure as can be seen in the numerous non-sql graph databases. Adding the ability to handle circular references in mongokit would greatly enhance its usefulness.

Advanced bulk migration docs example is broken

class BlogPostMigration(DocumentMigration):
   def allmigration01__add_update_field_and_fill_it(self):
       self.target = {'blog_post.update_date':{'$exists':False}, 'blog_post':{'$exists':True}}
       if not self.status:
           for doc in self.collection.find(self.target):
               self.update = {'$set':{'blog_post.update_date': self.doc['blog_post']['creation_date']}}
               self.collection.update(self.target, self.update, multi=True, safe=True)

It's doc['blog_post']['creation_date'] not self.doc

Enable `with` for object assignment

via Phillip Oldham:

Would it be possible to enable mongokit to use the python with statement?

For instance:

>>> from mongokit import *
>>> class MyObj(MongoDocument):
...   structure = {
...     "settings": { unicode: OR(unicode, bool, int) }
...   }
... 
>>> document = MyObj()
>>> with document.settings:
...   foo = 'bar'
... 
>>> print document.settings.foo
bar

Not completely sure that's accurate, but even using:

>>> with document.settings as s: 
...   s.foo = 'bar'

would help keep things a little neater when working with larger objects/structures.

Don't prepopulate non-required fields

MongoKit tip, testcase in attachment:

gauss@pmain:~/Projects/mongokit_test$ ./test1.py 
Traceback (most recent call last):
  File "./test1.py", line 20, in 
    a.save()
  File "/home/gauss/python-site-packages/mongokit/document.py", line 362, in save
    self.validate(auto_migrate=False)
  File "/home/gauss/python-site-packages/mongokit/document.py", line 174, in validate
    super(Document, self).validate()
  File "/home/gauss/python-site-packages/mongokit/schema_document.py", line 290, in validate
    self._validate_doc(self, self.structure)
  File "/home/gauss/python-site-packages/mongokit/schema_document.py", line 538, in _validate_doc
    self._validate_doc(doc[key], struct[key],  new_path)
  File "/home/gauss/python-site-packages/mongokit/schema_document.py", line 549, in _validate_doc
    self._validate_doc(obj, struct, path)
  File "/home/gauss/python-site-packages/mongokit/schema_document.py", line 517, in _validate_doc
    "missed fields : %s" % struct_doc_diff )
  File "/home/gauss/python-site-packages/mongokit/schema_document.py", line 472, in _raise_exception
    raise exception(message)
mongokit.schema_document.StructureError: missed fields : ['a2']

But a2 isn't marked as required.

see http://groups.google.com/group/mongokit/browse_thread/thread/242aaaa73cb4b457

Can't specify default values for lists of embedded objects

I'm pretty new to MongoKit so please bear with me if I'm confused, but it doesn't seem to be possible to specify default values for embedded objects. Using this Document:

class UserInfo(Document):
    use_dot_notation = True
    structure = {
        'email_addresses': [{
            'email': unicode,
            'verified': bool,
        }],
    }
    required_fields = []
    default_values = {
        'email_addresses': [{
            'verified': True,
        }],
    }

raises this exception at object-instantiation time:

Traceback (most recent call last):
  File "./mongofun.py", line 3, in <module>
    from core.model import con
  File "...core/model.py", line 12, in <module>
    class UserInfo(Document):
  File ".../lib/python2.7/site-packages/mongokit/document.py", line 76, in __new__
    return SchemaProperties.__new__(cls, name, bases, attrs)        
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 154, in __new__
    cls._validate_descriptors(attrs)
  File ".../lib/python2.7/site-packages/mongokit/document.py", line 80, in _validate_descriptors
    SchemaProperties._validate_descriptors(attrs)
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 174, in _validate_descriptors
    raise ValueError("Error in default_values: can't find %s in structure" % dv )
ValueError: Error in default_values: can't find email_addresses in structure

Changing the required_fields parameter to this instead:

default_values = { 'email_addresses.verified': False, }

raises this exception at validation time, because MongoKit hasn't used the defaults to fill out the fields:

Traceback (most recent call last):
  File "./mongofun.py", line 23, in <module>
    user.validate()
  File ".../lib/python2.7/site-packages/mongokit/document.py", line 247, in validate
    super(Document, self).validate()
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 348, in validate
    self._validate_doc(self, self.structure)
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 585, in _validate_doc
    self._validate_doc(doc[key], struct[key],  new_path)
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 596, in _validate_doc
    self._validate_doc(obj, struct, path)
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 564, in _validate_doc
    "missed fields : %s" % struct_doc_diff )
  File ".../lib/python2.7/site-packages/mongokit/schema_document.py", line 519, in _raise_exception
    raise exception(message)
mongokit.schema_document.StructureError: missed fields : ['verified']

This issue has been brought up before, and the solution suggested there indicates that it's supposed to work:

https://groups.google.com/forum/#!topic/mongokit/ZjPjE9CgO0E

fixture generation

Via structure introspection, we can guess the type of field and then generate some fixtures on the fly.
The api could be :

>>> connection.mydb.mycol.Doc.fixtures(how_many=10)

this will load to mycol 10 Doc objects with random value.
Thanks to Vladimir Dronnikov for the original idea...

tag version

hello you should tag released version, it will automatically make an archive in the download section.

got an unexpected keyword argument 'from_son'

i got this exception

Exception Value:
init() got an unexpected keyword argument 'from_son'
Exception Location: /usr/local/lib/python2.6/dist-packages/mongokit-0.5.12-py2.6.egg/mongokit/database.py in _fix_outgoing, line 73

it seems Document constructor doesn't have this argument:
def init(self, doc=None, gen_skel=True, collection=None, lang='en', fallback_lang='en', generate_index=True):

typo in the doc

hello,
i think this is a bug:
default_values = {'blog_post.created_at':datetime.utcnow()}

should be datetime.utcnow (the callable)

otherwise all document will have the same date

allow the structure to be empty (was: document.to_json() failing)

Traceback (most recent call last):
  ...
  File "eggs/mongokit-0.5.13.1-py2.6.egg/mongokit/document.py", line 508, in to_json
    _convert_to_python(obj, self.structure)
  File "eggs/mongokit-0.5.13.1-py2.6.egg/mongokit/document.py", line 485, in _convert_to_python
    _convert_to_python(doc[key], struct[key], new_path, root_path)
  File "eggs/mongokit-0.5.13.1-py2.6.egg/mongokit/document.py", line 481, in _convert_to_python
    new_path = ".".join([path, new_key]).strip('.')
TypeError: sequence item 1: expected string, type found

>>> import mongokit
>>> print mongokit.__version__
0.5.13.1

Document.simplify() method

It would be useful if there was a .simplify() method on Document objects, which would recursively convert the object to the base data-types as defined in the document's structure, eg:

class Foo(Document):
    structure = {
      'title': unicode,
      'properties': {unicode:None}
     }

x = Foo()
x['title'] = u'my document'
x['properties'] = {u'active': True}
x.save()

print type(x) # mongokit.Document
print type(x['_id']) # pymongo.objectid.ObjectId
print type(x['properties']) # mongokit.helpers.DotedDict

y = x.simplify()
print type(x) # dict
print type(x['_id']) # unicode
print type(x['properties']) # dict

KeyError when using a builtin -> custom type mapping.

There's a test case for this issue here: https://gist.github.com/795871

It appears that using a custom type in a structure dict with a type as the key causes a key error to be raised. For example:

structure = {
    'dates' : {unicode: CustomDate()}
}

would cause an error on validation, but not:

structure = {
    'dates' : {unicode: datetime.datetime}
}

The exception raised is:

Traceback (most recent call last):
  File "testcase.py", line 32, in <module>
    doc.validate()
  File "/Users/allanc/externals/mongokit/mongokit/document.py", line 247, in validate
    super(Document, self).validate()
  File "/Users/allanc/externals/mongokit/mongokit/schema_document.py", line 347, in validate
    self._process_custom_type('bson', self, self.structure)
  File "/Users/allanc/externals/mongokit/mongokit/schema_document.py", line 656, in _process_custom_type
    self._process_custom_type(target, doc[key], struct[key], new_path, root_path)
  File "/Users/allanc/externals/mongokit/mongokit/schema_document.py", line 642, in _process_custom_type
    if not isinstance(doc[key], struct[key].python_type) and doc[key] is not None:
KeyError: <type 'unicode'>

put string version into the setup.py

This is necessary to prevent some buildout issues:

via Andrew Degtiariov:

I have pymongo 1.9.0, but there is buildout.
It overrides python path:

#!/opt/python/bin/python -S

import sys
sys.path[0:0] = [
    '/opt/project/parts/buildout',
    ]


import os
path = sys.path[0]
if os.environ.get('PYTHONPATH'):
    os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
    path = os.pathsep.join([path, os.environ['PYTHONPATH']])
os.environ['PYTHONPATH'] = path
import site # imports custom buildout-generated site.py

import zc.buildout.buildout

if __name__ == '__main__':
    zc.buildout.buildout.main()

pymongo installed into /opt/project/eggs directory, so ./bin/buildout known nothing about pymongo during processing setup.py.
Could you make version independent from external imports? E.g. could you make it as string as you was doing in previous versions of MongoKit?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.