diff --git a/CHANGES.txt b/CHANGES.txt index 8bfbfbc..0e4fdc0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,19 +1,4 @@ -0.1.2 ------ - -* Allow config file to prevent logging configuration from happening. - - -0.1.1 ------ - -* Some random things required in production at MaMa Jean's... - - Specifically this is known to replace occurrences of e.g. ``edbob.User`` with - a more standard (properly imported) reference to ``User``. - - 0.1a29 ------ diff --git a/edbob/_version.py b/edbob/_version.py index 10939f0..36ef6a9 100644 --- a/edbob/_version.py +++ b/edbob/_version.py @@ -1 +1 @@ -__version__ = '0.1.2' +__version__ = '0.1a29' diff --git a/edbob/filemon/linux.py b/edbob/filemon/linux.py index ae1c4a0..6d5ab83 100644 --- a/edbob/filemon/linux.py +++ b/edbob/filemon/linux.py @@ -28,19 +28,11 @@ 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/initialization.py b/edbob/initialization.py index af2aeff..410b572 100644 --- a/edbob/initialization.py +++ b/edbob/initialization.py @@ -89,8 +89,7 @@ def init(appname='edbob', *args, **kwargs): shell = kwargs.get('shell', False) for paths in config_paths: config.read(paths, recurse=not shell) - if config.getboolean('edbob', 'configure_logging', default=True): - config.configure_logging() + config.configure_logging() default_modules = 'edbob.time' modules = config.get('edbob', 'init', default=default_modules) diff --git a/edbob/pyramid/views/people.py b/edbob/pyramid/views/people.py index 1f50470..afdf657 100644 --- a/edbob/pyramid/views/people.py +++ b/edbob/pyramid/views/people.py @@ -33,38 +33,37 @@ 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 = Person + mapped_class = edbob.Person config_prefix = 'people' sort = 'first_name' def join_map(self): return { 'email': - lambda q: q.outerjoin(PersonEmailAddress, and_( - PersonEmailAddress.parent_uuid == Person.uuid, - PersonEmailAddress.preference == 1)), + lambda q: q.outerjoin(edbob.PersonEmailAddress, and_( + edbob.PersonEmailAddress.parent_uuid == edbob.Person.uuid, + edbob.PersonEmailAddress.preference == 1)), 'phone': - lambda q: q.outerjoin(PersonPhoneNumber, and_( - PersonPhoneNumber.parent_uuid == Person.uuid, - PersonPhoneNumber.preference == 1)), + lambda q: q.outerjoin(edbob.PersonPhoneNumber, and_( + edbob.PersonPhoneNumber.parent_uuid == edbob.Person.uuid, + edbob.PersonPhoneNumber.preference == 1)), } def filter_map(self): return self.make_filter_map( ilike=['first_name', 'last_name'], - email=self.filter_ilike(PersonEmailAddress.address), - phone=self.filter_ilike(PersonPhoneNumber.number)) + email=self.filter_ilike(edbob.PersonEmailAddress.address), + phone=self.filter_ilike(edbob.PersonPhoneNumber.number)) def filter_config(self): return self.make_filter_config( @@ -78,8 +77,8 @@ class PeopleGrid(SearchableAlchemyGridView): def sort_map(self): return self.make_sort_map( 'first_name', 'last_name', - email=self.sorter(PersonEmailAddress.address), - phone=self.sorter(PersonPhoneNumber.number)) + email=self.sorter(edbob.PersonEmailAddress.address), + phone=self.sorter(edbob.PersonPhoneNumber.number)) def grid(self): g = self.make_grid() @@ -98,7 +97,7 @@ class PeopleGrid(SearchableAlchemyGridView): class PersonCrud(CrudView): - mapped_class = Person + mapped_class = edbob.Person home_route = 'people' def fieldset(self, model): diff --git a/edbob/pyramid/views/roles.py b/edbob/pyramid/views/roles.py index 531c95a..2d0aa57 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 = Role + mapped_class = edbob.Role config_prefix = 'roles' sort = 'name' @@ -161,7 +161,7 @@ def PermissionsFieldRenderer(permissions, *args, **kwargs): class RoleCrud(CrudView): - mapped_class = Role + mapped_class = edbob.Role home_route = 'roles' permissions = default_permissions diff --git a/edbob/pyramid/views/users.py b/edbob/pyramid/views/users.py index 42ba461..a2e201e 100644 --- a/edbob/pyramid/views/users.py +++ b/edbob/pyramid/views/users.py @@ -32,29 +32,28 @@ 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 = User + mapped_class = edbob.User config_prefix = 'users' sort = 'username' def join_map(self): return { 'person': - lambda q: q.outerjoin(Person), + lambda q: q.outerjoin(edbob.Person), } def filter_map(self): return self.make_filter_map( ilike=['username'], - person=self.filter_ilike(Person.display_name)) + person=self.filter_ilike(edbob.Person.display_name)) def filter_config(self): return self.make_filter_config( @@ -66,7 +65,7 @@ class UsersGrid(SearchableAlchemyGridView): def sort_map(self): return self.make_sort_map( 'username', - person=self.sorter(Person.display_name)) + person=self.sorter(edbob.Person.display_name)) def grid(self): g = self.make_grid() @@ -93,7 +92,7 @@ def RolesFieldRenderer(request): class RolesFieldRenderer(SelectFieldRenderer): def render_readonly(self, **kwargs): - roles = Session.query(Role) + roles = Session.query(edbob.Role) html = '' for uuid in self.value: role = roles.get(uuid) @@ -118,15 +117,15 @@ class RolesField(formalchemy.Field): return [x.uuid for x in user.roles] def get_options(self): - q = Session.query(Role.name, Role.uuid) - q = q.filter(Role.uuid != auth.guest_role(Session()).uuid) - q = q.order_by(Role.name) + 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) return q.all() def sync(self): if not self.is_readonly(): user = self.model - roles = Session.query(Role) + roles = Session.query(edbob.Role) data = self.renderer.deserialize() user.roles = [roles.get(x) for x in data] @@ -141,7 +140,7 @@ class _ProtectedPersonRenderer(formalchemy.FieldRenderer): def ProtectedPersonRenderer(uuid): - person = Session.query(Person).get(uuid) + person = Session.query(edbob.Person).get(uuid) assert person return type('ProtectedPersonRenderer', (_ProtectedPersonRenderer,), {'person': person}) @@ -188,7 +187,7 @@ class PasswordField(formalchemy.Field): class UserCrud(CrudView): - mapped_class = User + mapped_class = edbob.User home_route = 'users' def fieldset(self, user): @@ -214,7 +213,7 @@ class UserCrud(CrudView): del fs.confirm_password # if fs.edit and user.person: - if isinstance(user, User) and user.person: + if isinstance(user, edbob.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 deleted file mode 100644 index e5c6980..0000000 --- a/edbob/tests/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ - -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/edbob/win32.py b/edbob/win32.py index 314ddaa..96a76bd 100644 --- a/edbob/win32.py +++ b/edbob/win32.py @@ -38,17 +38,9 @@ if sys.platform == 'win32': # docs should build for everyone import win32file import win32print import win32service + import win32serviceutil import winerror -try: - import win32serviceutil -except ImportError: - # Mock out for testing on Linux. - class Object(object): - pass - win32serviceutil = Object() - win32serviceutil.ServiceFramework = Object - import edbob diff --git a/fabfile.py b/fabfile.py index 1eb4728..8e01404 100644 --- a/fabfile.py +++ b/fabfile.py @@ -22,15 +22,25 @@ # ################################################################################ -import shutil +import os.path from fabric.api import * +execfile(os.path.join(os.path.dirname(__file__), 'edbob', '_version.py')) + + @task def release(): """ Release a new version of 'edbob'. """ - shutil.rmtree('edbob.egg-info') - local('python setup.py sdist --formats=gztar register upload') + + local("python setup.py egg_info --tag-build='' sdist --formats=gztar") + + filename = 'edbob-{0}.tar.gz'.format(__version__) + + put(os.path.join('dist', filename), '/srv/pypi/{0}'.format(filename)) + with cd('/srv/pypi'): + run('rm --recursive --force simple') + run('compoze index') diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 28110c5..0000000 --- a/setup.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[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 6c9bf9a..f81a1fb 100644 --- a/setup.py +++ b/setup.py @@ -73,10 +73,7 @@ requires = [ 'decorator', # 3.3.2 'lockfile', # 0.9.1 'progressbar', # 2.3 - - # Hardcode ``pytz`` minimum since apparently it isn't (any longer?) enough - # to simply require the library. - 'pytz>=2013b', # 2013b + 'pytz', # 2012b ] if sys.version_info < (2, 7): @@ -212,8 +209,6 @@ setup( install_requires = requires, extras_require = extras, - tests_require = requires + ['nose'], - test_suite = 'nose.collector', packages = find_packages(), include_package_data = True,