save point (see note)
Added 'db' command, tweaked pyramid scaffold a bit (added 'initialize' command there), removed migrate 'schema' repository in preparation for alembic.
This commit is contained in:
		
							parent
							
								
									69e92c13db
								
							
						
					
					
						commit
						727b9a5fa7
					
				
					 20 changed files with 270 additions and 144 deletions
				
			
		| 
						 | 
				
			
			@ -37,6 +37,20 @@ import edbob
 | 
			
		|||
from edbob.util import requires_impl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ArgumentParser(argparse.ArgumentParser):
 | 
			
		||||
    """
 | 
			
		||||
    Customized version of ``argparse.ArgumentParser``, which overrides some of
 | 
			
		||||
    the argument parsing logic.  This is necessary for the application's
 | 
			
		||||
    primary command (:class:`Command` class); but is not used with
 | 
			
		||||
    :class:`Subcommand` derivatives.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def parse_args(self, args=None, namespace=None):
 | 
			
		||||
        args, argv = self.parse_known_args(args, namespace)
 | 
			
		||||
        args.argv = argv
 | 
			
		||||
        return args
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Command(edbob.Object):
 | 
			
		||||
    """
 | 
			
		||||
    The primary command for the application.  
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +121,7 @@ Try '%(name)s help <command>' for more help.""" % self
 | 
			
		|||
        accordingly (or displays help text).
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        parser = argparse.ArgumentParser(
 | 
			
		||||
        parser = ArgumentParser(
 | 
			
		||||
            prog=self.name,
 | 
			
		||||
            description=self.description,
 | 
			
		||||
            add_help=False,
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +181,7 @@ Try '%(name)s help <command>' for more help.""" % self
 | 
			
		|||
        
 | 
			
		||||
        # And finally, do something of real value...
 | 
			
		||||
        cmd = self.subcommands[cmd](parent=self)
 | 
			
		||||
        cmd._run(*args.command)
 | 
			
		||||
        cmd._run(*(args.command + args.argv))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Subcommand(edbob.Object):
 | 
			
		||||
| 
						 | 
				
			
			@ -231,14 +245,91 @@ class Subcommand(edbob.Object):
 | 
			
		|||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DatabaseCommand(Subcommand):
 | 
			
		||||
    """
 | 
			
		||||
    Provides tools for managing an ``edbob`` database; called as ``edbob db``.
 | 
			
		||||
 | 
			
		||||
    This command requires additional arguments; see ``edbob help db`` for more
 | 
			
		||||
    information.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    name = 'db'
 | 
			
		||||
    description = "Tools for managing edbob databases"
 | 
			
		||||
 | 
			
		||||
    def add_parser_args(self, parser):
 | 
			
		||||
        parser.add_argument('-D', '--database', metavar='URL',
 | 
			
		||||
                            help="Database engine (default is edbob.db.engine)")
 | 
			
		||||
        parser.add_argument('command', choices=['upgrade', 'extensions', 'activate', 'deactivate'],
 | 
			
		||||
                            help="Command to execute against database")
 | 
			
		||||
 | 
			
		||||
    def run(self, args):
 | 
			
		||||
        if args.database:
 | 
			
		||||
            from sqlalchemy import create_engine
 | 
			
		||||
            from sqlalchemy.exc import ArgumentError
 | 
			
		||||
            try:
 | 
			
		||||
                engine = create_engine(args.database)
 | 
			
		||||
            except ArgumentError, err:
 | 
			
		||||
                print err
 | 
			
		||||
                return
 | 
			
		||||
        else:
 | 
			
		||||
            from edbob.db import engine
 | 
			
		||||
        if not engine:
 | 
			
		||||
            print >> sys.stderr, "Database not configured; please change that or specify -D URL"
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        if args.command == 'upgrade':
 | 
			
		||||
            print 'got upgrade ..'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# class ExtensionsCommand(RattailCommand):
 | 
			
		||||
#     """
 | 
			
		||||
#     Displays the currently-installed (available) extensions, and whether or not
 | 
			
		||||
#     each has been activated within the configured database.  Called as
 | 
			
		||||
