From 2a21946b7286c64917a5fc349517756551279812 Mon Sep 17 00:00:00 2001 From: Bart Saelen Date: Tue, 15 Apr 2014 11:08:22 +0200 Subject: [PATCH] refactor alembic implementation refactor alembic implementation to facilitate database upgrades when using scaffolds --- MANIFEST.in | 1 + alembic.ini | 5 +- {alembic => atramhasis/alembic}/README | 0 {alembic => atramhasis/alembic}/env.py | 15 +++++ .../alembic}/script.py.mako | 0 .../alembic}/versions/3924a7ad2f8_init.py | 0 .../scaffolds/atramhasis_demo/alembic.ini | 60 ++++++++++++++++++ .../atramhasis_demo/atramhasis.sqlite | Bin 51200 -> 0 bytes .../atramhasis_demo/development.ini_tmpl | 2 +- .../scaffolds/atramhasis_scaffold/alembic.ini | 60 ++++++++++++++++++ .../atramhasis_scaffold/atramhasis.sqlite | Bin 51200 -> 0 bytes .../atramhasis_scaffold/development.ini_tmpl | 2 +- 12 files changed, 141 insertions(+), 4 deletions(-) rename {alembic => atramhasis/alembic}/README (100%) rename {alembic => atramhasis/alembic}/env.py (81%) rename {alembic => atramhasis/alembic}/script.py.mako (100%) rename {alembic => atramhasis/alembic}/versions/3924a7ad2f8_init.py (100%) create mode 100644 atramhasis/scaffolds/atramhasis_demo/alembic.ini delete mode 100644 atramhasis/scaffolds/atramhasis_demo/atramhasis.sqlite create mode 100644 atramhasis/scaffolds/atramhasis_scaffold/alembic.ini delete mode 100644 atramhasis/scaffolds/atramhasis_scaffold/atramhasis.sqlite diff --git a/MANIFEST.in b/MANIFEST.in index 017fb9bb..a3187c93 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include *.txt *.ini *.cfg *.rst recursive-include atramhasis *.ico *.png *.css *.gif *.jpg *.pt *.txt *.jinja2 *.js *.html *.xml graft atramhasis/scaffolds +graft atramhasis/alembic diff --git a/alembic.ini b/alembic.ini index f72fea5f..2da4fe97 100644 --- a/alembic.ini +++ b/alembic.ini @@ -2,7 +2,7 @@ [alembic] # path to migration scripts -script_location = alembic +script_location = atramhasis:alembic # template used to generate migration files # file_template = %%(rev)s_%%(slug)s @@ -20,8 +20,9 @@ script_location = alembic # versions/ directory # sourceless = false -sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite +# sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite +ini_location = %(here)s/development.ini # Logging configuration [loggers] diff --git a/alembic/README b/atramhasis/alembic/README similarity index 100% rename from alembic/README rename to atramhasis/alembic/README diff --git a/alembic/env.py b/atramhasis/alembic/env.py similarity index 81% rename from alembic/env.py rename to atramhasis/alembic/env.py index a979b362..57f7182c 100644 --- a/alembic/env.py +++ b/atramhasis/alembic/env.py @@ -1,10 +1,12 @@ from __future__ import with_statement +from configparser import ConfigParser from alembic import context from sqlalchemy import engine_from_config, pool from logging.config import fileConfig from atramhasis.models import Base from skosprovider_sqlalchemy.models import Base as SkosBase from sqlalchemy.schema import MetaData +from os import path # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -25,6 +27,19 @@ # my_important_option = config.get_main_option("my_important_option") # ... etc. +def load_app_ini(ini_file): + """Load the settings for the application.ini file.""" + ini = ConfigParser() + ini.read_file(open(ini_file)) + here = path.abspath(path.dirname(ini_file)) + ini.set('app:main', 'here', here) + return ini + +app_ini = config.get_main_option('ini_location') +app_config = load_app_ini(app_ini) +sa_url = app_config.get('app:main', 'sqlalchemy.url') +config.set_main_option('sqlalchemy.url', sa_url) + def run_migrations_offline(): """Run migrations in 'offline' mode. diff --git a/alembic/script.py.mako b/atramhasis/alembic/script.py.mako similarity index 100% rename from alembic/script.py.mako rename to atramhasis/alembic/script.py.mako diff --git a/alembic/versions/3924a7ad2f8_init.py b/atramhasis/alembic/versions/3924a7ad2f8_init.py similarity index 100% rename from alembic/versions/3924a7ad2f8_init.py rename to atramhasis/alembic/versions/3924a7ad2f8_init.py diff --git a/atramhasis/scaffolds/atramhasis_demo/alembic.ini b/atramhasis/scaffolds/atramhasis_demo/alembic.ini new file mode 100644 index 00000000..2da4fe97 --- /dev/null +++ b/atramhasis/scaffolds/atramhasis_demo/alembic.ini @@ -0,0 +1,60 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = atramhasis:alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite + +ini_location = %(here)s/development.ini + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/atramhasis/scaffolds/atramhasis_demo/atramhasis.sqlite b/atramhasis/scaffolds/atramhasis_demo/atramhasis.sqlite deleted file mode 100644 index cc790461df2a8d7a600c63f18817401930c1d3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51200 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 TeBDT*mDw0$OiT|Wt1 diff --git a/atramhasis/scaffolds/atramhasis_demo/development.ini_tmpl b/atramhasis/scaffolds/atramhasis_demo/development.ini_tmpl index ec1e9512..dd0c5739 100644 --- a/atramhasis/scaffolds/atramhasis_demo/development.ini_tmpl +++ b/atramhasis/scaffolds/atramhasis_demo/development.ini_tmpl @@ -15,7 +15,7 @@ pyramid.includes = pyramid_debugtoolbar pyramid_tm -sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite +sqlalchemy.url = sqlite:///%(here)s/{{package}}.sqlite # By default, the toolbar only appears for clients from IP addresses # '127.0.0.1' and '::1'. diff --git a/atramhasis/scaffolds/atramhasis_scaffold/alembic.ini b/atramhasis/scaffolds/atramhasis_scaffold/alembic.ini new file mode 100644 index 00000000..2da4fe97 --- /dev/null +++ b/atramhasis/scaffolds/atramhasis_scaffold/alembic.ini @@ -0,0 +1,60 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = atramhasis:alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite + +ini_location = %(here)s/development.ini + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/atramhasis/scaffolds/atramhasis_scaffold/atramhasis.sqlite b/atramhasis/scaffolds/atramhasis_scaffold/atramhasis.sqlite deleted file mode 100644 index cc790461df2a8d7a600c63f18817401930c1d3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51200 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 TeBDT*mDw0$OiT|Wt1 diff --git a/atramhasis/scaffolds/atramhasis_scaffold/development.ini_tmpl b/atramhasis/scaffolds/atramhasis_scaffold/development.ini_tmpl index ec1e9512..dd0c5739 100644 --- a/atramhasis/scaffolds/atramhasis_scaffold/development.ini_tmpl +++ b/atramhasis/scaffolds/atramhasis_scaffold/development.ini_tmpl @@ -15,7 +15,7 @@ pyramid.includes = pyramid_debugtoolbar pyramid_tm -sqlalchemy.url = sqlite:///%(here)s/atramhasis.sqlite +sqlalchemy.url = sqlite:///%(here)s/{{package}}.sqlite # By default, the toolbar only appears for clients from IP addresses # '127.0.0.1' and '::1'.