Skip to content

Commit 59da1c2

Browse files
authored
Merge pull request #1185 from VisLab/add_examples
Worked on making script logging more uniform
2 parents 0ed25b8 + e32546b commit 59da1c2

File tree

7 files changed

+76
-102
lines changed

7 files changed

+76
-102
lines changed

hed/cli/cli.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,9 @@ def validate():
191191
is_flag=True,
192192
help="Disable all logging output",
193193
)
194+
@click.pass_context
194195
def validate_bids_cmd(
196+
ctx,
195197
data_path,
196198
error_limit,
197199
errors_by_file,
@@ -244,7 +246,8 @@ def validate_bids_cmd(
244246
args.append("-x")
245247
args.extend(exclude_dirs)
246248

247-
validate_bids_main(args)
249+
result = validate_bids_main(args)
250+
ctx.exit(result if result is not None else 0)
248251

249252

250253
@validate.command(
@@ -354,7 +357,9 @@ def validate_bids_cmd(
354357
is_flag=True,
355358
help="Disable all logging output",
356359
)
360+
@click.pass_context
357361
def validate_hed_string_cmd(
362+
ctx,
358363
hed_string,
359364
schema_version,
360365
definitions,
@@ -395,14 +400,16 @@ def validate_hed_string_cmd(
395400
if verbose:
396401
args.append("-v")
397402

398-
validate_string_main(args)
403+
result = validate_string_main(args)
404+
ctx.exit(result if result is not None else 0)
399405

400406

401407
@schema.command(name="validate")
402408
@click.argument("schema_path", type=click.Path(exists=True), nargs=-1, required=True)
403409
@click.option("--add-all-extensions", is_flag=True, help="Always verify all versions of the same schema are equal")
404410
@click.option("-v", "--verbose", is_flag=True, help="Enable verbose output")
405-
def schema_validate_cmd(schema_path, add_all_extensions, verbose):
411+
@click.pass_context
412+
def schema_validate_cmd(ctx, schema_path, add_all_extensions, verbose):
406413
"""Validate HED schema files.
407414
408415
This command validates HED schema files for correctness, checking structure,
@@ -434,13 +441,15 @@ def schema_validate_cmd(schema_path, add_all_extensions, verbose):
434441
if verbose:
435442
args.append("-v")
436443

437-
validate_schemas_main(args)
444+
result = validate_schemas_main(args)
445+
ctx.exit(result if result is not None else 0)
438446

439447

440448
@schema.command(name="convert")
441449
@click.argument("schema_path", type=click.Path(exists=True), nargs=-1, required=True)
442450
@click.option("--set-ids", is_flag=True, help="Set/update HED IDs in the schema")
443-
def schema_convert_cmd(schema_path, set_ids):
451+
@click.pass_context
452+
def schema_convert_cmd(ctx, schema_path, set_ids):
444453
"""Convert HED schema between formats (TSV, XML, MEDIAWIKI, JSON).
445454
446455
This command converts HED schema files between different formats while
@@ -467,14 +476,16 @@ def schema_convert_cmd(schema_path, set_ids):
467476
if set_ids:
468477
args.append("--set-ids")
469478

470-
convert_main(args)
479+
result = convert_main(args)
480+
ctx.exit(result if result is not None else 0)
471481

472482

473483
@schema.command(name="add-ids")
474484
@click.argument("repo_path", type=click.Path(exists=True))
475485
@click.argument("schema_name")
476486
@click.argument("schema_version")
477-
def schema_add_ids_cmd(repo_path, schema_name, schema_version):
487+
@click.pass_context
488+
def schema_add_ids_cmd(ctx, repo_path, schema_name, schema_version):
478489
"""Add HED IDs to a schema.
479490
480491
This command adds unique HED IDs to schema elements that don't have them,
@@ -498,7 +509,8 @@ def schema_add_ids_cmd(repo_path, schema_name, schema_version):
498509

499510
args = [repo_path, schema_name, schema_version]
500511

501-
add_ids_main(args)
512+
result = add_ids_main(args)
513+
ctx.exit(result if result is not None else 0)
502514

503515

504516
@cli.group()
@@ -613,8 +625,19 @@ def extract():
613625
is_flag=True,
614626
help="Suppress log output to stderr; only applicable when --log-file is used (logs go only to file)",
615627
)
628+
@click.pass_context
616629
def extract_bids_sidecar_cmd(
617-
data_path, suffix, value_columns, skip_columns, log_level, log_file, log_quiet, output_file, verbose, exclude_dirs
630+
ctx,
631+
data_path,
632+
suffix,
633+
value_columns,
634+
skip_columns,
635+
log_level,
636+
log_file,
637+
log_quiet,
638+
output_file,
639+
verbose,
640+
exclude_dirs,
618641
):
619642
"""Extract a sidecar template from a BIDS dataset.
620643
@@ -643,7 +666,8 @@ def extract_bids_sidecar_cmd(
643666
args.append("-x")
644667
args.extend(exclude_dirs)
645668

646-
extract_main(args)
669+
result = extract_main(args)
670+
ctx.exit(result if result is not None else 0)
647671

648672

649673
@extract.command(
@@ -781,7 +805,9 @@ def extract_bids_sidecar_cmd(
781805
is_flag=True,
782806
help="Suppress log output to stderr; only applicable when --log-file is used (logs go only to file)",
783807
)
808+
@click.pass_context
784809
def extract_tabular_summary_cmd(
810+
ctx,
785811
data_path,
786812
name_prefix,
787813
name_suffix,
@@ -834,7 +860,8 @@ def extract_tabular_summary_cmd(
834860
if verbose:
835861
args.append("-v")
836862

837-
extract_summary_main(args)
863+
result = extract_summary_main(args)
864+
ctx.exit(result if result is not None else 0)
838865

839866

840867
def main():

hed/scripts/extract_tabular_summary.py

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from hed import _version as vr
4646
from hed.tools.util.io_util import get_file_list
4747
from hed.tools.analysis.tabular_summary import TabularSummary
48+
from hed.scripts.script_utils import setup_logging
4849

4950

5051
def get_parser():
@@ -338,57 +339,6 @@ def format_output(summary, args):
338339
return json.dumps(output_dict, indent=4)
339340

340341

341-
def setup_logging(args):
342-
"""Configure logging based on command line arguments.
343-
344-
Parameters:
345-
args (argparse.Namespace): Parsed command line arguments.
346-
347-
Returns:
348-
logging.Logger: Configured logger instance.
349-
"""
350-
# Determine log level
351-
log_level = args.log_level.upper() if args.log_level else "WARNING"
352-
if args.verbose:
353-
log_level = "INFO"
354-
355-
# Configure logging format
356-
log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
357-
date_format = "%Y-%m-%d %H:%M:%S"
358-
359-
# Clear any existing handlers from root logger
360-
root_logger = logging.getLogger()
361-
for handler in root_logger.handlers[:]:
362-
root_logger.removeHandler(handler)
363-
364-
# Set the root logger level
365-
root_logger.setLevel(getattr(logging, log_level))
366-
367-
# Create formatter
368-
formatter = logging.Formatter(log_format, datefmt=date_format)
369-
370-
# File handler if log file specified
371-
if args.log_file:
372-
file_handler = logging.FileHandler(args.log_file, mode="w", encoding="utf-8")
373-
file_handler.setLevel(getattr(logging, log_level))
374-
file_handler.setFormatter(formatter)
375-
root_logger.addHandler(file_handler)
376-
377-
# Console handler (stderr) unless explicitly quieted and file logging is used
378-
if not args.log_quiet or not args.log_file:
379-
console_handler = logging.StreamHandler(sys.stderr)
380-
console_handler.setLevel(getattr(logging, log_level))
381-
console_handler.setFormatter(formatter)
382-
root_logger.addHandler(console_handler)
383-
384-
logger = logging.getLogger("extract_tabular_summary")
385-
logger.info(f"Starting tabular summary extraction with log level: {log_level}")
386-
if args.log_file:
387-
logger.info(f"Log output will be saved to: {args.log_file}")
388-
389-
return logger
390-
391-
392342
def main(arg_list=None):
393343
"""Main entry point for the script.
394344
@@ -406,7 +356,15 @@ def main(arg_list=None):
406356
args = parser.parse_args(arg_list)
407357

408358
# Setup logging
409-
logger = setup_logging(args)
359+
setup_logging(args.log_level, args.log_file, args.log_quiet, args.verbose, False)
360+
logger = logging.getLogger("extract_tabular_summary")
361+
effective_level = logging.getLevelName(logger.getEffectiveLevel())
362+
logger.info(
363+
f"Starting tabular summary extraction with effective log level: {effective_level} "
364+
f"(requested: {args.log_level}, verbose={'on' if args.verbose else 'off'})"
365+
)
366+
if args.log_file:
367+
logger.info(f"Log output will be saved to: {args.log_file}")
410368

411369
try:
412370
# Extract the summary

hed/scripts/hed_convert_schema.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ def convert_and_update(filenames, set_ids):
7272
return 0
7373

7474

75-
def main():
75+
def main(arg_list=None):
7676
parser = argparse.ArgumentParser(description="Update other schema formats based on the changed one.")
7777
parser.add_argument("filenames", nargs="*", help="List of files to process")
7878
parser.add_argument("--set-ids", action="store_true", help="Add missing HED ids")
7979

80-
args = parser.parse_args()
80+
args = parser.parse_args(arg_list)
8181

8282
filenames = args.filenames
8383
set_ids = args.set_ids

hed/scripts/hed_extract_bids_sidecar.py

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import sys
3636
from hed import _version as vr
3737
from hed.tools import BidsDataset
38+
from hed.scripts.script_utils import setup_logging
3839

3940

4041
def get_parser():
@@ -219,41 +220,14 @@ def main(arg_list=None):
219220
args = parser.parse_args(arg_list)
220221

221222
# Setup logging configuration
222-
log_level = args.log_level.upper() if args.log_level else "WARNING"
223-
if args.verbose:
224-
log_level = "INFO"
225-
226-
# Configure logging format
227-
log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
228-
date_format = "%Y-%m-%d %H:%M:%S"
229-
230-
# Clear any existing handlers from root logger
231-
root_logger = logging.getLogger()
232-
for handler in root_logger.handlers[:]:
233-
root_logger.removeHandler(handler)
234-
235-
# Set the root logger level - this is crucial for filtering
236-
root_logger.setLevel(getattr(logging, log_level))
237-
238-
# Create and configure handlers
239-
formatter = logging.Formatter(log_format, datefmt=date_format)
240-
241-
# File handler if log file specified
242-
if args.log_file:
243-
file_handler = logging.FileHandler(args.log_file, mode="w", encoding="utf-8")
244-
file_handler.setLevel(getattr(logging, log_level))
245-
file_handler.setFormatter(formatter)
246-
root_logger.addHandler(file_handler)
247-
248-
# Console handler (stderr) unless explicitly quieted and file logging is used
249-
if not args.log_quiet or not args.log_file:
250-
console_handler = logging.StreamHandler(sys.stderr)
251-
console_handler.setLevel(getattr(logging, log_level))
252-
console_handler.setFormatter(formatter)
253-
root_logger.addHandler(console_handler)
223+
setup_logging(args.log_level, args.log_file, args.log_quiet, args.verbose, False)
254224

255225
logger = logging.getLogger("extract_bids_sidecar")
256-
logger.info(f"Starting BIDS sidecar extraction with log level: {log_level}")
226+
effective_level = logging.getLevelName(logger.getEffectiveLevel())
227+
logger.info(
228+
f"Starting BIDS sidecar extraction with effective log level: {effective_level} "
229+
f"(requested: {args.log_level}, verbose={'on' if args.verbose else 'off'})"
230+
)
257231
if args.log_file:
258232
logger.info(f"Log output will be saved to: {args.log_file}")
259233

hed/scripts/validate_bids.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,19 @@ def main(arg_list=None):
201201

202202
# Parse the arguments
203203
args = parser.parse_args(arg_list)
204-
print(f"{str(args)}")
205204

206205
# Set up logging
207206
setup_logging(args.log_level, args.log_file, args.log_quiet, args.verbose, args.no_log)
208207

209208
logger = logging.getLogger("validate_bids")
210-
logger.info(f"Starting BIDS validation with log level: {args.log_level}")
209+
logger.debug("Parsed arguments: %s", args)
210+
effective_level_name = logging.getLevelName(logger.getEffectiveLevel())
211+
logger.info(
212+
"Starting BIDS validation with effective log level: %s (requested: %s, verbose=%s)",
213+
effective_level_name,
214+
args.log_level,
215+
"on" if args.verbose else "off",
216+
)
211217
if args.log_file:
212218
logger.info(f"Log output will be saved to: {args.log_file}")
213219

hed/scripts/validate_hed_string.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ def main(arg_list=None):
9898

9999
import logging
100100

101+
logger = logging.getLogger("validate_hed_string")
102+
effective_level_name = logging.getLevelName(logger.getEffectiveLevel())
103+
logger.info(
104+
"Starting HED string validation with effective log level: %s (requested: %s, verbose=%s)",
105+
effective_level_name,
106+
args.log_level,
107+
"on" if args.verbose else "off",
108+
)
109+
101110
try:
102111
# Load schema (handle single version or list of versions)
103112
schema_versions = args.schema_version[0] if len(args.schema_version) == 1 else args.schema_version

hed/scripts/validate_schemas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ def get_parser():
1919
return parser
2020

2121

22-
def main():
22+
def main(arg_list=None):
2323
parser = get_parser()
24-
args = parser.parse_args()
24+
args = parser.parse_args(arg_list)
2525

2626
schema_files = sort_base_schemas(args.schema_files, args.add_all_extensions)
2727
issues = validate_all_schemas(schema_files)

0 commit comments

Comments
 (0)