diff --git a/edbob/filemon/linux.py b/edbob/filemon/linux.py index 6d5ab83..ae1c4a0 100644 --- a/edbob/filemon/linux.py +++ b/edbob/filemon/linux.py @@ -28,11 +28,19 @@ import sys import os.path -import pyinotify import threading import Queue import logging +try: + import pyinotify +except ImportError: + # Mock out for testing on Windows. + class Dummy(object): + pass + pyinotify = Dummy() + pyinotify.ProcessEvent = Dummy + import edbob from edbob import filemon from edbob.daemon import Daemon diff --git a/edbob/pyramid/views/people.py b/edbob/pyramid/views/people.py index afdf657..1f50470 100644 --- a/edbob/pyramid/views/people.py +++ b/edbob/pyramid/views/people.py @@ -33,37 +33,38 @@ from sqlalchemy import and_ # from formalchemy import Field -import edbob # from edbob.pyramid import filters # from edbob.pyramid import forms # from edbob.pyramid import grids # from edbob.pyramid import Session from edbob.pyramid.views import SearchableAlchemyGridView, CrudView +from edbob.db.extensions.contact.model import ( + Person, PersonEmailAddress, PersonPhoneNumber) class PeopleGrid(SearchableAlchemyGridView): - mapped_class = edbob.Person + mapped_class = Person config_prefix = 'people' sort = 'first_name' def join_map(self): return { 'email': - lambda q: q.outerjoin(edbob.PersonEmailAddress, and_( - edbob.PersonEmailAddress.parent_uuid == edbob.Person.uuid, - edbob.PersonEmailAddress.preference == 1)), + lambda q: q.outerjoin(PersonEmailAddress, and_( + PersonEmailAddress.parent_uuid == Person.uuid, + PersonEmailAddress.preference == 1)), 'phone': - lambda q: q.outerjoin(edbob.PersonPhoneNumber, and_( - edbob.PersonPhoneNumber.parent_uuid == edbob.Person.uuid, - edbob.PersonPhoneNumber.preference == 1)), + lambda q: q.outerjoin(PersonPhoneNumber, and_( + PersonPhoneNumber.parent_uuid == Person.uuid, + PersonPhoneNumber.preference == 1)), } def filter_map(self): return self.make_filter_map( ilike=['first_name', 'last_name'], - email=self.filter_ilike(edbob.PersonEmailAddress.address), - phone=self.filter_ilike(edbob.PersonPhoneNumber.number)) + email=self.filter_ilike(PersonEmailAddress.address), + phone=self.filter_ilike(PersonPhoneNumber.number)) def filter_config(self): return self.make_filter_config( @@ -77,8 +78,8 @@ class PeopleGrid(SearchableAlchemyGridView): def sort_map(self): return self.make_sort_map( 'first_name', 'last_name', - email=self.sorter(edbob.PersonEmailAddress.address), - phone=self.sorter(edbob.PersonPhoneNumber.number)) + email=self.sorter(PersonEmailAddress.address), + phone=self.sorter(PersonPhoneNumber.number)) def grid(self): g = self.make_grid() @@ -97,7 +98,7 @@ class PeopleGrid(SearchableAlchemyGridView): class PersonCrud(CrudView): - mapped_class = edbob.Person + mapped_class = Person home_route = 'people' def fieldset(self, model): diff --git a/edbob/pyramid/views/roles.py b/edbob/pyramid/views/roles.py index 2d0aa57..531c95a 100644 --- a/edbob/pyramid/views/roles.py +++ b/edbob/pyramid/views/roles.py @@ -32,10 +32,10 @@ import formalchemy from webhelpers.html import tags from webhelpers.html.builder import HTML -import edbob from edbob.db import auth from edbob.pyramid import Session from edbob.pyramid.views import SearchableAlchemyGridView, CrudView +from edbob.db.extensions.auth.model import Role default_permissions = [ @@ -68,7 +68,7 @@ default_permissions = [ class RolesGrid(SearchableAlchemyGridView): - mapped_class = edbob.Role + mapped_class = Role config_prefix = 'roles' sort = 'name' @@ -161,7 +161,7 @@ def PermissionsFieldRenderer(permissions, *args, **kwargs): class RoleCrud(CrudView): - mapped_class = edbob.Role + mapped_class = Role home_route = 'roles' permissions = default_permissions diff --git a/edbob/pyramid/views/users.py b/edbob/pyramid/views/users.py index a2e201e..42ba461 100644 --- a/edbob/pyramid/views/users.py +++ b/edbob/pyramid/views/users.py @@ -32,28 +32,29 @@ from webhelpers.html.builder import HTML import formalchemy from formalchemy.fields import SelectFieldRenderer -import edbob from edbob.db import auth from edbob.pyramid import Session from edbob.pyramid.views import SearchableAlchemyGridView, CrudView +from edbob.db.extensions.auth.model import User, Role +from edbob.db.extensions.contact.model import Person class UsersGrid(SearchableAlchemyGridView): - mapped_class = edbob.User + mapped_class = User config_prefix = 'users' sort = 'username' def join_map(self): return { 'person': - lambda q: q.outerjoin(edbob.Person), + lambda q: q.outerjoin(Person), } def filter_map(self): return self.make_filter_map( ilike=['username'], - person=self.filter_ilike(edbob.Person.display_name)) + person=self.filter_ilike(Person.display_name)) def filter_config(self): return self.make_filter_config( @@ -65,7 +66,7 @@ class UsersGrid(SearchableAlchemyGridView): def sort_map(self): return self.make_sort_map( 'username', - person=self.sorter(edbob.Person.display_name)) + person=self.sorter(Person.display_name)) def grid(self): g = self.make_grid() @@ -92,7 +93,7 @@ def RolesFieldRenderer(request): class RolesFieldRenderer(SelectFieldRenderer): def render_readonly(self, **kwargs): - roles = Session.query(edbob.Role) + roles = Session.query(Role) html = '' for uuid in self.value: role = roles.get(uuid) @@ -117,15 +118,15 @@ class RolesField(formalchemy.Field): return [x.uuid for x in user.roles] def get_options(self): - q = Session.query(edbob.Role.name, edbob.Role.uuid) - q = q.filter(edbob.Role.uuid != auth.guest_role(Session()).uuid) - q = q.order_by(edbob.Role.name) + q = Session.query(Role.name, Role.uuid) + q = q.filter(Role.uuid != auth.guest_role(Session()).uuid) + q = q.order_by(Role.name) return q.all() def sync(self): if not self.is_readonly(): user = self.model - roles = Session.query(edbob.Role) + roles = Session.query(Role) data = self.renderer.deserialize() user.roles = [roles.get(x) for x in data] @@ -140,7 +141,7 @@ class _ProtectedPersonRenderer(formalchemy.FieldRenderer): def ProtectedPersonRenderer(uuid): - person = Session.query(edbob.Person).get(uuid) + person = Session.query(Person).get(uuid) assert person return type('ProtectedPersonRenderer', (_ProtectedPersonRenderer,), {'person': person}) @@ -187,7 +188,7 @@ class PasswordField(formalchemy.Field): class UserCrud(CrudView): - mapped_class = edbob.User + mapped_class = User home_route = 'users' def fieldset(self, user): @@ -213,7 +214,7 @@ class UserCrud(CrudView): del fs.confirm_password # if fs.edit and user.person: - if isinstance(user, edbob.User) and user.person: + if isinstance(user, User) and user.person: fs.person.set(readonly=True, renderer=LinkedPersonRenderer(self.request)) diff --git a/edbob/tests/__init__.py b/edbob/tests/__init__.py new file mode 100644 index 0000000..e5c6980 --- /dev/null +++ b/edbob/tests/__init__.py @@ -0,0 +1,19 @@ + +import unittest + +from pyramid import testing + + +class TestCase(unittest.TestCase): + """ + Base class for all test suites. + """ + + def setUp(self): + self.config = testing.setUp() + + def tearDown(self): + testing.tearDown() + + def test_something(self): + self.assertTrue(1) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..28110c5 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,7 @@ +[nosetests] +nocapture = 1 +cover-package = edbob +cover-erase = 1 +cover-inclusive = 1 +cover-html = 1 +cover-html-dir = htmlcov diff --git a/setup.py b/setup.py index f81a1fb..0b5b2e5 100644 --- a/setup.py +++ b/setup.py @@ -209,6 +209,8 @@ setup( install_requires = requires, extras_require = extras, + tests_require = requires + ['nose'], + test_suite = 'nose.collector', packages = find_packages(), include_package_data = True,