#     ``rattail extensions``.
 | 
			
		||||
#     """
 | 
			
		||||
 | 
			
		||||
#     short_description = "Displays available extensions and their statuses"
 | 
			
		||||
 | 
			
		||||
#     def __call__(self, options, **args):
 | 
			
		||||
#         from sqlalchemy.exc import OperationalError
 | 
			
		||||
#         from rattail import engine
 | 
			
		||||
#         from rattail.db.util import core_schema_installed
 | 
			
		||||
#         from rattail.db.ext import get_available_extensions, extension_active
 | 
			
		||||
 | 
			
		||||
#         try:
 | 
			
		||||
#             engine.connect()
 | 
			
		||||
#         except OperationalError, e:
 | 
			
		||||
#             print >> sys.stderr, "Cannot connect to database:"
 | 
			
		||||
#             print >> sys.stderr, engine.url
 | 
			
		||||
#             print >> sys.stderr, e[0].strip()
 | 
			
		||||
#             return
 | 
			
		||||
 | 
			
		||||
#         if not core_schema_installed():
 | 
			
		||||
#             print >> sys.stderr, "Database lacks core schema:"
 | 
			
		||||
#             print >> sys.stderr, engine.url
 | 
			
		||||
#             return
 | 
			
		||||
 | 
			
		||||
#         extensions = get_available_extensions()
 | 
			
		||||
#         print ''
 | 
			
		||||
#         print ' %-25s %-10s' % ("Extension", "Active?")
 | 
			
		||||
#         print '-' * 35
 | 
			
		||||
#         for name in sorted(extensions):
 | 
			
		||||
#             active = 'Y' if extension_active(name) else 'N'
 | 
			
		||||
#             print ' %-28s %s' % (name, active)
 | 
			
		||||
#         print ''
 | 
			
		||||
#         print "Use 'rattail {activate|deactivate} EXTENSION' to change."
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
class ShellCommand(Subcommand):
 | 
			
		||||
    """
 | 
			
		||||
    Launches a Python shell (of your choice) with ``edbob`` pre-loaded; called
 | 
			
		||||
    as ``edbob shell``.
 | 
			
		||||
 | 
			
		||||
    You can configure the shell within ``edbob.conf`` (otherwise ``python`` is
 | 
			
		||||
    You can define the shell within your config file (otherwise ``python`` is
 | 
			
		||||
    assumed)::
 | 
			
		||||
 | 
			
		||||
    .. highlight:: ini
 | 
			
		||||
 | 
			
		||||
       [edbob]
 | 
			
		||||
       shell.python = ipython
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ import logging
 | 
			
		|||
import sqlalchemy.exc
 | 
			
		||||
# from sqlalchemy.orm import clear_mappers
 | 
			
		||||
 | 
			
		||||
# import migrate.versioning.api
 | 
			
		||||
import migrate.versioning.api
 | 
			
		||||
# from migrate.versioning.schema import ControlledSchema
 | 
			
		||||
 | 
			
		||||
# import rattail
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,11 @@ import edbob.db
 | 
			
		|||
from edbob.db import exceptions
 | 
			
		||||
from edbob.db import Session
 | 
			
		||||
from edbob.db.classes import ActiveExtension
 | 
			
		||||
from edbob.db.util import get_database_version
 | 
			
		||||
from edbob.db.util import (
 | 
			
		||||
    get_database_version,
 | 
			
		||||
    get_repository_path,
 | 
			
		||||
    get_repository_version,
 | 
			
		||||
    )
 | 
			
		||||
from edbob.util import requires_impl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -144,35 +148,35 @@ class Extension(edbob.Object):
 | 
			
		|||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# def activate_extension(extension, engine=None):
 | 
			
		||||
#     """
 | 
			
		||||
#     Activates the :class:`RattailExtension` instance represented by
 | 
			
		||||
#     ``extension`` (which can be the actual instance, or the extension's name)
 | 
			
		||||
#     by installing its schema and registering it within the database, and
 | 
			
		||||
#     immediately applies it to the current ORM API.
 | 
			
		||||
