From 5e0fbdbf7068a1269009276fdbf53f978900cfa7 Mon Sep 17 00:00:00 2001 From: dat972 Date: Tue, 18 Aug 2026 13:53:28 -0500 Subject: [PATCH] updated the config files to a tempalte/local standard format --- .gitignore | 7 ++++++ README.md | 7 +++--- __pycache__/fccs_check.cpython-313.pyc | Bin 4501 -> 0 bytes __pycache__/fccs_config.cpython-313.pyc | Bin 15182 -> 0 bytes __pycache__/fccs_config.cpython-314.pyc | Bin 8025 -> 0 bytes __pycache__/fccs_reorganize.cpython-313.pyc | Bin 9235 -> 0 bytes __pycache__/fccs_report.cpython-313.pyc | Bin 10918 -> 0 bytes __pycache__/fccs_scan.cpython-313.pyc | Bin 6081 -> 0 bytes __pycache__/fccs_verify.cpython-313.pyc | Bin 4980 -> 0 bytes config.ini => config.template.ini | 9 ++++++++ fccs_config.py | 23 +++++++++++++++++++- 11 files changed, 42 insertions(+), 4 deletions(-) delete mode 100644 __pycache__/fccs_check.cpython-313.pyc delete mode 100644 __pycache__/fccs_config.cpython-313.pyc delete mode 100644 __pycache__/fccs_config.cpython-314.pyc delete mode 100644 __pycache__/fccs_reorganize.cpython-313.pyc delete mode 100644 __pycache__/fccs_report.cpython-313.pyc delete mode 100644 __pycache__/fccs_scan.cpython-313.pyc delete mode 100644 __pycache__/fccs_verify.cpython-313.pyc rename config.ini => config.template.ini (69%) diff --git a/.gitignore b/.gitignore index 6f49e84..a023691 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ references/ + +# Per-machine working config (created from config.template.ini on first run) +config.ini + +# Python bytecode cache +__pycache__/ +*.pyc diff --git a/README.md b/README.md index 4f681ca..6aa15d3 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,8 @@ Extracts and organizes documents from FileCabinet CS (Thomson Reuters) using GUI | File | Purpose | |------|---------| -| `config.ini` | All paths, timeouts, and FCCS control identifiers | +| `config.template.ini` | Tracked template for all paths, timeouts, and FCCS control identifiers | +| `config.ini` | Per-machine working config (git-ignored; auto-created from the template) | | `fccs_folders.txt` | FCCS folder templates (manually populated per engagement) | | `fccs_config.py` | Shared config loading, logging, folder pattern building | | `fccs_scan.py` | Step 1: Scan backup directory for drawer IDs | @@ -26,7 +27,7 @@ Extracts and organizes documents from FileCabinet CS (Thomson Reuters) using GUI ## Setup Per Engagement -1. Edit `config.ini` -- point `backup_dir`, `export_dir`, and `output_dir` at the client's directories. +1. Edit `config.ini` -- point `backup_dir`, `export_dir`, and `output_dir` at the client's directories. This file is created automatically from `config.template.ini` the first time you run any script (it's git-ignored, so your machine-specific paths never drift the repo). To reset a machine, delete `config.ini` and re-run. Keep shared/default changes in `config.template.ini` (the tracked file). 2. Populate `fccs_folders.txt` -- open FCCS > System Configuration > Document Folders and list each folder template exactly as shown, one per line. Keep the `YYYY` prefix on recurring folders. UltraTax CS folders are detected automatically and do not need to be listed. ## Workflow @@ -134,7 +135,7 @@ Any outstanding drawer that also appears in `crashed.txt` (its export was aborte ## Config Reference -All scripts read from `config.ini` (or specify `--config path\to\config.ini`). +All scripts read from `config.ini` (or specify `--config path\to\config.ini`). `config.ini` is the git-ignored, per-machine copy auto-created from the tracked `config.template.ini`; edit `config.ini` locally. - **`[paths]`** -- backup_dir, export_dir, output_dir, drawer_id_file, completed_file, ignore_file, crashed_file, log_file, verify_report, report_html, screenshot_dir, manifest_dir, folder_list - **`[timeouts]`** -- nav_timeout, dialog_timeout, progress_appear, progress_finish, settle, confirm_timeout diff --git a/__pycache__/fccs_check.cpython-313.pyc b/__pycache__/fccs_check.cpython-313.pyc deleted file mode 100644 index 0799fbc1e2b28bbeedfa1fc235c3acb5e1a70dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4501 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 diff --git a/__pycache__/fccs_config.cpython-314.pyc b/__pycache__/fccs_config.cpython-314.pyc deleted file mode 100644 index 0d720ff5fbbac01ed5e81d5f8756dbe582ce7cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8025 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 diff --git a/__pycache__/fccs_reorganize.cpython-313.pyc b/__pycache__/fccs_reorganize.cpython-313.pyc deleted file mode 100644 index ec4b55aeac18cffb064dc451bf02f801b31bd9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9235 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 JH@N8h{|#V!*^2-G diff --git a/__pycache__/fccs_report.cpython-313.pyc b/__pycache__/fccs_report.cpython-313.pyc deleted file mode 100644 index 77e4cc089d835c6cb51e3406160f7de6287790fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10918 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 diff --git a/__pycache__/fccs_scan.cpython-313.pyc b/__pycache__/fccs_scan.cpython-313.pyc deleted file mode 100644 index 69beba472bc9fc912654691703a232b583774952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6081 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 diff --git a/__pycache__/fccs_verify.cpython-313.pyc b/__pycache__/fccs_verify.cpython-313.pyc deleted file mode 100644 index b1e1494ad5634177431bce0df3928f501e8e66ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4980 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 diff --git a/config.ini b/config.template.ini similarity index 69% rename from config.ini rename to config.template.ini index 6adb962..895f398 100644 --- a/config.ini +++ b/config.template.ini @@ -1,3 +1,12 @@ +# --------------------------------------------------------------------------- +# TEMPLATE CONFIG — tracked in git. Do NOT edit for a specific machine. +# +# On first run the scripts copy this file to `config.ini` (which is git-ignored) +# and use that. Edit `config.ini` for this machine's paths/settings so your +# local changes never drift the repo. To reset a machine, delete `config.ini` +# and re-run; it will be recreated from this template. +# --------------------------------------------------------------------------- + [paths] # Point these at the current engagement's directories backup_dir = C:\Migration\Backups diff --git a/fccs_config.py b/fccs_config.py index bbfbcc4..657bea9 100644 --- a/fccs_config.py +++ b/fccs_config.py @@ -5,11 +5,13 @@ Shared configuration, logging, and utilities for the FCCS extraction tool. import os import re import sys +import shutil import argparse import configparser from datetime import datetime DEFAULT_CONFIG = "config.ini" +TEMPLATE_CONFIG = "config.template.ini" def parse_args(): @@ -24,12 +26,31 @@ def parse_args(): def load_config(path=None): - """Read config.ini and return a ConfigParser object.""" + """Read the config file and return a ConfigParser object. + + Config is split into two files: + - config.template.ini : tracked in git, the pristine template. + - config.ini : git-ignored, this machine's working copy. + + When no explicit --config path is given, the per-machine config.ini is used. + If it doesn't exist yet, it's created from config.template.ini so a freshly + cloned/pulled repo works out of the box without editing the tracked file. + Edit config.ini locally; your changes never drift the repo. + """ if path is None: script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) path = os.path.join(script_dir, DEFAULT_CONFIG) + # Auto-create the per-machine config from the template on first run. + if not os.path.exists(path): + template = os.path.join(script_dir, TEMPLATE_CONFIG) + if os.path.exists(template): + shutil.copyfile(template, path) + print(f"Created {DEFAULT_CONFIG} from {TEMPLATE_CONFIG}. " + f"Edit it for this machine's settings: {path}") if not os.path.exists(path): print(f"ERROR: config file not found: {path}") + print(f" Expected {DEFAULT_CONFIG} or a --config path " + f"(template: {TEMPLATE_CONFIG}).") sys.exit(1) cfg = configparser.ConfigParser() cfg.read(path, encoding="utf-8")