Wednesday, October 27, 2010

Factory Squirrel

Djangoes:

RoR has a fixture system called Factory Girl, which I suspect
constructs objects in native Ruby, not in JSON/YAML.

If nobody ports it to Django I would; under the name "Factory
Squirrel". This post is about the first method I'd add to such a
module.

Another kewt RoR fixture feature is the accessor. Given a table Order
and orders.yml, you can write order(:able) to fetch that Order record
from the sample database.

I miss that feature, so I wrote one better in Django:

class FactorySquirrel:

def __getattr__(self, attr):
sought = re.search(r'^(.*)_([^_]+$)', attr)

if sought:
record_name, model_name = sought.groups()
model = None
try:
model = eval(model_name.capitalize())
except NameError: pass
if model:
record = model.objects.get(name=attr)
setattr(self, attr, record) # So we needn't do it
again.
return record
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, attr))

Here's how it works. Suppose you have tables Order and User, and they
have 'name' fields with 'kozmik' and 'bullfrog', respectively.

In your test, to fetch a record, you just name it:

def test_kozmik_bullfrog(self):
print self.kozmik_order # reads the fixture database here
print self.bullfrog_user
print self.kozmik_order # does not re-read the record

From here, to be more useful, we need to think of details like records
without names (shameful!). Models with CamelCase already work -
kozmik_LineItem.

Any ideas how to improve this towards a true Squirrel?

--
Phlip
http://zeekland.zeroplayer.com/

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment