dictIO

All notable changes to the dictIO project will be documented in this file.
The changelog format is based on Keep a Changelog.

Unreleased

-/-

0.4.0 - 2024-11-11

Breaking changes

  • Renamed modules: Following modules have been renamed in order to comply with PEP8 naming conventions:
    dictIO.dictReader -> dictIO.dict_reader
    dictIO.dictWriter -> dictIO.dict_writer
    dictIO.dictParser -> dictIO.dict_parser
    dictIO.cppDict -> dictIO.cpp_dict

  • Module formatter.py :
    Renamed Formatter.format_type() -> Formatter.format_value()

  • Module parser.py :
    Renamed Parser.parse_type() -> Parser.parse_value()
    Renamed Parser.parse_types() -> Parser.parse_values()

  • class CppDict in module dictIO.cppDict has been replaced with the new class SDict[K, V] in module dictIO.dict.
    In order to maintain backward compatibility, a thin wrapper class named CppDict is kept in version ~0.4.0. It is marked as deprecated, though, and will be removed with release 0.5.0.

  • Where CppDict inherited from UserDict, SDict inherits directly from Python’s dict class, allowing to use it in any context where a dict or any other MutableMapping is expected.

  • SDict is generic: Static type checkers will hence require type arguments when SDict is used.
    Where in dictIO < 0.4.0 you could write
    my_dict: CppDict = CppDict(),
    you will now need to specify the type arguments, e.g.
    my_dict: SDict[str, Any] = SDict().
    With this change, type hinting is in line with how Python’s builtin dict class works, and offers more control in static type checking.

Changed

  • Changed from pip/tox to uv as package manager

  • README.md : Completely rewrote section “Development Setup”, introducing uv as package manager.

  • Changed publishing workflow to use OpenID Connect (Trusted Publisher Management) when publishing to PyPI

  • Updated copyright statement

  • VS Code settings: Turned off automatic venv activation

  • Replaced black formatter with ruff formatter

Solved

  • Sphinx documentation: Resolved issue that documentation of class members was generated twice.

Added

  • Sphinx documentation: Added extension to support Markdown-based diagrams created with Mermaid.

  • Added instance methods dump() and load() to SDict

  • Added mypy as static type checker (in addition to pyright)

GitHub workflows

  • (all workflows): Adapted to use uv as package manager

  • _test_future.yml : updated Python version to 3.13.0-alpha - 3.13.0

  • _test_future.yml : updated name of test job to ‘test313’

Dependencies

  • Updated to ruff>=0.6.3 (from ruff==0.4.2)

  • Updated to pyright>=1.1.378 (from pyright==1.1.360)

  • Updated to sourcery>=1.22 (from sourcery==1.16)

  • Updated to pytest>=8.3 (from pytest>=8.2)

  • Updated to Sphinx>=8.0 (from Sphinx>=7.3)

  • Updated to sphinx-argparse-cli>=1.17 (from sphinx-argparse-cli>=1.16)

  • Updated to myst-parser>=4.0 (from myst-parser>=3.0)

  • Updated to furo>=2024.8 (from furo>=2024.5)

  • updated to setup-python@v5 (from setup-python@v4)

  • updated to actions-gh-pages@v4 (from actions-gh-pages@v3)

  • updated to upload-artifact@v4 (from upload-artifact@v3)

  • Updated to download-artifact@v4 (from download-artifact@v3)

  • updated to checkout@v4 (from checkout@v3)

0.3.4 - 2024-05-22

Dependencies

  • updated to ruff==0.4.2 (from ruff==0.2.1)

  • updated to pyright==1.1.360 (from pyright==1.1.350)

  • updated to sourcery==1.16 (from sourcery==1.15)

  • updated to lxml>=5.2 (from lxml>=5.1)

  • updated to types-lxml>=2024.4 (from types-lxml>=5.1)

  • updated to pytest>=8.2 (from pytest>=7.4)

  • updated to pytest-cov>=5.0 (from pytest-cov>=4.1)

  • updated to Sphinx>=7.3 (from Sphinx>=7.2)

  • updated to sphinx-argparse-cli>=1.15 (from sphinx-argparse-cli>=1.11)

  • updated to myst-parser>=3.0 (from myst-parser>=2.0)

  • updated to furo>=2024.4 (from furo>=2023.9.10)

  • updated to numpy>=1.26,<2.0 (from numpy>=1.26)

  • removed black

