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

1# SPDX-FileCopyrightText: 2023-present David Kane <david@dkane.net> 

2# 

3# SPDX-License-Identifier: MIT 

4 

5import logging 

6 

7import click 

8from sqlite_utils import Database 

9 

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 

16 

17logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s:%(name)s:%(message)s") 

18 

19 

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 

33 

34 base_records = list(get_base_records(personal_access_token, base_ids)) 

35 

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") 

39 

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()