88from pathlib import Path
99from typing import Any
1010
11+ from mergedeep import merge # type: ignore[import-untyped]
1112from wcmatch import glob
1213
1314from . import PoodleInputError , poodle_config , tomllib
2425default_file_copy_filters = ["__pycache__/**" ]
2526default_work_folder = Path (".poodle-temp" )
2627
27- default_mutator_opts : dict [str , Any ] = {}
28-
2928default_min_timeout = 10
3029default_timeout_multiplier = 10
3130default_runner = "command_line"
32- default_runner_opts : dict [str , Any ] = {}
3331
3432default_reporters = ["summary" , "not_found" ]
35- default_reporter_opts : dict [str , Any ] = {}
3633
3734
3835def default_max_workers () -> int :
@@ -54,6 +51,8 @@ def build_config( # noqa: PLR0913
5451 cmd_excludes : tuple [str ],
5552 cmd_only_files : tuple [str ],
5653 cmd_report : tuple [str ],
54+ cmd_html : Path | None ,
55+ cmd_json : Path | None ,
5756) -> PoodleConfig :
5857 """Build PoodleConfig object."""
5958 config_file_path = get_config_file_path (cmd_config_file )
@@ -74,8 +73,11 @@ def build_config( # noqa: PLR0913
7473 # file_filters += get_str_list_from_config("exclude", config_file_data, default=[]) # noqa: ERA001
7574 file_filters += cmd_excludes
7675
77- reporters = get_str_list_from_config ("reporters" , config_file_data , default = default_reporters )
78- reporters += [reporter for reporter in cmd_report if reporter not in reporters ]
76+ cmd_reporter_opts : dict [str , Any ] = {}
77+ if cmd_html :
78+ merge (cmd_reporter_opts , {"html" : {"report_folder" : cmd_html }})
79+ if cmd_json :
80+ merge (cmd_reporter_opts , {"json_report_file" : cmd_json })
7981
8082 return PoodleConfig (
8183 project_name = get_str_from_config ("project_name" , config_file_data , default = project_name ),
@@ -107,18 +109,34 @@ def build_config( # noqa: PLR0913
107109 command_line = get_cmd_line_echo_enabled (cmd_quiet ),
108110 ),
109111 echo_no_color = get_bool_from_config ("echo_no_color" , config_file_data ),
110- mutator_opts = get_dict_from_config ("mutator_opts" , config_file_data , default = default_mutator_opts ),
112+ mutator_opts = get_dict_from_config ("mutator_opts" , config_file_data ),
111113 skip_mutators = get_str_list_from_config ("skip_mutators" , config_file_data , default = []),
112114 add_mutators = get_any_list_from_config ("add_mutators" , config_file_data ),
113115 min_timeout = get_int_from_config ("min_timeout" , config_file_data ) or default_min_timeout ,
114116 timeout_multiplier = get_int_from_config ("timeout_multiplier" , config_file_data ) or default_timeout_multiplier ,
115117 runner = get_str_from_config ("runner" , config_file_data , default = default_runner ),
116- runner_opts = get_dict_from_config ("runner_opts" , config_file_data , default = default_runner_opts ),
117- reporters = reporters ,
118- reporter_opts = get_dict_from_config ("reporter_opts" , config_file_data , default = default_reporter_opts ),
118+ runner_opts = get_dict_from_config ("runner_opts" , config_file_data ),
119+ reporters = get_reporters ( config_file_data , cmd_report , cmd_html , cmd_json ) ,
120+ reporter_opts = get_dict_from_config ("reporter_opts" , config_file_data , command_line = cmd_reporter_opts ),
119121 )
120122
121123
124+ def get_reporters (
125+ config_file_data : dict ,
126+ cmd_report : tuple [str ],
127+ cmd_html : Path | None ,
128+ cmd_json : Path | None ,
129+ ) -> list [str ]:
130+ """Retrieve list of reporters to use."""
131+ reporters = get_str_list_from_config ("reporters" , config_file_data , default = default_reporters )
132+ reporters += [reporter for reporter in cmd_report if reporter not in reporters ]
133+ if cmd_html :
134+ reporters .append ("html" )
135+ if cmd_json :
136+ reporters .append ("json" )
137+ return reporters
138+
139+
122140def get_cmd_line_log_level (cmd_quiet : int , cmd_verbose : int ) -> int | None :
123141 """Map verbosity input to logging level."""
124142 if cmd_quiet >= 3 :
@@ -493,19 +511,19 @@ def get_dict_from_config(
493511
494512 if option_name in config_data :
495513 try :
496- option_value . update ( config_data [option_name ])
497- except ValueError :
514+ merge ( option_value , config_data [option_name ])
515+ except TypeError :
498516 msg = f"{ option_name } in config file must be a valid dict"
499517 raise PoodleInputError (msg ) from None
500518
501519 if hasattr (poodle_config , option_name ):
502520 try :
503- option_value . update ( getattr (poodle_config , option_name ))
504- except ValueError :
521+ merge ( option_value , getattr (poodle_config , option_name ))
522+ except TypeError :
505523 msg = f"poodle_config.{ option_name } must be a valid dict"
506524 raise PoodleInputError (msg ) from None
507525
508526 if command_line :
509- option_value . update ( command_line )
527+ merge ( option_value , command_line )
510528
511529 return option_value
0 commit comments