Source code for testsuite.databases.mysql.discover
import collections
import pathlib
from typing import Any
from typing import DefaultDict
from typing import Dict
from typing import List
from typing import Optional
from . import classes
from . import utils
[docs]def find_schemas(
schema_dirs: List[pathlib.Path],
dbprefix: str = 'testsuite-',
extra_schema_args: Optional[Dict[str, Any]] = None,
) -> Dict[str, classes.DatabaseConfig]:
"""Retrieve database schemas from filesystem.
:param schema_dirs: list of schema pathes
:param dbprefix: database name internal prefix
:param extra_schema_args: for each DB contains list
of tables we don't have to truncate and flag for explicit creation
example:
.. code-block:: python
{
'database1': {
'create': False,
'truncate_non_empty': True,
'keep_tables': [
'table1', 'table2'
]
}
}
:returns: Dictionary where key is dbname and value is
``classes.DatabaseConfig`` instance.
"""
result = {}
for path in schema_dirs:
if not path.is_dir():
continue
for dbname, migrations in _scan_path(path).items():
full_db_name: str = dbprefix + dbname
if extra_schema_args:
kwargs: Dict = extra_schema_args.get(full_db_name, {})
else:
kwargs = {}
result[dbname] = classes.DatabaseConfig(
dbname=full_db_name,
migrations=migrations,
**kwargs,
)
return result
def _scan_path(
schema_path: pathlib.Path,
) -> DefaultDict[str, List[pathlib.Path]]:
result = collections.defaultdict(list)
for entry in schema_path.iterdir():
if entry.suffix == '.sql' and entry.is_file():
result[entry.stem].append(entry)
elif entry.is_dir():
result[entry.stem].extend(utils.scan_sql_directory(entry))
return result