Changed

  • replaced black formatter with ruff formatter

  • Changed publishing workflow to use OpenID Connect (Trusted Publisher Management) when publishing to PyPI

  • Updated copyright statement

  • VS Code settings: Turned off automatic venv activation

0.3.3 - 2024-02-21

Hotfix

  • corrected name of cli script (wrong: dictIO correct: dictParser)

0.3.2 - 2024-02-21

Added

  • README.md : Under Development Setup, added a step to install current package in “editable” mode, using the pip install -e option. This removes the need to manually add /src to the PythonPath environment variable in order for debugging and tests to work.

Removed

  • VS Code settings: Removed the setting which added the /src folder to PythonPath. This is no longer necessary. Installing the project itself as a package in “editable” mode, using the pip install -e option, solves the issue and removes the need to manually add /src to the PythonPath environment variable.

Changed

  • Moved all project configuration from setup.cfg to pyproject.toml

  • Moved all tox configuration from setup.cfg to tox.ini.

  • Moved pytest configuration from pyproject.toml to pytest.ini

  • Deleted setup.cfg

Dependencies

  • updated to black[jupyter]==24.1 (from black[jupyter]==23.12)

  • updated to version: ‘==24.1’ (from version: ‘==23.12’)

  • updated to ruff==0.2.1 (from ruff==0.1.8)

  • updated to pyright==1.1.350 (from pyright==1.1.338)

  • updated to sourcery==1.15 (from sourcery==1.14)

  • updated to lxml>=5.1 (from lxml>=4.9)

0.3.1 - 2024-01-09

