Coverage for src\airtable_to_sqlite\cli\__init__.py: 100%
25 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-05 18:03 +0100
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-05 18:03 +0100
1# SPDX-FileCopyrightText: 2023-present David Kane <david@dkane.net>
2#
3# SPDX-License-Identifier: MIT
5import logging
7import click
8from sqlite_utils import Database
10from airtable_to_sqlite.__about__ import __version__
11from airtable_to_sqlite.constants import (
12 AirtablePersonalAccessToken,
13 PreferedNamingMethod,
14)
15from airtable_to_sqlite.main import AirtableBaseToSqlite, get_base_records
17logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s:%(name)s:%(message)s")
20@click.group(context_settings={"help_option_names": ["-h", "--help"]}, invoke_without_command=True)
21@click.version_option(version=__version__, prog_name="Airtable to SQlite")
22@click.option("--personal-access-token", type=AirtablePersonalAccessToken, help="Airtable Personal Access Token")
23@click.option("--prefer-ids", is_flag=True, default=False, help="Use Airtable table and field IDs instead of names")
24@click.option(
25 "--output",
26 type=click.Path(exists=False),
27 default="{}.db",
28 help="Output filename (default: '{}.db'). Use '{}' to insert base name",
29)
30@click.argument("base-ids", type=str, nargs=-1)
31def airtable_to_sqlite(personal_access_token: AirtablePersonalAccessToken, prefer_ids, output, base_ids):
32 prefer_ids = PreferedNamingMethod.ID if prefer_ids else PreferedNamingMethod.NAME
34 base_records = list(get_base_records(personal_access_token, base_ids))
36 if (len(base_ids) > 1) and ("{}" not in output):
37 msg = "Output filename must contain '{}' when converting a single base"
38 raise click.BadParameter(msg, param_hint="output")
40 for base in base_records:
41 base_name = base.id if prefer_ids == PreferedNamingMethod.ID else base.name
42 database = output.format(base_name)
43 db = Database(database, recreate=True)
44 AirtableBaseToSqlite(personal_access_token, db, base, prefer_ids).run()
45 db.close()