diff --git a/.gitignore b/.gitignore index 341cafe..cb3f83e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,7 @@ dist example/example.db docs/_build .tox/ -*.egg/ \ No newline at end of file +*.egg/ +pep8.txt +coverage.xml +.coverage \ No newline at end of file diff --git a/dbtemplates/__init__.py b/dbtemplates/__init__.py index 5a7cfda..e16f115 100644 --- a/dbtemplates/__init__.py +++ b/dbtemplates/__init__.py @@ -1,16 +1,2 @@ -VERSION = (1, 2, 0, "f", 0) # following PEP 386 -DEV_N = None - - -def get_version(): - version = "%s.%s" % (VERSION[0], VERSION[1]) - if VERSION[2]: - version = "%s.%s" % (version, VERSION[2]) - if VERSION[3] != "f": - version = "%s%s%s" % (version, VERSION[3], VERSION[4]) - if DEV_N: - version = "%s.dev%s" % (version, DEV_N) - return version - - -__version__ = get_version() +# following PEP 386, versiontools will pick it up +__version__ = (1, 2, 1, "final", 0) diff --git a/dbtemplates/conf.py b/dbtemplates/conf.py index f245983..e1075a2 100644 --- a/dbtemplates/conf.py +++ b/dbtemplates/conf.py @@ -1,11 +1,12 @@ import posixpath from django.core.exceptions import ImproperlyConfigured +from django.conf import settings -from dbtemplates.utils.settings import AppSettings +from appconf import AppConf -class DbTemplatesSettings(AppSettings): +class DbTemplatesConf(AppConf): USE_CODEMIRROR = False USE_REVERSION = False ADD_DEFAULT_SITE = True @@ -15,16 +16,16 @@ class DbTemplatesSettings(AppSettings): def configure_media_prefix(self, value): if value is None: - base_url = getattr(self, "STATIC_URL", None) + base_url = getattr(settings, "STATIC_URL", None) if base_url is None: - base_url = self.MEDIA_URL + base_url = settings.MEDIA_URL value = posixpath.join(base_url, "dbtemplates/") return value def configure_cache_backend(self, value): # If we are on Django 1.3 AND using the new CACHES setting.. - if hasattr(self, "CACHES"): - if "dbtemplates" in self.CACHES: + if hasattr(settings, "CACHES"): + if "dbtemplates" in settings.CACHES: return "dbtemplates" else: return "default" @@ -35,9 +36,7 @@ class DbTemplatesSettings(AppSettings): return value def configure_use_reversion(self, value): - if value and 'reversion' not in self.INSTALLED_APPS: + if value and 'reversion' not in settings.INSTALLED_APPS: raise ImproperlyConfigured("Please add 'reversion' to your " "INSTALLED_APPS setting to make use of it in dbtemplates.") return value - -settings = DbTemplatesSettings("DBTEMPLATES") diff --git a/dbtemplates/test_settings.py b/dbtemplates/test_settings.py new file mode 100644 index 0000000..4b46789 --- /dev/null +++ b/dbtemplates/test_settings.py @@ -0,0 +1,18 @@ +DBTEMPLATES_CACHE_BACKEND = 'dummy://' + +DATABASE_ENGINE = 'sqlite3' + +SITE_ID = 1 + +INSTALLED_APPS = [ + 'django.contrib.contenttypes', + 'django.contrib.sites', + 'django.contrib.admin', + 'dbtemplates', +] + +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + 'dbtemplates.loader.Loader', +) diff --git a/dbtemplates/utils/settings.py b/dbtemplates/utils/settings.py deleted file mode 100644 index 0431888..0000000 --- a/dbtemplates/utils/settings.py +++ /dev/null @@ -1,106 +0,0 @@ -from inspect import getmembers -from django.conf import settings - - -class AppSettings(object): - """ - An app setting object to be used for handling app setting defaults - gracefully and providing a nice API for them. Say you have an app - called ``myapp`` and want to define a few defaults, and refer to the - defaults easily in the apps code. Add a ``settings.py`` to your app:: - - from path.to.utils import AppSettings - - class MyAppSettings(AppSettings): - SETTING_1 = "one" - SETTING_2 = ( - "two", - ) - - Then initialize the setting with the correct prefix in the location of - of your choice, e.g. ``conf.py`` of the app module:: - - settings = MyAppSettings(prefix="MYAPP") - - The ``MyAppSettings`` instance will automatically look at Django's - global setting to determine each of the settings and respect the - provided ``prefix``. E.g. adding this to your site's ``settings.py`` - will set the ``SETTING_1`` setting accordingly:: - - MYAPP_SETTING_1 = "uno" - - Usage - ----- - - Instead of using ``from django.conf import settings`` as you would - usually do, you can switch to using your apps own settings module - to access the app settings:: - - from myapp.conf import settings - - print myapp_settings.MYAPP_SETTING_1 - - ``AppSettings`` instances also work as pass-throughs for other - global settings that aren't related to the app. For example the - following code is perfectly valid:: - - from myapp.conf import settings - - if "myapp" in settings.INSTALLED_APPS: - print "yay, myapp is installed!" - - Custom handling - --------------- - - Each of the settings can be individually configured with callbacks. - For example, in case a value of a setting depends on other settings - or other dependencies. The following example sets one setting to a - different value depending on a global setting:: - - from django.conf import settings - - class MyCustomAppSettings(AppSettings): - ENABLED = True - - def configure_enabled(self, value): - return value and not self.DEBUG - - custom_settings = MyCustomAppSettings("MYAPP") - - The value of ``custom_settings.MYAPP_ENABLED`` will vary depending on the - value of the global ``DEBUG`` setting. - - Each of the app settings can be customized by providing - a method ``configure_`` that takes the default - value as defined in the class attributes as the only parameter. - The method needs to return the value to be use for the setting in - question. - """ - def __dir__(self): - return sorted(list(set(self.__dict__.keys() + dir(settings)))) - - __members__ = lambda self: self.__dir__() - - def __getattr__(self, name): - if name.startswith(self._prefix): - raise AttributeError("%r object has no attribute %r" % - (self.__class__.__name__, name)) - return getattr(settings, name) - - def __setattr__(self, name, value): - super(AppSettings, self).__setattr__(name, value) - if name in dir(settings): - setattr(settings, name, value) - - def __init__(self, prefix): - super(AppSettings, self).__setattr__('_prefix', prefix) - for setting, class_value in getmembers(self.__class__): - if setting == setting.upper(): - prefixed = "%s_%s" % (prefix.upper(), setting.upper()) - configured_value = getattr(settings, prefixed, class_value) - callback_name = "configure_%s" % setting.lower() - callback = getattr(self, callback_name, None) - if callable(callback): - configured_value = callback(configured_value) - delattr(self.__class__, setting) - setattr(self, prefixed, configured_value) diff --git a/docs/changelog.txt b/docs/changelog.txt index e503f9a..9271c6e 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -1,13 +1,15 @@ Changelog ========= -v1.2.1 (2011-09-05) +v1.2.1 (2011-09-07) ------------------- * Fixed a wrong use of the non-lazy localization tools. * Fixed bugs in the documentation. +* Make use of django-appconf and versiontools. + v1.2 (2011-08-15) ----------------- diff --git a/docs/conf.py b/docs/conf.py index 0364d2b..98092ec 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,7 +47,7 @@ copyright = u'2007-2011, Jannis Leidel and contributors' # The short X.Y version. version = '1.2' # The full version, including alpha/beta/rc tags. -release = '1.2' +release = '1.2.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/runtests.py b/runtests.py deleted file mode 100644 index 68b0b6c..0000000 --- a/runtests.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -from django.conf import settings - -if not settings.configured: - settings.configure( - DBTEMPLATES_CACHE_BACKEND = 'dummy://', - DATABASE_ENGINE='sqlite3', - SITE_ID=1, - INSTALLED_APPS=[ - 'django.contrib.contenttypes', - 'django.contrib.sites', - 'django.contrib.admin', - 'dbtemplates', - ], - TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - 'dbtemplates.loader.Loader', - ) - ) - -from django.test.simple import run_tests - - -def runtests(*test_args): - if not test_args: - test_args = ['dbtemplates'] - sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'dbtemplates')) - failures = run_tests(test_args, verbosity=1, interactive=True) - sys.exit(failures) - - -if __name__ == '__main__': - runtests(*sys.argv[1:]) diff --git a/setup.py b/setup.py index 7ecb97b..be12e1f 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,14 @@ +import codecs +from os import path from setuptools import setup, find_packages +read = lambda filepath: codecs.open(filepath, 'r', 'utf-8').read() + setup( name='django-dbtemplates', - version=__import__('dbtemplates').__version__, + version=':versiontools:dbtemplates:', description='Template loader for templates stored in the database', - long_description=open('README.rst').read(), + long_description=read(path.join(path.dirname(__file__), 'README.rst')), author='Jannis Leidel', author_email='jannis@leidel.info', url='http://django-dbtemplates.readthedocs.org/', @@ -30,4 +34,6 @@ setup( 'Programming Language :: Python :: 2.7', 'Framework :: Django', ], + install_requires=['django-appconf >= 0.4'], + setup_requires=['versiontools >= 1.5'], ) diff --git a/tox.ini b/tox.ini index 5ab7af1..66f3dc6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,41 +1,51 @@ [tox] -downloadcache = .tox/_download/ -distribute = False +distribute = false envlist = py25-1.2.X, py26-1.2.X, py27-1.2.X, py25-1.3.X, py26-1.3.X, py27-1.3.X [testenv] +downloadcache = {toxworkdir}/_download/ commands = - python runtests.py + {envbindir}/coverage erase + {envbindir}/coverage run --branch --source=dbtemplates {envbindir}/django-admin.py test {posargs:dbtemplates} --settings=dbtemplates.test_settings + {envbindir}/coverage report --omit=*test* + {envbindir}/coverage html --omit=*test* -d {envtmpdir} + echo "Type the following to open the coverage report: python -m webbrowser -t file://{envtmpdir}/index.html" [testenv:py25-1.2.X] basepython = python2.5 deps = + coverage django==1.2.5 [testenv:py26-1.2.X] basepython = python2.6 deps = + coverage django==1.2.5 [testenv:py27-1.2.X] basepython = python2.7 deps = + coverage django==1.2.5 [testenv:py25-1.3.X] basepython = python2.5 deps = + coverage django==1.3 [testenv:py26-1.3.X] basepython = python2.6 deps = + coverage django==1.3 [testenv:py27-1.3.X] basepython = python2.7 deps = + coverage django==1.3