def activate_extension(extension, engine=None):
 | 
			
		||||
    """
 | 
			
		||||
    Activates the :class:`Extension` instance represented by ``extension``
 | 
			
		||||
    (which can be the actual instance, or the extension's name) by installing
 | 
			
		||||
    its schema and registering it within the database, and immediately applies
 | 
			
		||||
    it to the current ORM/API.
 | 
			
		||||
 | 
			
		||||
#     If ``engine`` is not provided, then ``rattail.engine`` is assumed.
 | 
			
		||||
#     """
 | 
			
		||||
    If ``engine`` is not provided, then :attr:`edbob.db.engine` is assumed.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
#     if engine is None:
 | 
			
		||||
#         engine = rattail.engine
 | 
			
		||||
    if engine is None:
 | 
			
		||||
        engine = edbob.db.engine
 | 
			
		||||
 | 
			
		||||
#     if not isinstance(extension, RattailExtension):
 | 
			
		||||
#         extension = get_extension(extension)
 | 
			
		||||
    if not isinstance(extension, Extension):
 | 
			
		||||
        extension = get_extension(extension)
 | 
			
		||||
 | 
			
		||||
#     log.info("Activating extension: %s" % extension.name)
 | 
			
		||||
#     install_extension_schema(extension, engine)
 | 
			
		||||
    log.info("Activating extension: %s" % extension.name)
 | 
			
		||||
    install_extension_schema(extension, engine)
 | 
			
		||||
 | 
			
		||||
#     session = Session(bind=engine)
 | 
			
		||||
#     if not session.query(ActiveExtension).get(extension.name):
 | 
			
		||||
#         session.add(ActiveExtension(name=extension.name))
 | 
			
		||||
#         session.commit()
 | 
			
		||||
#     session.close()
 | 
			
		||||
    session = Session(bind=engine)
 | 
			
		||||
    if not session.query(ActiveExtension).get(extension.name):
 | 
			
		||||
        session.add(ActiveExtension(name=extension.name))
 | 
			
		||||
        session.commit()
 | 
			
		||||
    session.close()
 | 
			
		||||
 | 
			
		||||
#     merge_extension_metadata(extension)
 | 
			
		||||
#     extension.extend_classes()
 | 
			
		||||
#     extension.extend_mappers(rattail.metadata)
 | 
			
		||||
#     _active_extensions[extension.name] = extension
 | 
			
		||||
    merge_extension_metadata(extension)
 | 
			
		||||
    extension.extend_classes()
 | 
			
		||||
    extension.extend_mappers(rattail.metadata)
 | 
			
		||||
    active_extensions[extension.name] = extension
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# def deactivate_extension(extension, engine=None):
 | 
			
		||||
| 
						 | 
				
			
			@ -217,7 +221,10 @@ def extend_framework():
 | 
			
		|||
    found will be used to extend the ORM/API in-place.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    # Do we even have an engine?
 | 
			
		||||
    engine = edbob.db.engine
 | 
			
		||||
    if not engine:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    # Check primary database connection.
 | 
			
		||||
    try:
 | 
			
		||||
| 
						 | 
				
			
			@ -304,32 +311,34 @@ def get_extension(name):
 | 
			
		|||
    raise exceptions.ExtensionNotFound(name)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# def install_extension_schema(extension, engine=None):
 | 
			
		||||
#     """
 | 
			
		||||
#     Installs an extension's schema to the database and adds version control for
 | 
			
		||||
#     it.
 | 
			
		||||
#     """
 | 
			
		||||
