Skip to content

Commit 3a065fa

Browse files
authored
Merge pull request #17 from pedrocamargo/pedro/logging
- Uses logging rather than print statements - Re-organizes validation module
2 parents cbd30d5 + dba0171 commit 3a065fa

File tree

15 files changed

+416
-366
lines changed

15 files changed

+416
-366
lines changed

gmnspy/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from .conversion import *
21
from .in_out import *
32
from .schema import *
4-
from .utils import *
5-
from .validate import *
3+
from .utils import list_to_md_table, logger

gmnspy/conversion.py

Lines changed: 0 additions & 2 deletions
This file was deleted.

gmnspy/in_out.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,10 @@
22

33
import pandas as pd
44

5+
from gmnspy.utils import logger
6+
from gmnspy.validation import update_resources_based_on_existance
7+
from gmnspy.validation import validate_foreign_keys, check_required_files, apply_schema_to_df
58
from .schema import read_config
6-
from .validate import (
7-
apply_schema_to_df,
8-
confirm_required_files,
9-
update_resources_based_on_existance,
10-
validate_foreign_keys,
11-
)
129

1310
spec_folder = join(dirname(realpath(__file__)), "spec")
1411

@@ -31,12 +28,12 @@ def read_gmns_csv(filename: str, validate: bool = True, schema_file: str = None)
3128
if validate:
3229
apply_schema_to_df(df, schema_file=schema_file, originating_file=filename)
3330
else:
34-
print("not validating {}".format(filename))
31+
logger.info(f"not validating {filename}")
3532

3633
return df
3734

3835

39-
def read_gmns_network(data_directory: str, config: str = join(spec_folder, "gmns.spec.json")) -> dict:
36+
def read_gmns_network(data_directory: str, config: str = None, raise_error=False) -> dict:
4037
"""
4138
Reads each GMNS file as specified in the config and validates it to
4239
their specified schema including foreign keys between the tables.
@@ -47,6 +44,8 @@ def read_gmns_network(data_directory: str, config: str = join(spec_folder, "gmns
4744
specifying the "name", "path", and "schema" for each GMNS table as
4845
well as a boolean value for "required". If not specified, assumes
4946
it is in a subdirectory "spec/gmns.spec.json"
47+
raise_error: Raises error if missing folder
48+
5049
Example:
5150
::
5251
{
@@ -67,14 +66,14 @@ def read_gmns_network(data_directory: str, config: str = join(spec_folder, "gmns
6766
returns: a dictionary mapping the name of each GMNS table to a
6867
validated dataframe.
6968
"""
69+
70+
config = config or join(spec_folder, "gmns.spec.json")
7071
gmns_net_d = {}
7172

72-
if config:
73-
resource_df = read_config(config, data_dir=data_directory)
74-
else:
75-
resource_df = 1
73+
resource_df = read_config(config, data_dir=data_directory) if config else 1
74+
7675
# check required files exist,
77-
confirm_required_files(resource_df)
76+
check_required_files(resource_df, raise_error)
7877

7978
# update resource dictionary based on what files are in the directory
8079
resource_df = update_resources_based_on_existance(resource_df)
@@ -85,6 +84,6 @@ def read_gmns_network(data_directory: str, config: str = join(spec_folder, "gmns
8584
gmns_net_d[row["name"]] = read_gmns_csv(row["fullpath"])
8685

8786
# validate foreign keys
88-
validate_foreign_keys(gmns_net_d, resource_df)
87+
validate_foreign_keys(gmns_net_d, resource_df, raise_error)
8988

9089
return gmns_net_d

gmnspy/schema.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import pandas as pd
66

7-
from .utils import list_to_md_table
7+
from .utils import list_to_md_table, logger
88

99
SCHEMA_TO_PANDAS_TYPES = {
1010
"integer": "int64",
@@ -73,13 +73,11 @@ def read_config(config_file: str, data_dir: str = "", schema_dir: str = "") -> p
7373
with open(config_file, "r", encoding="utf-8") as f:
7474
config = json.load(f)
7575
## todo validate config
76-
# resource_dict = {i["name"]: i for i in config["resources"]}
77-
# print(config["resources"])
7876

7977
resource_df = pd.DataFrame(config["resources"])
8078
resource_df["required"].fillna(False, inplace=True)
8179

82-
print(resource_df)
80+
logger.info(str(resource_df))
8381

8482
# Add full paths to data files
8583
if not data_dir:
@@ -90,27 +88,27 @@ def read_config(config_file: str, data_dir: str = "", schema_dir: str = "") -> p
9088
if not schema_dir:
9189
schema_dir = dirname(config_file)
9290
resource_df["fullpath_schema"] = resource_df["schema"].apply(lambda x: join(schema_dir, x))
93-
print(resource_df)
91+
logger.info(str(resource_df))
9492

9593
resource_df.set_index("name", drop=False, inplace=True)
9694
return resource_df
9795

9896

9997
def document_schema(base_path: str = None, out_path: str = None):
10098
""" """
101-
print("DOCUMENTING SCHEMA")
99+
logger.info("DOCUMENTING SCHEMA")
102100

103101
base_path = base_path or join(dirname(realpath(__file__)), "spec")
104102
out_path = out_path or join(base_path, "docs")
105-
print("Looking for specs in: {}".format(base_path))
103+
logger.info(f"Looking for specs in: {base_path}")
106104

107105
# Create markdown with a table for each schema file
108106
file_schema_markdown = ""
109107
schema_files = glob.glob(join(base_path, "**/*.schema.json"), recursive=True)
110-
print("files: {}".format(schema_files))
108+
logger.info(f"files: {schema_files}")
111109

112110
for s in schema_files:
113-
print("Documenting Schema: {}".format(s))
111+
logger.info(f"Documenting Schema: {s}")
114112
spec_name = s.split("/")[-1].split(".")[0]
115113
schema = read_schema(s)
116114
file_schema_markdown += "\n\n## {}\n".format(spec_name)

gmnspy/utils/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .set_logger import logger
2+
from .list_to_md_table import list_to_md_table

gmnspy/utils/set_logger.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import logging
2+
from os.path import join
3+
from tempfile import gettempdir
4+
5+
6+
def build_logger():
7+
logger = logging.getLogger("gmnspy")
8+
handler_name = "gmnspy"
9+
10+
if len([h for h in logger.handlers if h.name and handler_name == h.name]) > 0:
11+
return logger
12+
13+
log_path = join(gettempdir(), "gmnspy.log")
14+
FORMATTER = logging.Formatter("%(asctime)s;%(levelname)s ; %(message)s", datefmt="%H:%M:%S:")
15+
ch = logging.FileHandler(log_path)
16+
ch.setFormatter(FORMATTER)
17+
ch.set_name(handler_name)
18+
ch.setLevel(logging.INFO)
19+
logger.addHandler(ch)
20+
21+
return logger
22+
23+
24+
logger = build_logger()

0 commit comments

Comments
 (0)