Mercurial > kallithea
view scripts/dbmigrate-test @ 7846:d68b77e4e4ab
tg2: move routing mapper initialization from RootController class definition time to instantiation time
Things happened to work before, despite unfortunate code executation at import
time. TurboGears 2.4 changed something, so actual serving works, but pytest
fails with:
collecting ...
...
data/env/lib/python2.7/site-packages/_pytest/config/__init__.py:463: in _importconftest
raise ConftestImportFailure(conftestpath, sys.exc_info())
E ConftestImportFailure: (local('.../kallithea/tests/conftest.py'), (<type 'exceptions.KeyError'>, KeyError('paths',), <traceback object at 0x7fb6679030e0>))
or more useful, if raising the real exception instead of obfuscating with ConftestImportFailure:
...
kallithea/tests/conftest.py:15: in <module>
from kallithea.controllers.root import RootController
kallithea/controllers/root.py:29: in <module>
class RootController(RoutedController, BaseController):
kallithea/controllers/root.py:31: in RootController
mapper = make_map(config)
kallithea/config/routing.py:32: in make_map
rmap = Mapper(directory=config['paths']['controllers'],
data/env/lib/python2.7/site-packages/tg/configuration/tgconfig.py:28: in __getitem__
return self.config_proxy.current_conf()[key]
E KeyError: 'paths'
_importconftest <_pytest.config.PytestPluginManager object at 0x7f20c770a3d0> .../conftest.py
In this example, in RootController, the global config object is at this time just:
{'debug': False, 'package': None, 'i18n.lang': None, 'tg.strict_tmpl_context': True, 'tg.app_globals': None}
Solved by moving the mapper initialization to __init__.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Wed, 28 Aug 2019 12:07:37 +0200 |
parents | 3158cf0dafb7 |
children | 0a9ddb8cd8c1 |
line wrap: on
line source
#!/bin/sh -e if [ $# -lt 2 ] || [ $# -gt 3 ]; then cat >&2 <<EOD usage: $0 CONFIG_FILE FROM_REV [TO_REV] Runs a database migration from FROM_REV to TO_REV (default: current working directory parent), using the specified CONFIG_FILE (.ini file). Test is run using a clean Kallithea install, in a temporary virtual environment. FROM_REV and (optional) TO_REV should be Mercurial revision identifiers (e.g. changeset hash or a version number tag). The working directory is not touched, but the database referenced in the config file will be (re)created. Only SQLite is available out of the box; for MySQL or PostgreSQL, set the EXTRA environment variable to the required package(s), and it'll be installed in the virtual environment. (E.g. EXTRA=MySQL-python or EXTRA=psycopg2.) The temporary directory is not removed, allowing follow-up examination of the upgrade results. It is, however, created in /tmp by default, which many Linux distributions automatically clean at regular intervals. EOD exit 1 fi config_file=$(readlink -f "$1") from_rev=$2 to_rev=$3 source_repo=$(dirname "$(dirname "$(readlink -f "$0")")") announce() { echo echo "$1" echo } quiet_if_ok() ( local output local st set +e output=$("$@" < /dev/null 2>&1) st=$? if [ $st -ne 0 ]; then echo "$output" >&2 echo "Command $@ returned exit status $st." >&2 exit 1 fi ) HG() { "${HG:-hg}" --repository "$source_repo" "$@" } # If upgrading to "current revision", warn if working directory is dirty. if [ ! "$to_rev" ] && [ "$(HG status -mard)" ]; then announce "Warning: Uncommitted changes in working directory will be ignored!" fi from_rev_hash=$(HG id --id --rev "${from_rev:-.}") to_rev_hash=$(HG id --id --rev "${to_rev:-.}") temp=$(readlink -f "$(mktemp --tmpdir -d 'dbmigrate-test.XXXXXX')") cat <<EOD Config file: $config_file EOD sed -n -e 's/^sqlalchemy\.url *= */Database URL: /p' "$config_file" cat <<EOD Working dir: $temp Repository: $source_repo Upgrade from: $from_rev_hash (${from_rev:-current}) Upgrade to: $to_rev_hash (${to_rev:-current}) Extra packages: ${EXTRA:-(none)} EOD mkdir "$temp/repos" # empty # Enable caching for old pip versions (this will cache the pip upgrade) # Newer pip versions cache automatically, and don't use this variable. if [ ! "$PIP_DOWNLOAD_CACHE" ]; then export PIP_DOWNLOAD_CACHE=$HOME/.cache/pip/legacy fi install_kallithea() { local prefix=$1 local rev=$2 announce "Installing Kallithea $rev in $prefix..." "${VIRTUALENV:-virtualenv}" --quiet "$prefix-env" HG archive --rev "$rev" "$prefix" ( cd "$prefix" . "$prefix-env/bin/activate" pip install --quiet --upgrade pip setuptools mercurial $EXTRA pip install --quiet -e . ) } install_kallithea "$temp/from" "$from_rev_hash" ( cd "$temp/from" . "$temp/from-env/bin/activate" announce "Initializing database..." quiet_if_ok kallithea-cli db-create -c "$config_file" --repos="$temp/repos" --user=doe --email=doe@example.com --password=123456 --no-public-access --force-yes alembic -c "$config_file" current -v ) install_kallithea "$temp/to" "$to_rev_hash" ( cd "$temp/to" . "$temp/to-env/bin/activate" announce "Commencing database upgrade from shown Alembic revision to head..." alembic -c "$config_file" current -v alembic -c "$config_file" upgrade head announce "Upgrade complete, now at the shown Alembic revision:" alembic -c "$config_file" current -v )