def install_extension_schema(extension, engine=None):
 | 
			
		||||
    """
 | 
			
		||||
    Installs an extension's schema to the database and adds version control for
 | 
			
		||||
    it.  ``extension`` must be a valid :class:`Extension` instance.
 | 
			
		||||
 | 
			
		||||
#     if engine is None:
 | 
			
		||||
#         engine = rattail.engine
 | 
			
		||||
    If ``engine`` is not provided, :attr:`edbob.db.engine` is assumed.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
#     # Extensionls aren't required to provide metadata...
 | 
			
		||||
#     ext_meta = extension.get_metadata()
 | 
			
		||||
#     if not ext_meta:
 | 
			
		||||
#         return
 | 
			
		||||
    if engine is None:
 | 
			
		||||
        engine = edbob.db.engine
 | 
			
		||||
 | 
			
		||||
#     # ...but if they do they must also provide a SQLAlchemy-Migrate repository!
 | 
			
		||||
#     assert extension.schema, "Extension does not implement 'schema': %s" % extension.name
 | 
			
		||||
    # Extensions aren't required to provide metadata...
 | 
			
		||||
    ext_meta = extension.get_metadata()
 | 
			
		||||
    if not ext_meta:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    # ...but if they do they must also provide a SQLAlchemy-Migrate repository.
 | 
			
		||||
    assert extension.schema, "Extension does not implement 'schema': %s" % extension.name
 | 
			
		||||
        
 | 
			
		||||
#     meta = rattail.metadata
 | 
			
		||||
#     for table in meta.sorted_tables:
 | 
			
		||||
#         table.tometadata(ext_meta)
 | 
			
		||||
#     for table in ext_meta.sorted_tables:
 | 
			
		||||
#         if table.name not in meta.tables:
 | 
			
		||||
#             table.create(bind=engine, checkfirst=True)
 | 
			
		||||
    meta = edbob.db.metadata
 | 
			
		||||
    for table in meta.sorted_tables:
 | 
			
		||||
        table.tometadata(ext_meta)
 | 
			
		||||
    for table in ext_meta.sorted_tables:
 | 
			
		||||
        if table.name not in meta.tables:
 | 
			
		||||
            table.create(bind=engine, checkfirst=True)
 | 
			
		||||
 | 
			
		||||
#     migrate.versioning.api.version_control(
 | 
			
		||||
#         str(engine.url), get_repository_path(extension), get_repository_version(extension))
 | 
			
		||||
    migrate.versioning.api.version_control(
 | 
			
		||||
        str(engine.url), get_repository_path(extension), get_repository_version(extension))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def merge_extension_metadata(ext):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
This is a database migration repository.
 | 
			
		||||
 | 
			
		||||
More information at
 | 
			
		||||
http://code.google.com/p/sqlalchemy-migrate/
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
from migrate.versioning.shell import main
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main(debug='False')
 | 
			
		||||
| 
						 | 
				
			
			@ -1,25 +0,0 @@
 | 
			
		|||
[db_settings]
 | 
			
		||||
# Used to identify which repository this database is versioned under.
 | 
			
		||||
# You can use the name of your project.
 | 
			
		||||
repository_id=edbob
 | 
			
		||||
 | 
			
		||||
# The name of the database table used to track the schema version.
 | 
			
		||||
# This name shouldn't already be used by your project.
 | 
			
		||||
# If this is changed once a database is under version control, you'll need to 
 | 
			
		||||
# change the table name in each database too. 
 | 
			
		||||
version_table=migrate_version
 | 
			
		||||
 | 
			
		||||
# When committing a change script, Migrate will attempt to generate the 
 | 
			
		||||
# sql for all supported databases; normally, if one of them fails - probably
 | 
			
		||||
# because you don't have that database installed - it is ignored and the 
 | 
			
		||||
# commit continues, perhaps ending successfully. 
 | 
			
		||||
# Databases in this list MUST compile successfully during a commit, or the 
 | 
			
		||||
# entire commit will fail. List the databases your application will actually 
 | 
			
		||||
# be using to ensure your updates to that database work properly.
 | 
			
		||||
# This must be a list; example: ['postgres','sqlite']
 | 
			
		||||
required_dbs=[]
 | 
			
		||||
 | 
			
		||||
# When creating new change scripts, Migrate will stamp the new script with
 | 
			
		||||
# a version number. By default this is latest_version + 1. You can set this
 | 
			
		||||
# to 'true' to tell Migrate to use the UTC timestamp instead.
 | 
			
		||||
use_timestamp_numbering=False
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +12,6 @@ from pyramid.config import Configurator
 | 
			
		|||
import edbob
 | 
			
		||||
 | 
			
		||||
from {{package}}._version import __version__
 | 
			
		||||
from {{package}}.db import DBSession
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main(global_config, **settings):
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +36,7 @@ def main(global_config, **settings):
 | 
			
		|||
    # Configure Pyramid
 | 
			
		||||
    config = Configurator(settings=settings)
 | 
			
		||||
    config.include('edbob.pyramid')
 | 
			
		||||
    config.include('{{package}}.subscribers')
 | 
			
		||||
    config.scan()
 | 
			
		||||
 | 
			
		||||
    # Configure Beaker
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,6 @@ def main(global_config, **settings):
 | 
			
		|||
    edbob.init('{{package}}', os.path.abspath(settings['edbob.config']))
 | 
			
		||||
 | 
			
		||||
    # Add static views
 | 
			
		||||
    config.add_static_view('favicon.ico', 'static/favicon.ico')
 | 
			
		||||
    # config.add_static_view('css', 'static/css', cache_max_age=3600)
 | 
			
		||||
    # config.add_static_view('img', 'static/img', cache_max_age=3600)
 | 
			
		||||
    # config.add_static_view('js', 'static/js', cache_max_age=3600)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,34 +23,39 @@ class Command(commands.Command):
 | 
			
		|||
    long_description = ''
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InitDatabaseCommand(commands.Subcommand):
 | 
			
		||||
class InitCommand(commands.Subcommand):
 | 
			
		||||
    """
 | 
			
		||||
    Initializes the database.  This is meant to be leveraged as part of setting
 | 
			
		||||
    up the application.  The database used by this command will be determined
 | 
			
		||||
    by config, for example::
 | 
			
		||||
    Initializes the database; called as ``{{package}} initialize``.  This is
 | 
			
		||||
    meant to be leveraged as part of setting up the application.  The database
 | 
			
		||||
    used by this command will be determined by config, for example::
 | 
			
		||||
 | 
			
		||||
       .. highlight:: ini
 | 
			
		||||
    .. highlight:: ini
 | 
			
		||||
 | 
			
		||||
       [edbob.db]
 | 
			
		||||
       sqlalchemy.url = postgresql://user:pass@localhost/{{package}}
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    name = 'init-db'
 | 
			
		||||
    name = 'initialize'
 | 
			
		||||
    description = "Initialize the database"
 | 
			
		||||
 | 
			
		||||
    def run(self, args):
 | 
			
		||||
        from edbob.db import engine
 | 
			
		||||
        from edbob.db.util import install_core_schema
 | 
			
		||||
        from edbob.db.exceptions import CoreSchemaAlreadyInstalled
 | 
			
		||||
        from edbob.db.extensions import activate_extension
 | 
			
		||||
 | 
			
		||||
        # Install core schema to database.
 | 
			
		||||
        try:
 | 
			
		||||
            install_core_schema(engine)
 | 
			
		||||
        except CoreSchemaAlreadyInstalled, err:
 | 
			
		||||
            print err
 | 
			
		||||
            print '%s:' % err
 | 
			
		||||
            print '  %s' % engine.url
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # Activate any extensions you like here...
 | 
			
		||||
        # activate_extension('shrubbery')
 | 
			
		||||
 | 
			
		||||
        # Okay, on to bootstrapping...
 | 
			
		||||
 | 
			
		||||
        from edbob.db import Session
 | 
			
		||||
        from edbob.db.classes import Role, User
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +73,8 @@ class InitDatabaseCommand(commands.Subcommand):
 | 
			
		|||
        session.commit()
 | 
			
		||||
        session.close()
 | 
			
		||||
        
 | 
			
		||||
        print "Initialized database %s" % engine.url
 | 
			
		||||
        print "Initialized database:"
 | 
			
		||||
        print '  %s' % engine.url
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main(*args):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,4 +8,6 @@ from sqlalchemy.orm import scoped_session, sessionmaker
 | 
			
		|||
