moksha/apps/knowledge/moksha/apps/knowledge/controllers/root.py | 2 moksha/apps/knowledge/moksha/apps/knowledge/model/model.py | 221 +++++----- moksha/apps/knowledge/pavement.py | 32 - moksha/apps/knowledge/pavement.py.hide | 32 + moksha/tests/models/test_entity.py | 210 ++++----- 5 files changed, 249 insertions(+), 248 deletions(-)
New commits: commit 68ef36ec6e899b57d5f97cee31a3d6033f5878e7 Author: Luke Macken lmacken@redhat.com Date: Fri Jan 15 23:39:48 2010 -0500
Disable the knowledge app and it's test suite until we can figure out how to properly handle it's SQLAlchemy engine(s)
diff --git a/moksha/apps/knowledge/moksha/apps/knowledge/controllers/root.py b/moksha/apps/knowledge/moksha/apps/knowledge/controllers/root.py index 22924ad..852527a 100644 --- a/moksha/apps/knowledge/moksha/apps/knowledge/controllers/root.py +++ b/moksha/apps/knowledge/moksha/apps/knowledge/controllers/root.py @@ -17,7 +17,7 @@ from moksha import model #from moksha.model import DBSession, metadata from moksha.lib.base import Controller from moksha.lib.helpers import defaultdict -from moksha.apps.knowledge.model import Fact, Entity, with_characteristic, DBSession +from moksha.apps.knowledge.model import Fact, Entity, with_characteristic, DBSession, metadata
#class EntityForm(TableForm): # class fields(WidgetsList): diff --git a/moksha/apps/knowledge/moksha/apps/knowledge/model/model.py b/moksha/apps/knowledge/moksha/apps/knowledge/model/model.py index d2ed245..31c1e7a 100644 --- a/moksha/apps/knowledge/moksha/apps/knowledge/model/model.py +++ b/moksha/apps/knowledge/moksha/apps/knowledge/model/model.py @@ -22,113 +22,114 @@ .. moduleauthor:: Luke Macken lmacken@redhat.com """
-from sqlalchemy import * -from sqlalchemy.orm import * -from sqlalchemy.orm.collections import attribute_mapped_collection - -from datetime import datetime -from sqlalchemy import * -from sqlalchemy.orm import relation, comparable_property -from sqlalchemy.orm.collections import attribute_mapped_collection -from vertical import PolymorphicVerticalProperty, VerticalPropertyDictMixin - -from moksha.model import metadata, DeclarativeBase, DBSession - - -class Fact(PolymorphicVerticalProperty, DeclarativeBase): - """ A polymorphic-valued vertical table property """ - __tablename__ = 'moksha_facts' - - id = Column(Integer, ForeignKey('moksha_entities.id'), primary_key=True) - key = Column(Unicode(64), primary_key=True) - type_ = Column(Unicode(16), default=None) - int_value = Column(Integer, default=None) - char_value = Column(UnicodeText, default=None) - boolean_value = Column(Boolean, default=None) - datetime_value = Column(DateTime, default=None) - list_value = Column(PickleType, default=None) - dict_value = Column(PickleType, default=None) - - value = comparable_property(PolymorphicVerticalProperty.Comparator, - PolymorphicVerticalProperty.value) - - type_map = { - int: (u'integer', 'int_value'), - str: (u'char', 'char_value'), - unicode: (u'char', 'char_value'), - bool: (u'boolean', 'boolean_value'), - datetime: (u'datetime', 'datetime_value'), - list: (u'list', 'list_value'), - dict: (u'dict', 'dict_value'), - type(None): (None, None), - } - -with_characteristic = lambda key, value: and_(Fact.key==key, Fact.value==value) - - -class Entity(VerticalPropertyDictMixin, DeclarativeBase): - """ An polymorphic entity. - - Entity facts are available via the 'facts' property or by using - dict-like accessors on an Entity instance:: - - apple = Entity('apple') - apple['color'] = 'red' - # or, equivalently: - apple.facts['color'] = Fact('color', 'red') - - This Entity is also an adjacency tree. Meaning, every entity - can have a `parent` and zero or more `children`. - """ - __tablename__ = 'moksha_entities' - _property_type = Fact - _property_mapping = 'facts' - - id = Column(Integer, autoincrement=True, primary_key=True) - name = Column(UnicodeText, nullable=False) - - facts = relation(Fact, backref='entity', - collection_class=attribute_mapped_collection('key')) - - # Adjacency tree properties - #id = Column(Integer, Sequence('moksha_tree_id_seq', optional=True), primary_key=True) - parent_id = Column(Integer, ForeignKey('moksha_entities.id'), nullable=True) - - children = relation('Entity', cascade="all", - backref=backref("parent", remote_side="Entity.id"), - collection_class=attribute_mapped_collection('name'), - lazy=False, join_depth=3) - - def __init__(self, name=None): - self.name = name - - @classmethod - def by_name(cls, name): - """A class method that permits to search entities - based on their name attribute. - """ - return DBSession.query(cls).filter(cls.name==name).first() - - # Adjacency-tree methods - def append(self, node): - if isinstance(node, basestring): - node = Entity(node) - node.parent = self - self.children[node.name] = node - - def __repr__(self): - return self._getstring(0, False) - - def __str__(self): - return self._getstring(0, False) - - def _getstring(self, level, expand = False): - s = (' ' * level) + "%s (%s,%s, %d)" % ( - self.name, self.id,self.parent_id,id(self)) + '\n' - if expand: - s += ''.join([n._getstring(level+1, True) - for n in self.children.values()]) - return s - - def print_nodes(self): - return self._getstring(0, True) +#from sqlalchemy import * +#from sqlalchemy.orm import * +#from sqlalchemy.orm.collections import attribute_mapped_collection +# +#from datetime import datetime +#from sqlalchemy import * +#from sqlalchemy.orm import relation, comparable_property +#from sqlalchemy.orm.collections import attribute_mapped_collection +#from vertical import PolymorphicVerticalProperty, VerticalPropertyDictMixin +# +##from moksha.model import metadata, DeclarativeBase, DBSession +#from moksha.apps.knowledge.model import metadata, DeclarativeBase, DBSession +# +# +#class Fact(PolymorphicVerticalProperty, DeclarativeBase): +# """ A polymorphic-valued vertical table property """ +# __tablename__ = 'moksha_facts' +# +# id = Column(Integer, ForeignKey('moksha_entities.id'), primary_key=True) +# key = Column(Unicode(64), primary_key=True) +# type_ = Column(Unicode(16), default=None) +# int_value = Column(Integer, default=None) +# char_value = Column(UnicodeText, default=None) +# boolean_value = Column(Boolean, default=None) +# datetime_value = Column(DateTime, default=None) +# list_value = Column(PickleType, default=None) +# dict_value = Column(PickleType, default=None) +# +# value = comparable_property(PolymorphicVerticalProperty.Comparator, +# PolymorphicVerticalProperty.value) +# +# type_map = { +# int: (u'integer', 'int_value'), +# str: (u'char', 'char_value'), +# unicode: (u'char', 'char_value'), +# bool: (u'boolean', 'boolean_value'), +# datetime: (u'datetime', 'datetime_value'), +# list: (u'list', 'list_value'), +# dict: (u'dict', 'dict_value'), +# type(None): (None, None), +# } +# +#with_characteristic = lambda key, value: and_(Fact.key==key, Fact.value==value) +# +# +#class Entity(VerticalPropertyDictMixin, DeclarativeBase): +# """ An polymorphic entity. +# +# Entity facts are available via the 'facts' property or by using +# dict-like accessors on an Entity instance:: +# +# apple = Entity('apple') +# apple['color'] = 'red' +# # or, equivalently: +# apple.facts['color'] = Fact('color', 'red') +# +# This Entity is also an adjacency tree. Meaning, every entity +# can have a `parent` and zero or more `children`. +# """ +# __tablename__ = 'moksha_entities' +# _property_type = Fact +# _property_mapping = 'facts' +# +# id = Column(Integer, autoincrement=True, primary_key=True) +# name = Column(UnicodeText, nullable=False) +# +# facts = relation(Fact, backref='entity', +# collection_class=attribute_mapped_collection('key')) +# +# # Adjacency tree properties +# #id = Column(Integer, Sequence('moksha_tree_id_seq', optional=True), primary_key=True) +# parent_id = Column(Integer, ForeignKey('moksha_entities.id'), nullable=True) +# +# children = relation('Entity', cascade="all", +# backref=backref("parent", remote_side="Entity.id"), +# collection_class=attribute_mapped_collection('name'), +# lazy=False, join_depth=3) +# +# def __init__(self, name=None): +# self.name = name +# +# @classmethod +# def by_name(cls, name): +# """A class method that permits to search entities +# based on their name attribute. +# """ +# return DBSession.query(cls).filter(cls.name==name).first() +# +# # Adjacency-tree methods +# def append(self, node): +# if isinstance(node, basestring): +# node = Entity(node) +# node.parent = self +# self.children[node.name] = node +# +# def __repr__(self): +# return self._getstring(0, False) +# +# def __str__(self): +# return self._getstring(0, False) +# +# def _getstring(self, level, expand = False): +# s = (' ' * level) + "%s (%s,%s, %d)" % ( +# self.name, self.id,self.parent_id,id(self)) + '\n' +# if expand: +# s += ''.join([n._getstring(level+1, True) +# for n in self.children.values()]) +# return s +# +# def print_nodes(self): +# return self._getstring(0, True) diff --git a/moksha/apps/knowledge/pavement.py b/moksha/apps/knowledge/pavement.py deleted file mode 100644 index 8bb2d45..0000000 --- a/moksha/apps/knowledge/pavement.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -from paver.easy import * -from paver.setuputils import (setup, find_package_data, find_packages, - install_distutils_tasks) -install_distutils_tasks() -from moksha.lib.paver_tasks import * - -options( - setup=Bunch( - name="moksha.knowledge", - version="0.1", - release="1", - url="http://moksha.fedorahosted.org", - description="Describe your package here", - license="AGPLv3", - long_description="", - author="", - author_email="", - rpm_name='moksha-apps-knowledge', - packages=find_packages(), - package_data=find_package_data(), - namespace_packages=[ - 'moksha', - 'moksha.apps', - ], - install_requires=["Moksha"], - entry_points=""" - [moksha.application] - moksha.apps.knowledge = moksha.apps.knowledge.controllers.root:RootController - """, - ), -) diff --git a/moksha/apps/knowledge/pavement.py.hide b/moksha/apps/knowledge/pavement.py.hide new file mode 100644 index 0000000..8bb2d45 --- /dev/null +++ b/moksha/apps/knowledge/pavement.py.hide @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from paver.easy import * +from paver.setuputils import (setup, find_package_data, find_packages, + install_distutils_tasks) +install_distutils_tasks() +from moksha.lib.paver_tasks import * + +options( + setup=Bunch( + name="moksha.knowledge", + version="0.1", + release="1", + url="http://moksha.fedorahosted.org", + description="Describe your package here", + license="AGPLv3", + long_description="", + author="", + author_email="", + rpm_name='moksha-apps-knowledge', + packages=find_packages(), + package_data=find_package_data(), + namespace_packages=[ + 'moksha', + 'moksha.apps', + ], + install_requires=["Moksha"], + entry_points=""" + [moksha.application] + moksha.apps.knowledge = moksha.apps.knowledge.controllers.root:RootController + """, + ), +) diff --git a/moksha/tests/models/test_entity.py b/moksha/tests/models/test_entity.py index ed1a898..2d9fde2 100644 --- a/moksha/tests/models/test_entity.py +++ b/moksha/tests/models/test_entity.py @@ -17,108 +17,108 @@
"""Test Moksha's Entity/Fact model"""
-from datetime import datetime -from nose.tools import eq_, assert_true -from sqlalchemy import * -from moksha.tests.models import ModelTest - -from moksha.apps.knowledge.model import DBSession, Entity, Fact, with_characteristic - -class TestEntity(ModelTest): - """Test case for the Entity model.""" - - klass = Entity - attrs = dict(name=u'lmacken') - - def setup(self): - super(TestEntity, self).setup() - self.obj[u'firstname'] = u'Luke' - self.obj[u'lastname'] = u'Macken' - self.obj[u'age'] = 24 - self.obj[u'dob'] = datetime(1984, 11, 02) - self.obj[u'l33t'] = True - self.obj[u'json'] = {'foo':'bar'} - - def test_entity_creation_name(self): - eq_(self.obj.name, u'lmacken') - - def test_fact_types(self): - DBSession.add(self.obj) - DBSession.flush() - me = DBSession.query(Entity).filter_by(name=u'lmacken').one() - eq_(me[u'lastname'], u'Macken') - eq_(me[u'age'], 24) - eq_(me[u'dob'], datetime(1984, 11, 2)) - eq_(me[u'l33t'], True) - - def test_getting_by_name(self): - """ Entities should be fetchable by their name """ - DBSession.add(self.obj) - lmacken = Entity.by_name(u'lmacken') - eq_(lmacken, self.obj) - - def test_filter_by_name(self): - DBSession.add(self.obj) - me = DBSession.query(Entity).filter_by(name=u'lmacken').one() - eq_(me.name, u'lmacken') - eq_(me[u'firstname'], u'Luke') - - def test_query_by_fact(self): - """ Query entities by facts """ - DBSession.add(self.obj) - assert DBSession.query(Entity).filter( - Entity.facts.any( - and_(Fact.key == u'l33t', - Fact.value == True))).first() - - def test_query_with_characteristic(self): - """ Query entities based on facts using with_characteristic """ - DBSession.add(self.obj) - assert (DBSession.query(Entity). - filter(or_(Entity.facts.any( - with_characteristic(u'dob', datetime(1984, 11, 02))), - not_(Entity.facts.any(Fact.key == u'l33t'))))).first() - - def test_query_facts_by_characteristic(self): - """ Query facts by certain characteristics """ - DBSession.add(self.obj) - assert (DBSession.query(Fact). - filter(with_characteristic(u'l33t', True))).one() - - def test_child_entities(self): - child = Entity(u'child1') - DBSession.add(child) - self.obj.append(child) - DBSession.flush() - me = Entity.by_name(u'lmacken') - assert_true('child1' in me.children) - eq_(self.obj.children['child1'].parent, me) - - def test_entity_json_fact(self): - me = Entity.by_name(u'lmacken') - eq_(me[u'json'], {'foo': 'bar'}) - - """ - TODO: add hooks that send AMQP messages? - Or, do this i - def test_hooks(self): - from moksha.hook import Hook, MokshaHookMapperExtension - from moksha.model import model - insert = update = delete = False - - class MyHook(Hook): - def after_insert(self, instance): - insert = True - def after_update(self, instance): - update = True - def after_delete(self, instance): - delete = True - - model.moksha_mapper_extension.hooks['after_insert'].append(MyHook()) - - # create a new entity - something = Entity(u'something') - DBSession.add(something) - DBSession.flush() - assert insert - """ +#from datetime import datetime +#from nose.tools import eq_, assert_true +#from sqlalchemy import * +#from moksha.tests.models import ModelTest +# +#from moksha.apps.knowledge.model import DBSession, Entity, Fact, with_characteristic +# +#class TestEntity(ModelTest): +# """Test case for the Entity model.""" +# +# klass = Entity +# attrs = dict(name=u'lmacken') +# +# def setup(self): +# super(TestEntity, self).setup() +# self.obj[u'firstname'] = u'Luke' +# self.obj[u'lastname'] = u'Macken' +# self.obj[u'age'] = 24 +# self.obj[u'dob'] = datetime(1984, 11, 02) +# self.obj[u'l33t'] = True +# self.obj[u'json'] = {'foo':'bar'} +# +# def test_entity_creation_name(self): +# eq_(self.obj.name, u'lmacken') +# +# def test_fact_types(self): +# DBSession.add(self.obj) +# DBSession.flush() +# me = DBSession.query(Entity).filter_by(name=u'lmacken').one() +# eq_(me[u'lastname'], u'Macken') +# eq_(me[u'age'], 24) +# eq_(me[u'dob'], datetime(1984, 11, 2)) +# eq_(me[u'l33t'], True) +# +# def test_getting_by_name(self): +# """ Entities should be fetchable by their name """ +# DBSession.add(self.obj) +# lmacken = Entity.by_name(u'lmacken') +# eq_(lmacken, self.obj) +# +# def test_filter_by_name(self): +# DBSession.add(self.obj) +# me = DBSession.query(Entity).filter_by(name=u'lmacken').one() +# eq_(me.name, u'lmacken') +# eq_(me[u'firstname'], u'Luke') +# +# def test_query_by_fact(self): +# """ Query entities by facts """ +# DBSession.add(self.obj) +# assert DBSession.query(Entity).filter( +# Entity.facts.any( +# and_(Fact.key == u'l33t', +# Fact.value == True))).first() +# +# def test_query_with_characteristic(self): +# """ Query entities based on facts using with_characteristic """ +# DBSession.add(self.obj) +# assert (DBSession.query(Entity). +# filter(or_(Entity.facts.any( +# with_characteristic(u'dob', datetime(1984, 11, 02))), +# not_(Entity.facts.any(Fact.key == u'l33t'))))).first() +# +# def test_query_facts_by_characteristic(self): +# """ Query facts by certain characteristics """ +# DBSession.add(self.obj) +# assert (DBSession.query(Fact). +# filter(with_characteristic(u'l33t', True))).one() +# +# def test_child_entities(self): +# child = Entity(u'child1') +# DBSession.add(child) +# self.obj.append(child) +# DBSession.flush() +# me = Entity.by_name(u'lmacken') +# assert_true('child1' in me.children) +# eq_(self.obj.children['child1'].parent, me) +# +# def test_entity_json_fact(self): +# me = Entity.by_name(u'lmacken') +# eq_(me[u'json'], {'foo': 'bar'}) +# +# """ +# TODO: add hooks that send AMQP messages? +# Or, do this i +# def test_hooks(self): +# from moksha.hook import Hook, MokshaHookMapperExtension +# from moksha.model import model +# insert = update = delete = False +# +# class MyHook(Hook): +# def after_insert(self, instance): +# insert = True +# def after_update(self, instance): +# update = True +# def after_delete(self, instance): +# delete = True +# +# model.moksha_mapper_extension.hooks['after_insert'].append(MyHook()) +# +# # create a new entity +# something = Entity(u'something') +# DBSession.add(something) +# DBSession.flush() +# assert insert +# """
moksha-commits@lists.fedorahosted.org