From c1b031f29e8ad185997660e8c2c6e2479d8f1317 Mon Sep 17 00:00:00 2001 From: Alexander Wainwright Date: Sat, 27 Dec 2025 12:06:32 +1000 Subject: [PATCH] Tidy up some formatting --- src/emulsion/config.py | 19 ++++++++++++------- src/emulsion/main.py | 38 +++++++++++++++++++++----------------- src/emulsion/resolver.py | 6 ++---- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/emulsion/config.py b/src/emulsion/config.py index 8cb8339..e9f7b25 100644 --- a/src/emulsion/config.py +++ b/src/emulsion/config.py @@ -71,8 +71,11 @@ class ConfigLoader: user_config = toml.load(self.path) self._merge(self.config, user_config) except Exception as e: - # We might want to let the caller handle this, or just print warning - print(f"Warning: Could not parse config file at {self.path}: {e}") + # We might want to let the caller handle this, or just print + # warning + print( + f'Warning: Could not parse config file at {self.path}: {e}' + ) return self.config @@ -80,11 +83,12 @@ class ConfigLoader: """ Recursively merges 'update' dict into 'base' dict. """ - # TODO: this is fine, but i do wonder if there is a way to do this with - # a set operation rather than a for-loop. perhaps not in a way that - # maintains the checks... for key, value in update.items(): - if isinstance(value, dict) and key in base and isinstance(base[key], dict): + if ( + isinstance(value, dict) + and key in base + and isinstance(base[key], dict) + ): self._merge(base[key], value) else: base[key] = value @@ -103,7 +107,8 @@ class ConfigLoader: # Ensure directory exists os.makedirs(os.path.dirname(self.path), exist_ok=True) - # We probably only want to write if it doesn't exist, to avoid clobbering. + # We probably only want to write if it doesn't exist, to avoid + # clobbering. if os.path.exists(self.path): return False diff --git a/src/emulsion/main.py b/src/emulsion/main.py index 7409d97..96115f9 100644 --- a/src/emulsion/main.py +++ b/src/emulsion/main.py @@ -55,7 +55,7 @@ def parse_args(): default=None, help=( 'Base date or date/time (e.g. 2023-04-10 or 2023-04-10 12:00:00).' - ) + ), ) parser.add_argument( @@ -69,9 +69,8 @@ def parse_args(): '--embed', action='store_true', help=( - 'Embed EXIF data directly into the image file instead of a ' - 'sidecar.' - ) + 'Embed EXIF data directly into the image file instead of a sidecar.' + ), ) parser.add_argument( @@ -90,7 +89,7 @@ def parse_args(): help=( 'Number of parallel workers to run exiftool; defaults to number ' 'of CPUs.' - ) + ), ) parser.add_argument( @@ -112,8 +111,8 @@ def prompt_for_defaults(config): """ Prompts the user for default values to populate the initial config. """ - print("Initializing configuration. Press Enter to skip any field.") - + print('Initializing configuration. Press Enter to skip any field.') + # We'll iterate over the 'mappings' to find what fields are available, # but we'll prioritize the 'core' ones for a better UX order. core_fields = ['author', 'lab', 'make', 'model', 'lens', 'film'] @@ -124,19 +123,21 @@ def prompt_for_defaults(config): for field in core_fields: if field in mappings: schema = mappings[field] - help_text = schema.get('help', field) if isinstance(schema, dict) else field - val = input(f"Default {help_text} (optional): ").strip() + help_text = ( + schema.get('help', field) if isinstance(schema, dict) else field + ) + val = input(f'Default {help_text} (optional): ').strip() if val: defaults[field] = val - + # Time increment dflt_inc = defaults.get('time_increment', 60) - val = input(f"Default Time Increment [seconds] ({dflt_inc}): ").strip() + val = input(f'Default Time Increment [seconds] ({dflt_inc}): ').strip() if val: try: defaults['time_increment'] = int(val) except ValueError: - print("Invalid number, keeping default.") + print('Invalid number, keeping default.') def main(): @@ -151,14 +152,17 @@ def main(): # Handle Initialization if args.init_config: if os.path.exists(loader.path): - print(f"Config file already exists at {loader.path}. Not overwriting.") + print( + f'Config file already exists at {loader.path}. Not ' + 'overwriting.' + ) sys.exit(0) - + # Prompt user for initial values try: prompt_for_defaults(config) except KeyboardInterrupt: - print("\nAborted.") + print('\nAborted.') sys.exit(1) if loader.save_defaults(config): @@ -201,7 +205,7 @@ def main(): else: print( f"Warning: Invalid format for --field '{item}'. " - "Expected KEY=VALUE." + 'Expected KEY=VALUE.' ) # 4. Resolve Metadata @@ -229,4 +233,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/src/emulsion/resolver.py b/src/emulsion/resolver.py index 9bc3c22..a2f14d0 100644 --- a/src/emulsion/resolver.py +++ b/src/emulsion/resolver.py @@ -31,16 +31,14 @@ class ValueResolver: resolved = self.defaults.copy() # 2. Overlay CLI Inputs - # cli_args is expected to be a dict of {key: value} provided by the user. - # This merges both --author and --field author=... + # cli_args is expected to be a dict of {key: value} provided by the + # user. This merges both --author and --field author=... for key, val in cli_args.items(): if val is not None: resolved[key] = val # 3. Identify Prompts # We look at the 'mappings' to see which fields want to be prompted. - # TODO: also here i wonder if there is a cleaner approach with a filter - # or something if interactive: fields_to_prompt = [] for field_name, schema in self.mappings.items():