|
1 | 1 | # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/01_cli.ipynb. |
2 | 2 |
|
3 | 3 | # %% auto 0 |
4 | | -__all__ = ['main'] |
| 4 | +__all__ = ['validate_env', 'generate_sample_dotenv', 'main'] |
5 | 5 |
|
6 | 6 | # %% ../nbs/01_cli.ipynb 2 |
7 | | -from .core import ConfigValidator, load_json, extract_declared_items |
| 7 | +from schematized_config.core import ( |
| 8 | + ConfigValidator, |
| 9 | + ConfigValidatorException, |
| 10 | + load_json, |
| 11 | + extract_declared_items, |
| 12 | +) |
8 | 13 |
|
9 | 14 | import os |
10 | 15 | import sys |
|
13 | 18 | from typing import Union |
14 | 19 | from fastcore.script import * |
15 | 20 |
|
| 21 | +# %% ../nbs/01_cli.ipynb 3 |
| 22 | +def validate_env(json_schema: Union[str, dict], dotenv_path: str=None): |
| 23 | + validator = ConfigValidator(json_schema) |
| 24 | + try: |
| 25 | + validator.load_config(dotenv.dotenv_values(dotenv_path)) |
| 26 | + return True |
| 27 | + except ConfigValidatorException as ex: |
| 28 | + sys.stderr.write(f'{str(ex)}\n') |
| 29 | + for error in ex.errors: |
| 30 | + sys.stderr.write(f'{error.json_path}:\t{error.message}\n') |
| 31 | + return False |
| 32 | + |
| 33 | +# %% ../nbs/01_cli.ipynb 4 |
| 34 | +def generate_sample_dotenv(json_schema: Union[str, dict], seed_config: dict=None): |
| 35 | + schema_dict = load_json(json_schema) |
| 36 | + merged_config = dict(os.environ) |
| 37 | + default_dotenv = dotenv.dotenv_values() |
| 38 | + merged_config.update(default_dotenv) |
| 39 | + merged_config.update(seed_config or {}) |
| 40 | + extracted_config = extract_declared_items(schema_dict, merged_config) |
| 41 | + out = [ |
| 42 | + f'{key}={value}' |
| 43 | + for key, value in extracted_config.items() |
| 44 | + ] |
| 45 | + # for all keys that are in the schema, but NOT in the current config, |
| 46 | + # add them as comments |
| 47 | + for (key, value_schema) in schema_dict['properties'].items(): |
| 48 | + if key not in extracted_config: |
| 49 | + out.append(f'# {key}=<{value_schema.get("type")}>') |
| 50 | + return '\n'.join(out) |
| 51 | + |
16 | 52 | # %% ../nbs/01_cli.ipynb 6 |
17 | 53 | @call_parse |
18 | 54 | def main( |
19 | | - generate: str = None, # path to a json schema that validates a dotenv |
20 | | - schema: str = None, # path to json schema used for validation |
21 | | - validate: Union[bool, str] = None, # validate a dotenv; if a path not given, assume .env; requires <schema> |
| 55 | + generate: str = None, # path to a json schema that validates a dotenv |
| 56 | + schema: str = None, # path to json schema used for validation |
| 57 | + validate: str = 'env', # validate a dotenv; requires <schema> |
22 | 58 | ): |
23 | 59 | "friendly tools to work with schemas and dotenv" |
24 | 60 |
|
25 | 61 | if generate: |
26 | 62 | sys.stdout.write(generate_sample_dotenv(generate)) |
27 | 63 | elif schema and validate: |
28 | | - if validate is True: |
29 | | - dotenv_path = '.env' |
30 | | - else: |
31 | | - dotenv_path = None |
| 64 | + dotenv_path = validate |
32 | 65 | validate_env(schema, dotenv_path) |
0 commit comments