from zope.sqlalchemy import ZopeTransactionExtension
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
 | 
			
		||||
__all__ = ['Session']
 | 
			
		||||
 | 
			
		||||
Session = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								edbob/pyramid/scaffolds/edbob/+package+/subscribers.py_tmpl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								edbob/pyramid/scaffolds/edbob/+package+/subscribers.py_tmpl
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
``{{package}}.subscribers`` -- Pyramid Event Subscribers
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
import {{package}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def before_render(event):
 | 
			
		||||
    """
 | 
			
		||||
    Adds goodies to the global template renderer context.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    renderer_globals = event
 | 
			
		||||
    renderer_globals['{{package}}'] = {{package}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def includeme(config):
 | 
			
		||||
    config.add_subscriber('{{package}}.subscribers:before_render',
 | 
			
		||||
                          'pyramid.events.BeforeRender')
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +1,7 @@
 | 
			
		|||
<%inherit file="edbob/base.mako" />
 | 
			
		||||
<%def name="global_title()">{{project}}</%def>
 | 
			
		||||
<%def name="footer()">
 | 
			
		||||
  {{project}} v${{{package}}.__version__} powered by
 | 
			
		||||
  ${h.link_to("edbob", 'http://edbob.org/', target='_blank')} v${edbob.__version__}
 | 
			
		||||
</%def>
 | 
			
		||||
${parent.body()}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
<%inherit file="base.mako" />
 | 
			
		||||
 | 
			
		||||
<h1>Welcome to {{project}} !</h1>
 | 
			
		||||
<h1>Welcome to {{project}}</h1>
 | 
			
		||||
 | 
			
		||||
<p>You must choose, but choose wisely:</p>
 | 
			
		||||
<br />
 | 
			
		||||
 | 
			
		||||
<ul style="line-height: 200%;">
 | 
			
		||||
  <li>links should...</li>
 | 
			
		||||
  <li>...go here</li>
 | 
			
		||||
  <li>some...</li>
 | 
			
		||||
  <li>...links</li>
 | 
			
		||||
</ul>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
 | 
			
		||||
0.1a1
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,10 +8,15 @@ Welcome to the {{project}} project.
 | 
			
		|||
Getting Started
 | 
			
		||||
---------------
 | 
			
		||||
 | 
			
		||||
- cd <directory containing this file>
 | 
			
		||||
{{project}} should install and run without issue on Linux and Windows::
 | 
			
		||||
 | 
			
		||||
- $venv/bin/python setup.py develop
 | 
			
		||||
.. highlight:: sh
 | 
			
		||||
 | 
			
		||||
- $venv/bin/populate_{{package}} development.ini
 | 
			
		||||
 | 
			
		||||
- $venv/bin/pserve --reload development.ini
 | 
			
		||||
   $ virtualenv {{package}}
 | 
			
		||||
   $ cd <{{package}}-src-dir>
 | 
			
		||||
   $ python setup.py develop
 | 
			
		||||
   $ cd <virtual-env-dir>
 | 
			
		||||
   $ {{package}} make-app <app-dir>
 | 
			
		||||
   $ cd <app-dir>
 | 
			
		||||
   $ {{package}} -c development.ini initialize
 | 
			
		||||
   $ pserve --reload development.ini
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,6 +76,8 @@ setup(
 | 
			
		|||
        'Framework :: Pylons',
 | 
			
		||||
        'Operating System :: OS Independent',
 | 
			
		||||
        'Programming Language :: Python',
 | 
			
		||||
        'Programming Language :: Python :: 2.6',
 | 
			
		||||
        'Programming Language :: Python :: 2.7',
 | 
			
		||||
        'Topic :: Internet :: WWW/HTTP',
 | 
			
		||||
        'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
 | 
			
		||||
        ],
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +94,7 @@ setup(
 | 
			
		|||
{{package}} = {{package}}.commands:main
 | 
			
		||||
 | 
			
		||||
[{{package}}.commands]
 | 
			
		||||
init-db = {{package}}.commands:InitDatabaseCommand
 | 
			
		||||
initialize = {{package}}.commands:InitCommand
 | 
			
		||||
 | 
			
		||||
[paste.app_factory]
 | 
			
		||||
main = {{package}}:main
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,6 +95,12 @@ ul.sub-menu li {
 | 
			
		|||
    margin-right: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
    clear: both;
 | 
			
		||||
    margin-top: 40px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#body {
 | 
			
		||||
    padding-top: 15px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
<%def name="global_title()">edbob</%def>
 | 
			
		||||
<%def name="title()"></%def>
 | 
			
		||||
<%def name="head_tags()"></%def>
 | 
			
		||||
<%def name="footer()">
 | 
			
		||||
  powered by ${h.link_to('edbob', 'http://edbob.org', target='_blank')} v${edbob.__version__}
 | 
			
		||||
</%def>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 | 
			
		||||
<html style="direction: ltr;" xmlns="http://www.w3.org/1999/xhtml" lang="en-us">
 | 
			
		||||
  <head>
 | 
			
		||||
| 
						 | 
				
			
			@ -53,8 +56,8 @@
 | 
			
		|||
	  ${self.body()}
 | 
			
		||||
	</div><!-- body -->
 | 
			
		||||
 | 
			
		||||
	<div id="footer" style="clear: both; margin-top: 40px; text-align: center;">
 | 
			
		||||
	  powered by ${h.link_to('edbob', 'http://edbob.org', target='_blank')} v${edbob.__version__}
 | 
			
		||||
	<div id="footer">
 | 
			
		||||
	  ${self.footer()}
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
      </div><!-- main -->
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ def init(config):
 | 
			
		|||
    tz = config.get('edbob.time', 'timezone')
 | 
			
		||||
    if tz:
 | 
			
		||||
        set_timezone(tz)
 | 
			
		||||
        log.info("Set timezone to '%s'" % tz)
 | 
			
		||||
        log.debug("Timezone set to '%s'" % tz)
 | 
			
		||||
    else:
 | 
			
		||||
        log.warning("No timezone configured; falling back to US/Central")
 | 
			
		||||
        set_timezone('US/Central')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										87
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										87
									
								
								setup.py
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -30,6 +30,7 @@ except ImportError:
 | 
			
		|||
    use_setuptools()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import os.path
 | 
			
		||||
from setuptools import setup, find_packages
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,6 +40,50 @@ execfile(os.path.join(here, 'edbob', '_version.py'))
 | 
			
		|||
readme = open(os.path.join(here, 'README.txt')).read()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
requires = [
 | 
			
		||||
    #
 | 
			
		||||
    # Version numbers within comments below have specific meanings.
 | 
			
		||||
    # Basically the 'low' value is a "soft low," and 'high' a "soft high."
 | 
			
		||||
    # In other words:
 | 
			
		||||
    #
 | 
			
		||||
    # If either a 'low' or 'high' value exists, the primary point to be
 | 
			
		||||
    # made about the value is that it represents the most current (stable)
 | 
			
		||||
    # version available for the package (assuming typical public access
 | 
			
		||||
    # methods) whenever this project was started and/or documented.
 | 
			
		||||
    # Therefore:
 | 
			
		||||
    #
 | 
			
		||||
    # If a 'low' version is present, you should know that attempts to use
 | 
			
		||||
    # versions of the package significantly older than the 'low' version
 | 
			
		||||
    # may not yield happy results.  (A "hard" high limit may or may not be
 | 
			
		||||
    # indicated by a true version requirement.)
 | 
			
		||||
    #
 | 
			
		||||
    # Similarly, if a 'high' version is present, and especially if this
 | 
			
		||||
    # project has laid dormant for a while, you may need to refactor a bit
 | 
			
		||||
    # when attempting to support a more recent version of the package.  (A
 | 
			
		||||
    # "hard" low limit should be indicated by a true version requirement
 | 
			
		||||
    # when a 'high' version is present.)
 | 
			
		||||
    #
 | 
			
		||||
    # In any case, developers and other users are encouraged to play
 | 
			
		||||
    # outside the lines with regard to these soft limits.  If bugs are
 | 
			
		||||
    # encountered then they should be filed as such.
 | 
			
		||||
    #
 | 
			
		||||
    # package                       # low                   high
 | 
			
		||||
 | 
			
		||||
    'progressbar',                  # 2.3
 | 
			
		||||
    'pytz',                         # 2012b
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
if sys.version_info < (2, 7):
 | 
			
		||||
    # Python < 2.7 has a standard library in need of supplementation.
 | 
			
		||||
 | 
			
		||||
    requires += [
 | 
			
		||||
        #
 | 
			
		||||
        # package                       # low                   high
 | 
			
		||||
        #
 | 
			
		||||
        'argparse',                     # 1.2.1
 | 
			
		||||
        ]
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
    name = "edbob",
 | 
			
		||||
    version = __version__,
 | 
			
		||||
| 
						 | 
				
			
			@ -65,54 +110,19 @@ setup(
 | 
			
		|||
        'Topic :: Software Development :: Libraries :: Python Modules',
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
    install_requires = [
 | 
			
		||||
        #
 | 
			
		||||
        # Version numbers within comments below have specific meanings.
 | 
			
		||||
        # Basically the 'low' value is a "soft low," and 'high' a "soft high."
 | 
			
		||||
        # In other words:
 | 
			
		||||
        #
 | 
			
		||||
        # If either a 'low' or 'high' value exists, the primary point to be
 | 
			
		||||
        # made about the value is that it represents the most current (stable)
 | 
			
		||||
        # version available for the package (assuming typical public access
 | 
			
		||||
        # methods) whenever this project was started and/or documented.
 | 
			
		||||
        # Therefore:
 | 
			
		||||
        #
 | 
			
		||||
        # If a 'low' version is present, you should know that attempts to use
 | 
			
		||||
        # versions of the package significantly older than the 'low' version
 | 
			
		||||
        # may not yield happy results.  (A "hard" high limit may or may not be
 | 
			
		||||
        # indicated by a true version requirement.)
 | 
			
		||||
        #
 | 
			
		||||
        # Similarly, if a 'high' version is present, and especially if this
 | 
			
		||||
        # project has laid dormant for a while, you may need to refactor a bit
 | 
			
		||||
        # when attempting to support a more recent version of the package.  (A
 | 
			
		||||
        # "hard" low limit should be indicated by a true version requirement
 | 
			
		||||
        # when a 'high' version is present.)
 | 
			
		||||
        #
 | 
			
		||||
        # In any case, developers and other users are encouraged to play
 | 
			
		||||
        # outside the lines with regard to these soft limits.  If bugs are
 | 
			
		||||
        # encountered then they should be filed as such.
 | 
			
		||||
        #
 | 
			
		||||
        # package                       # low                   high
 | 
			
		||||
 | 
			
		||||
        'progressbar',                  # 2.3
 | 
			
		||||
        'pytz',                         # 2012b
 | 
			
		||||
 | 
			
		||||
        # If using Python < 2.7, you must install 'argparse' yourself...
 | 
			
		||||
        # 'argparse',                     # 1.2.1
 | 
			
		||||
        ],
 | 
			
		||||
    install_requires = requires,
 | 
			
		||||
 | 
			
		||||
    extras_require = {
 | 
			
		||||
        #
 | 
			
		||||
        # Same guidelines apply to the extra dependency versions.
 | 
			
		||||
 | 
			
		||||
        'db': [
 | 
			
		||||
            #
 | 
			
		||||
            # package                   # low                   high
 | 
			
		||||
            #
 | 
			
		||||
            'alembic',                  # 0.2.1
 | 
			
		||||
            'decorator',                # 3.3.2
 | 
			
		||||
            'py-bcrypt',                # 0.2
 | 
			
		||||
            'SQLAlchemy',               # 0.7.6
 | 
			
		||||
            'sqlalchemy-migrate',       # 0.7.2
 | 
			
		||||
            # 'sqlalchemy-migrate',       # 0.7.2
 | 
			
		||||
            'Tempita',                  # 0.5.1
 | 
			
		||||
            ],
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -150,6 +160,7 @@ edbobw = edbob.commands:main
 | 
			
		|||
edbob = edbob.pyramid.scaffolds:Template
 | 
			
		||||
 | 
			
		||||
[edbob.commands]
 | 
			
		||||
db = edbob.commands:DatabaseCommand
 | 
			
		||||
shell = edbob.commands:ShellCommand
 | 
			
		||||
uuid = edbob.commands:UuidCommand
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue