Skip to content

Commit 66550eb

Browse files
committed
minor fixes to cli: exports, args
1 parent 9b2854c commit 66550eb

3 files changed

Lines changed: 58 additions & 18 deletions

File tree

nbs/01_cli.ipynb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@
2828
"outputs": [],
2929
"source": [
3030
"#| export\n",
31-
"from schematized_config.core import ConfigValidator, load_json, extract_declared_items\n",
31+
"from schematized_config.core import (\n",
32+
" ConfigValidator,\n",
33+
" ConfigValidatorException,\n",
34+
" load_json,\n",
35+
" extract_declared_items,\n",
36+
")\n",
3237
"\n",
3338
"import os\n",
3439
"import sys\n",
@@ -45,6 +50,7 @@
4550
"metadata": {},
4651
"outputs": [],
4752
"source": [
53+
"#| export\n",
4854
"def validate_env(json_schema: Union[str, dict], dotenv_path: str=None):\n",
4955
" validator = ConfigValidator(json_schema)\n",
5056
" try:\n",
@@ -64,6 +70,7 @@
6470
"metadata": {},
6571
"outputs": [],
6672
"source": [
73+
"#| export\n",
6774
"def generate_sample_dotenv(json_schema: Union[str, dict], seed_config: dict=None):\n",
6875
" schema_dict = load_json(json_schema)\n",
6976
" merged_config = dict(os.environ)\n",
@@ -130,19 +137,16 @@
130137
"\n",
131138
"@call_parse\n",
132139
"def main(\n",
133-
" generate: str = None, # path to a json schema that validates a dotenv\n",
134-
" schema: str = None, # path to json schema used for validation\n",
135-
" validate: Union[bool, str] = None, # validate a dotenv; if a path not given, assume .env; requires <schema>\n",
140+
" generate: str = None, # path to a json schema that validates a dotenv\n",
141+
" schema: str = None, # path to json schema used for validation\n",
142+
" validate: str = 'env', # validate a dotenv; requires <schema>\n",
136143
"):\n",
137144
" \"friendly tools to work with schemas and dotenv\"\n",
138145
" \n",
139146
" if generate:\n",
140147
" sys.stdout.write(generate_sample_dotenv(generate))\n",
141148
" elif schema and validate:\n",
142-
" if validate is True:\n",
143-
" dotenv_path = '.env'\n",
144-
" else:\n",
145-
" dotenv_path = None\n",
149+
" dotenv_path = validate\n",
146150
" validate_env(schema, dotenv_path)"
147151
]
148152
},

schematized_config/_modidx.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
'\n'
88
'requirements = jsonschema>=4.17.3 python-dotenv>=1.0.0/python-schematized-config',
99
'lib_path': 'schematized_config'},
10-
'syms': { 'schematized_config.cli': {'schematized_config.cli.main': ('cli.html#main', 'schematized_config/cli.py')},
10+
'syms': { 'schematized_config.cli': { 'schematized_config.cli.generate_sample_dotenv': ( 'cli.html#generate_sample_dotenv',
11+
'schematized_config/cli.py'),
12+
'schematized_config.cli.main': ('cli.html#main', 'schematized_config/cli.py'),
13+
'schematized_config.cli.validate_env': ('cli.html#validate_env', 'schematized_config/cli.py')},
1114
'schematized_config.core': { 'schematized_config.core.ConfigValidator': ( 'core.html#configvalidator',
1215
'schematized_config/core.py'),
1316
'schematized_config.core.ConfigValidator.__init__': ( 'core.html#configvalidator.__init__',

schematized_config/cli.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/01_cli.ipynb.
22

33
# %% auto 0
4-
__all__ = ['main']
4+
__all__ = ['validate_env', 'generate_sample_dotenv', 'main']
55

66
# %% ../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+
)
813

914
import os
1015
import sys
@@ -13,20 +18,48 @@
1318
from typing import Union
1419
from fastcore.script import *
1520

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+
1652
# %% ../nbs/01_cli.ipynb 6
1753
@call_parse
1854
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>
2258
):
2359
"friendly tools to work with schemas and dotenv"
2460

2561
if generate:
2662
sys.stdout.write(generate_sample_dotenv(generate))
2763
elif schema and validate:
28-
if validate is True:
29-
dotenv_path = '.env'
30-
else:
31-
dotenv_path = None
64+
dotenv_path = validate
3265
validate_env(schema, dotenv_path)

0 commit comments

Comments
 (0)