diff --git a/CHANGES.txt b/CHANGES.txt index 8bfbfbc..f703f67 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,29 +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 ------- - -* Removed ``setup.cfg`` file. - -* Changed some logging instances from ``INFO`` to ``DEBUG``. - -* Updated ``repr()`` output for model classes. - - 0.1a28 ------ diff --git a/edbob/_version.py b/edbob/_version.py index 10939f0..f99350a 100644 --- a/edbob/_version.py +++ b/edbob/_version.py @@ -1 +1 @@ -__version__ = '0.1.2' +__version__ = '0.1a28' diff --git a/edbob/db/extensions/__init__.py b/edbob/db/extensions/__init__.py index a235b3e..cf875da 100644 --- a/edbob/db/extensions/__init__.py +++ b/edbob/db/extensions/__init__.py @@ -366,7 +366,7 @@ def extend_framework(): session.close() for name in sorted(extensions, extension_sorter(extensions)): - log.debug("Applying active extension: %s" % name) + log.info("Applying active extension: %s" % name) ext = extensions[name] # merge_extension_metadata(ext) # ext.extend_classes() diff --git a/edbob/db/extensions/auth/model.py b/edbob/db/extensions/auth/model.py index f167739..a3f36f0 100644 --- a/edbob/db/extensions/auth/model.py +++ b/edbob/db/extensions/auth/model.py @@ -51,8 +51,7 @@ class Permission(Base): permission = Column(String(50), primary_key=True) def __repr__(self): - return "Permission(role_uuid={0}, permission={1})".format( - repr(self.role_uuid), repr(self.permission)) + return "" % (self.role, self.permission) def __unicode__(self): return unicode(self.permission or '') @@ -70,7 +69,7 @@ class UserRole(Base): role_uuid = Column(String(32), ForeignKey('roles.uuid')) def __repr__(self): - return "UserRole(uuid={0})".format(repr(self.uuid)) + return "" % (self.user, self.role) class Role(Base): @@ -98,7 +97,7 @@ class Role(Base): getset_factory=getset_factory) def __repr__(self): - return "Role(uuid={0})".format(repr(self.uuid)) + return "" % self.name def __unicode__(self): return unicode(self.name or '') @@ -125,7 +124,7 @@ class User(Base): getset_factory=getset_factory) def __repr__(self): - return "User(uuid={0})".format(repr(self.uuid)) + return "" % self.username def __unicode__(self): return unicode(self.username or '') diff --git a/edbob/db/extensions/contact/model.py b/edbob/db/extensions/contact/model.py index 6576b5c..8cd05de 100644 --- a/edbob/db/extensions/contact/model.py +++ b/edbob/db/extensions/contact/model.py @@ -72,8 +72,7 @@ class PhoneNumber(Base): __mapper_args__ = {'polymorphic_on': parent_type} def __repr__(self): - return "{0}(uuid={1})".format( - self.__class__.__name__, repr(self.uuid)) + return "<%s: %s>" % (self.__class__.__name__, self.number) def __unicode__(self): return unicode(self.number) @@ -104,8 +103,7 @@ class EmailAddress(Base): __mapper_args__ = {'polymorphic_on': parent_type} def __repr__(self): - return "{0}(uuid={1})".format( - self.__class__.__name__, repr(self.uuid)) + return "<%s: %s>" % (self.__class__.__name__, self.address) def __unicode__(self): return unicode(self.address) @@ -133,7 +131,7 @@ class Person(Base): display_name = Column(String(100), default=get_person_display_name) def __repr__(self): - return "Person(uuid={0})".format(repr(self.uuid)) + return "" % self.display_name def __unicode__(self): return unicode(self.display_name or '') diff --git a/edbob/db/model.py b/edbob/db/model.py index b5222c3..a077ba0 100644 --- a/edbob/db/model.py +++ b/edbob/db/model.py @@ -54,7 +54,7 @@ class ActiveExtension(Base): name = Column(String(50), primary_key=True) def __repr__(self): - return "ActiveExtension(name={0})".format(repr(self.name)) + return "" % self.name def __str__(self): return str(self.name or '') @@ -71,4 +71,4 @@ class Setting(Base): value = Column(Text) def __repr__(self): - return "Setting(name={0})".format(repr(self.name)) + return "" % self.name 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/time.py b/edbob/time.py index c29049a..46bfeca 100644 --- a/edbob/time.py +++ b/edbob/time.py @@ -75,7 +75,7 @@ def init(config): tz = config.get('edbob.time', key) if tz: key = key[5:] - log.debug("'%s' timezone set to '%s'" % (key, tz)) + log.info("'%s' timezone set to '%s'" % (key, tz)) set_timezone(tz, key) if 'local' not in timezones: 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 index 28110c5..018c3b4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,2 @@ -[nosetests] -nocapture = 1 -cover-package = edbob -cover-erase = 1 -cover-inclusive = 1 -cover-html = 1 -cover-html-dir = htmlcov +[egg_info] +tag_build = .dev 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,