Skip to content

fix(configfile): fix bugs, optimize parser, add support for normal an inline comments and add unit tests#198

Open
gmmcosta15 wants to merge 7 commits intodevfrom
ref/config-file
Open

fix(configfile): fix bugs, optimize parser, add support for normal an inline comments and add unit tests#198
gmmcosta15 wants to merge 7 commits intodevfrom
ref/config-file

Conversation

@gmmcosta15
Copy link
Copy Markdown
Collaborator

@gmmcosta15 gmmcosta15 commented Mar 13, 2026

Description

  • Feature
  • Bug fix
  • Code refactor
  • Documentation

This pull request introduces:
- Fix data-corruption bug in _parse_file: separator normalisation was replacing every : and = in a line instead of just the first one, silently mangling URLs, tokens, and section
names with colons
- Fix get(), getint(), getfloat(), getboolean() default-handling: missing options with no default now raise NoOptionError instead of returning Sentinel.MISSING; get() no
longer passes the fallback through the parser
- Fix add_option(value=None) writing the literal string "None" instead of a value-less option line
- Convert all logger calls to %-style, add exc_info=True and file path to save_configuration error, add exception chaining (from e) throughout
- Ignore regular and inline comments in configfile
- Enforce singleton pattern in get_configparser(): only one BlocksScreenConfig and one ConfigParser instance exists for the application lifetime, using double-checked locking; add
reset_configparser() for test isolation
- Enforce : as the sole stored separator: _RE_SEP_NORMALIZE accepts both = and : from disk and normalises to : ; all downstream code (_RE_OPTION, _find_option_line_index,
ConfigParser(delimiters=...)) restricted to : only
- Remove unused check_file_on_path import; replace with Path.exists() on module-level path constants
- Add 80 unit tests covering all of the above plus thread safety, view sharing, and factory behaviour

Motivation

The configfile module had several subtle parsing bugs and inconsistent behaviors that could corrupt configuration values (e.g., URLs, tokens, or section names) and return incorrect
results in some edge cases.

This PR stabilizes the module by fixing multiple correctness issues, tightening error handling, and improving logging. The singleton refactor ensures all consumers share one parsed state so
that update_option/save_configuration mutations are immediately visible everywhere without a reload. The separator enforcement removes misleading redundancy — = is accepted on read
but normalised before storage, so no downstream code needs to handle it.

To prevent regressions and make future changes safer, a comprehensive unit test suite (80 tests) was added, covering parsing behaviour, comment handling, deduplication, all read methods,
view sharing, add/update/save lifecycle, factory and singleton behaviour, RLock reentrancy, and thread safety.

Tests

tests/util/test_configfile_unit.py: 80 unit tests. Covers parsing, comment handling, deduplication, all read methods, get_section view sharing, add/update/save lifecycle,
get_configparser singleton factory, reset_configparser, RLock reentrancy, thread safety, and stale-view-after-reload.

… inline comments and add unit tests

loadWidget: fix bug that would result in a crash
@gmmcosta15 gmmcosta15 requested a review from HugoCLSC March 13, 2026 12:17
@gmmcosta15 gmmcosta15 self-assigned this Mar 13, 2026
@gmmcosta15 gmmcosta15 added the enhancement New feature or request. label Mar 13, 2026
@gmmcosta15 gmmcosta15 marked this pull request as ready for review March 13, 2026 12:20
Copy link
Copy Markdown
Member

@HugoCLSC HugoCLSC left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The implementation for this should follow a singleton pattern so that there is only one instance of BlocksScreenConfig and its respective ConfigParser

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants