seddonym / import-linter

Import Linter allows you to define and enforce rules for the internal and external imports within your Python project.
https://import-linter.readthedocs.io/
BSD 2-Clause "Simplified" License
676 stars 46 forks source link

PanicError when duplicate layers are passed #241

Open fraser-langton opened 1 day ago

fraser-langton commented 1 day ago

.importlinter

[importlinter]
root_packages=
    blueprinter
    blueprinting
    database
    design
    interfaces
    legacy
    mail
    mapbox
    render_api
    respawned_models
    utils
    worker
    worker_handlers
include_external_packages = False
exclude_type_checking_imports = True

[importlinter:contract:import-order]
name = import order
type = layers
layers =
    interfaces

    # the trash
    utils : blueprinter : blueprinting : database : design : interfaces : legacy : mail : mapbox : render_api : respawned_models : utils : worker : worker_handlers

output

\common> lint-imports
=============
Import Linter
=============

thread '<unnamed>' panicked at src\importgraph.rs:144:63:
no entry found for key
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Traceback (most recent call last):
  File "C:\Users\fraser\AppData\Roaming\uv\python\cpython-3.8.20-windows-x86_64-none\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\fraser\AppData\Roaming\uv\python\cpython-3.8.20-windows-x86_64-none\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\fraser\Render\render-services\.venv\Scripts\lint-imports.exe\__main__.py", line 7, in <module>
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\click\core.py", line 1120, in __call__
    return self.main(*args, **kwargs)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\click\core.py", line 1041, in main
    rv = self.invoke(ctx)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\click\core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\click\core.py", line 750, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\cli.py", line 52, in lint_imports_command
    exit_code = lint_imports(
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\cli.py", line 99, in lint_imports
    passed = use_cases.lint_imports(
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\application\use_cases.py", line 54, in lint_imports
    report = create_report(user_options, limit_to_contracts, cache_dir, show_timings, verbose)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\application\use_cases.py", line 122, in create_report
    return _build_report(
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\application\use_cases.py", line 195, in _build_report
    check = contract.check(copy_of_graph, verbose=verbose)
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\importlinter\contracts\layers.py", line 147, in check
    dependencies = graph.find_illegal_dependencies_for_layers(
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\grimp\adaptors\graph.py", line 356, in find_illegal_dependencies_for_layers
    return _layers.find_illegal_dependencies(graph=self, layers=layers, containers=containers or set())
  File "C:\Users\fraser\Render\render-services\.venv\lib\site-packages\grimp\adaptors\_layers.py", line 46, in find_illegal_dependencies
    rust_package_dependency_tuple = rust.find_illegal_dependencies(
pyo3_runtime.PanicException: no entry found for key
fraser-langton commented 1 day ago

So I think it's just from defining a module name twice in the layers

seddonym commented 21 hours ago

Thanks for the bug report! You're right, it looks like it's because of the duplicate layers.

I've created a bug report in the underlying library Grimp too: https://github.com/seddonym/grimp/issues/165

But really the contract should be treated as invalid if has duplicate layers.