diff --git a/CHANGELOG.rst b/CHANGELOG.rst index fe910edc..79e92928 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,11 @@ Changelog ========= +Snapshot +-------- + +* Added support for extended interpolation for .ini files. + 1.2.7 (2022-04-04) ------------------ diff --git a/docs/usage.rst b/docs/usage.rst index 78d350e0..e982c6cd 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -52,6 +52,29 @@ Or, with multiple root packages: .. _the Grimp build_graph documentation: https://grimp.readthedocs.io/en/latest/usage.html#grimp.build_graph +**Interpolations** + +When using `.ini` file, extended interpolation may be used, which may be helpful when +groups of modules need to be referenced in multiple places. + +.. code-block:: ini + + [importlinter:contract:1] + name = Ports should not depend on adapters. + type = forbidden + source_modules = ${ports:all} + forbidden_modules = ${adapters:all} + + [ports] + all = + mypackage.inbound + yourpackage.outbound + + [adapters] + all = + mypackage.adapters + yourpackage.adapters + Contracts --------- diff --git a/src/importlinter/adapters/user_options.py b/src/importlinter/adapters/user_options.py index fe809152..ec5608c1 100644 --- a/src/importlinter/adapters/user_options.py +++ b/src/importlinter/adapters/user_options.py @@ -51,7 +51,9 @@ class IniFileUserOptionReader(AbstractUserOptionReader): section_name = "importlinter" def _read_config_filename(self, config_filename: str) -> Optional[UserOptions]: - config = configparser.ConfigParser() + config = configparser.ConfigParser( + interpolation=configparser.ExtendedInterpolation(), + ) file_contents = settings.FILE_SYSTEM.read(config_filename) config.read_string(file_contents) if self.section_name in config.sections(): diff --git a/tests/assets/testpackage/.interpolationcontract.ini b/tests/assets/testpackage/.interpolationcontract.ini new file mode 100644 index 00000000..ec6c3194 --- /dev/null +++ b/tests/assets/testpackage/.interpolationcontract.ini @@ -0,0 +1,15 @@ +[importlinter] +root_package = testpackage +include_external_packages = True + +[importlinter:contract:one] +name=Expected kept contract +type=forbidden +source_modules= + ${section_to_interpolate:source} +forbidden_modules= + sqlalchemy + +[section_to_interpolate] +source= + testpackage.high.green diff --git a/tests/functional/test_lint_imports.py b/tests/functional/test_lint_imports.py index 8e7bc372..5bd9280f 100644 --- a/tests/functional/test_lint_imports.py +++ b/tests/functional/test_lint_imports.py @@ -18,6 +18,7 @@ ( (testpackage_directory, None, cli.EXIT_STATUS_SUCCESS), (testpackage_directory, ".brokencontract.ini", cli.EXIT_STATUS_ERROR), + (testpackage_directory, ".interpolationcontract.ini", cli.EXIT_STATUS_SUCCESS), (testpackage_directory, ".malformedcontract.ini", cli.EXIT_STATUS_ERROR), (testpackage_directory, ".customkeptcontract.ini", cli.EXIT_STATUS_SUCCESS), (testpackage_directory, ".externalbrokencontract.ini", cli.EXIT_STATUS_ERROR),