Solved

  • Solved a bug that led to single character references not being identified (solves #14).

0.3.0 - 2024-01-08

Changed

  • Enabled recognition of strings with nested quotes in it (solves #2)

  • GitHub workflows: Included Python 3.12 release version as standard, and Python 3.13.0a2 as “future” test.

Dependencies

  • updated to black[jupyter]==23.12 (from black[jupyter]==23.11)

  • updated to ruff==0.1.8 (from ruff==0.1.6)

  • updated to pyright==1.1.338 (from pyright==1.1.336)

0.2.9 - 2023-09-20

Dependencies

  • Updated dependencies to latest versions

0.2.8 - 2023-06-22

Changed

  • Modularized GitHub workflows

  • Changed default Python version in GitHub workflows from 3.10 to 3.11

Dependencies

  • requirements-dev.txt: Updated dependencies to latest versions

0.2.7 - 2023-05-04

Changed

  • dependencies: updated dependencies to latest versions

  • ruff: added rule-set “B” (flake8-bugbear)

0.2.6 - 2023-01-11

Changed

  • Added missing DocStrings for public classes, methods and functions

  • Changed links to package documentation to open README.html, not the default index page

0.2.5 - 2023-01-04

Changed

  • Linter: Migrated from flake8 to ruff.
    (Added ruff; removed flake8 and isort)

  • Adjusted GitHub CI workflow accordingly.
    (Added ruff job; removed flake8 and isort jobs)

  • VS Code settings: Adjusted Pylance configuration

  • Sphinx documentation: Rebuilt API documentation

Added

  • Added a batch file ‘qa.bat’ in root folder to ease local execution of code quality checks

0.2.4 - 2022-12-12

Changed

  • Moved dev-only dependencies from requirements.txt to requirements-dev.txt

  • dictIO/__utils__.py : ensured that imported symbols get also exported
    (added “as” clause -> “from x import y as y” instead of only “from x import y”)

  • Configured code quality tools flake8, black, isort, pyright

  • Improved code quality, resolving all warnings and errors flagged by the configured code quality tools (flake8, black, isort, pyright, sourcery)

Added

  • Added support for selected numpy functions (diag, eye, ones, zeros) which can now be used in expressions.
    This is an experimental feature which might be removed or changed in future.

  • Added GitHub workflow ‘main.yml’ for continuous integration (runs all CI tasks except Sphinx)

    • format checks: black, isort

    • lint check: flake8, flake8-bugbear

    • type check: pyright

    • test: uses tox to run pytest on {Windows, Linux, MacOS} with {py39, py310}

    • publish: publishing to PyPI (runs only on push of new tag vx.x.x, and after all other jobs succeeded)

    • merge_to_release_branch: merge tagged commit to release branch (runs after publish)

0.2.3 - 2022-12-01

Changed

  • Code formatting: Changed from yapf to black

  • STYLEGUIDE.md : Adjusted to match black formatting

  • VS Code settings: Updated to use black as formatter

  • requirements.txt: Updated dependencies to their most recent versions

  • GitHub actions (yml files): Updated following actions to their most recent versions:

    • checkout@v1 -> checkout@v3

    • setup-python@v2 -> setup-python@v4

    • cache@v2 -> cache@v3

Added

  • Added sourcery configuration (.sourcery.yaml)

  • Added py.typed file into the package root folder and included it setup.cfg as package_data

  • Documentation: Included sub-package dictIO.utils in documentation

0.2.2 - 2022-11-08

Added

  • JsonParser: JsonParser now supports the usage of references and expressions, similar to the CppParser.

0.2.1 - 2022-10-13

Solved

  • XmlParser: Solved a bug where default namespaces in an XML file would not be parsed correctly.

0.2.0 - 2022-09-29

Added

  • dictIO.utils.path.py: Added two new functions

    • highest_common_root_folder(paths)

    • relative_path(from_path, to_path)

Changed

  • Replaced usages of pathlib.Path.resolve_to() with dictIO.utils.path.relative_path()

Removed

  • dictIO.utils.path.py: Removed obsolete function silent_remove()

0.1.2 - 2022-09-27

Solved

  • XmlParser: Changed how empty XML nodes get parsed.
    The value for an empty node is now saved as an empty dict, i.e. {}, instead of None. This change solves issue #4.
    Problem was that None is not iterable, and code such as the following had caused an exception:

    if '_attributes' in my_parsed_xml_dict[node_key]:
        ...
    

    because my_parsed_xml_dict[node_key] had been None.

    Now, with the code change in place, my_parsed_xml_dict[node_key] would resolve to an empty dict ( {} ) instead of to None. As a dict is formally iterable (even when empty), querying code as above does no longer crash.

0.1.1 - 2022-08-19

Added

  • cppDict:

    • Added method include(dict_to_include). This method adds an include directive for the passed in dict inside the dict the method is called on.

0.1.0 - 2022-05-28

Changed

  • Simplified imports from namespace dictIO. Example:

    • Old (<= v0.0.22):

      from dictIO.dictParser import DictParser
      
    • New:

      from dictIO import DictParser
      
  • parser.py

    • Parser.remove_quotes_from_string()

      • Changed default of ‘all’ argument from True to False
        This change was introduced in order to, by default, protect inner quotes in i.e. a farn filter expression “var in [‘item1’, ‘item2’]” from being removed.

    • CppParser._parse_tokenized_dict()

      • Changed implementation of the conditional code where a key value pair gets parsed.
        This change was introduced in order to better identify invalid key value pairs.
        Two invalid keys were added in test_parser_dict (section ‘invalid’) and a respective test was added.

  • formatter.py

    • JsonFormatter.insert_includes()

      • Changed correction of backslashes, so that backslashes in include paths are not substituted by forwardslashes but actually escaped in Json compliant way.

  • dictWriter.py

    • DictWriter.write()

      • Changed default of ‘mode’ argument from ‘w’ (overwrite) to ‘a’ (append)

  • utils\strings.py

    • plural() function moved to farn package (-> moved into utils\logging.py module in farn)
      It was moved since the plural() function is currently used in farn logging only (neither in dictIO nor in ospx).

0.0.22 - 2022-05-09

  • First public release

0.0.17 - 2022-02-14

Added

  • Added support for Python 3.10