from argparse import Namespace
from configparser import ConfigParser
import inspect
+import logging
import os
from pathlib import Path
import re
from .util.pyfiles import _preserving_path_as_str
+log = logging.getLogger(__name__)
+
+
class Config:
r"""Represent an Alembic configuration.
here = Path()
self.config_args["here"] = here.as_posix()
file_config = ConfigParser(self.config_args)
+
+ verbose = getattr(self.cmd_opts, "verbose", False)
if self._config_file_path:
compat.read_config_parser(file_config, [self._config_file_path])
+ if verbose:
+ log.info(
+ "Loading config from file: %s", self._config_file_path
+ )
else:
file_config.add_section(self.config_ini_section)
+ if verbose:
+ log.info(
+ "No config file provided; using in-memory default config"
+ )
return file_config
@util.memoized_property
import importlib.machinery
+import logging
import os
from pathlib import Path
import shutil
return "scratch"
+_restore_log = None
+
+
+def _replace_logger():
+ global _restore_log
+ if _restore_log is None:
+ _restore_log = (logging.root, logging.Logger.manager)
+ logging.root = logging.RootLogger(logging.WARNING)
+ logging.Logger.root = logging.root
+ logging.Logger.manager = logging.Manager(logging.root)
+
+
+def _restore_logger():
+ global _restore_log
+
+ if _restore_log is not None:
+ logging.root, logging.Logger.manager = _restore_log
+ logging.Logger.root = logging.root
+ _restore_log = None
+
+
def staging_env(create=True, template="generic", sourceless=False):
+ _replace_logger()
cfg = _testing_config()
if create:
path = _join_path(_get_staging_directory(), "scripts")
engines.testing_reaper.close_all()
shutil.rmtree(_get_staging_directory(), True)
+ _restore_logger()
def script_file_fixture(txt):
+import io
+import logging
import os
import pathlib
import sys
class ConfigTest(TestBase):
+ def test_config_logging_with_file(self):
+ buf = io.StringIO()
+ handler = logging.StreamHandler(buf)
+ handler.setLevel(logging.INFO)
+
+ logger = logging.getLogger("alembic.config")
+ # logger.x=True
+ with (
+ mock.patch.object(logger, "handlers", []),
+ mock.patch.object(logger, "level", logging.NOTSET),
+ ):
+ logger.addHandler(handler)
+ logger.setLevel(logging.INFO)
+
+ cfg = _write_config_file(
+ """
+[alembic]
+script_location = %(base_path)s/db/migrations
+"""
+ )
+ test_cfg = config.Config(
+ cfg.config_file_name, config_args=dict(base_path="/tmp")
+ )
+ test_cfg.cmd_opts = mock.Mock(verbose=True)
+
+ _ = test_cfg.file_config
+
+ output = buf.getvalue()
+ assert "Loading config from file" in output
+ assert cfg.config_file_name.replace("/", os.path.sep) in output
+
+ def tearDown(self):
+ clear_staging_env()
+
+ def test_config_logging_without_file(self):
+ buf = io.StringIO()
+ handler = logging.StreamHandler(buf)
+ handler.setLevel(logging.INFO)
+
+ logger = logging.getLogger("alembic.config")
+ with (
+ mock.patch.object(logger, "handlers", []),
+ mock.patch.object(logger, "level", logging.NOTSET),
+ ):
+
+ logger.addHandler(handler)
+ logger.setLevel(logging.INFO)
+
+ test_cfg = config.Config()
+ test_cfg.cmd_opts = mock.Mock(verbose=True)
+
+ _ = test_cfg.file_config
+
+ output = buf.getvalue()
+ assert "No config file provided" in output
+ assert (
+ test_cfg.config_file_name is None
+ and test_cfg._config_file_path is None
+ )
+
def test_config_no_file_main_option(self):
cfg = config.Config()
cfg.set_main_option("url", "postgresql://foo/bar")