Title: Fatal crash on `usethis tool import-linter` for empty `src` dir · Issue #1226 · usethis-python/usethis-python · GitHub
Open Graph Title: Fatal crash on `usethis tool import-linter` for empty `src` dir · Issue #1226 · usethis-python/usethis-python
X Title: Fatal crash on `usethis tool import-linter` for empty `src` dir · Issue #1226 · usethis-python/usethis-python
Description: for https://github.com/pypest/pyemu/tree/migrate_uv/pyemu Details uvx usethis tool import-linter ✔ Adding dependency 'import-linter' to the 'dev' group in 'pyproject.toml'. ⚠ Could not find any importable packages. ⚠ Assuming the package...
Open Graph Description: for https://github.com/pypest/pyemu/tree/migrate_uv/pyemu Details uvx usethis tool import-linter ✔ Adding dependency 'import-linter' to the 'dev' group in 'pyproject.toml'. ⚠ Could not find any imp...
X Description: for https://github.com/pypest/pyemu/tree/migrate_uv/pyemu Details uvx usethis tool import-linter ✔ Adding dependency 'import-linter' to the 'dev' group in 'pyproject.toml'. ...
Opengraph URL: https://github.com/usethis-python/usethis-python/issues/1226
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Fatal crash on `usethis tool import-linter` for empty `src` dir","articleBody":"for https://github.com/pypest/pyemu/tree/migrate_uv/pyemu\n\n\u003cdetails\u003e\n\n```\nuvx usethis tool import-linter \n✔ Adding dependency 'import-linter' to the 'dev' group in 'pyproject.toml'. \n⚠ Could not find any importable packages.\n⚠ Assuming the package name is pyemu.\n╭──────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_ui\\interface\\tool.py:136 in import_linter │\n│ │\n│ 133 │ │ ), ╭─────────────── locals ───────────────╮ │\n│ 134 │ │ files_manager(), │ backend = \u003cBackendEnum.auto: 'auto'\u003e │ │\n│ 135 │ ): │ frozen = False │ │\n│ ❱ 136 │ │ _run_tool(use_import_linter, remove=remove, how=how) │ how = False │ │\n│ 137 │ offline = False │ │\n│ 138 │ quiet = False │ │\n│ 139 @app.command( │ remove = False │ │\n│ ╰──────────────────────────────────────╯ │\n│ │\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_ui\\interface\\tool.py:339 in _run_tool │\n│ │\n│ 336 │ from usethis.errors import UsethisError ╭──── locals ────╮ │\n│ 337 │ │ how = False │ │\n│ 338 │ try: │ kwargs = {} │ │\n│ ❱ 339 │ │ caller(remove=remove, how=how, **kwargs) │ remove = False │ │\n│ 340 │ except UsethisError as err: ╰────────────────╯ │\n│ 341 │ │ err_print(err) │\n│ 342 │ │ raise typer.Exit(code=1) from None │\n│ │\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_core\\tool.py:143 in use_import_linter │\n│ │\n│ 140 │ │ ensure_dep_declaration_file() │\n│ 141 │ │ │\n│ 142 │ │ tool.add_dev_deps() │\n│ ❱ 143 │ │ tool.add_configs() │\n│ 144 │ │ if RuffTool().is_used(): │\n│ 145 │ │ │ RuffTool().apply_rule_config(rule_config) │\n│ 146 │ │ if PreCommitTool().is_used(): │\n│ │\n│ ╭─────────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────────╮ │\n│ │ how = False │ │\n│ │ remove = False │ │\n│ │ rule_config = RuleConfig(selected=[], ignored=[], unmanaged_selected=['INP'], unmanaged_ignored=[], tests_unmanaged_ignored=['INP']) │ │\n│ │ tool = \u003cusethis._tool.impl.import_linter.ImportLinterTool object at 0x00000151BFACEFD0\u003e │ │\n│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n│ │\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_tool\\base.py:421 in add_configs │\n│ │\n│ 418 │ │ # In practice, the most common resolution method is \"first\", in which case there │\n│ 419 │ │ # is only ever one active file; so principles #2 and #3 are not relevant. │\n│ 420 │ │ │\n│ ❱ 421 │ │ active_config_file_managers = self.get_active_config_file_managers() │\n│ 422 │ │ │\n│ 423 │ │ already_added = False # Only print messages for the first added config item. │\n│ 424 │ │ for config_item in self.get_config_spec().config_items: │\n│ │\n│ ╭──────────────────────────────────────── locals ─────────────────────────────────────────╮ │\n│ │ self = \u003cusethis._tool.impl.import_linter.ImportLinterTool object at 0x00000151BFACEFD0\u003e │ │\n│ ╰─────────────────────────────────────────────────────────────────────────────────────────╯ │\n│ │\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_tool\\base.py:322 in get_active_config_file_managers │\n│ │\n│ 319 │ │\n│ 320 │ def get_active_config_file_managers(self) -\u003e set[KeyValueFileManager]: │\n│ 321 │ │ \"\"\"Get relative paths to all active configuration files.\"\"\" │\n│ ❱ 322 │ │ config_spec = self.get_config_spec() │\n│ 323 │ │ resolution = config_spec.resolution │\n│ 324 │ │ return self._get_active_config_file_managers_from_resolution( │\n│ 325 │ │ │ resolution, │\n│ │\n│ ╭──────────────────────────────────────── locals ─────────────────────────────────────────╮ │\n│ │ self = \u003cusethis._tool.impl.import_linter.ImportLinterTool object at 0x00000151BFACEFD0\u003e │ │\n│ ╰─────────────────────────────────────────────────────────────────────────────────────────╯ │\n│ │\n│ C:\\Users\\namc\\AppData\\Local\\uv\\cache\\archive-v0\\w6T56ykrY7K3wv_iBpmjD\\Lib\\site-packages\\usethis\\_tool\\impl\\import_linter.py:162 in get_config_spec │\n│ │\n│ 159 │ │ │ │ contracts.append(contract) │\n│ 160 │ │ │\n│ 161 │ │ if not contracts: │\n│ ❱ 162 │ │ │ raise AssertionError │\n│ 163 │ │ │\n│ 164 │ │ def get_root_packages() -\u003e list[str] | NoConfigValue: │\n│ 165 │ │ │ # There are two configuration items which are very similar: │\n│ │\n│ ╭───────────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────────╮ │\n│ │ contracts = [] │ │\n│ │ layered_architecture_by_module = {} │ │\n│ │ layered_architecture_by_module_by_root_package = {'pyemu': {}} │ │\n│ │ min_depth = 0 │ │\n│ │ self = \u003cusethis._tool.impl.import_linter.ImportLinterTool object at 0x00000151BFACEFD0\u003e │ │\n│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │\n╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\nAssertionError\n```\n\n\u003c/details\u003e","author":{"url":"https://github.com/nathanjmcdougall","@type":"Person","name":"nathanjmcdougall"},"datePublished":"2025-12-23T05:31:12.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/1226/usethis-python/issues/1226"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:cbfb0284-c210-4e9f-d0aa-8e34c19649e0 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 80AC:1E311A:36BDB1:4E2D4B:6A4C9F0D |
| html-safe-nonce | cfa487732c1cb00cecaf74c0543ee6e971d8bdf792b59421dcece0f18152917c |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4MEFDOjFFMzExQTozNkJEQjE6NEUyRDRCOjZBNEM5RjBEIiwidmlzaXRvcl9pZCI6Ijg3Nzc1Mjc3MjcyMDY3MzU2MjkiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 3aa3298150494c2f313834ac8786d8ed05f94ab1bddd1d2ce9b4f01b461c0510 |
| hovercard-subject-tag | issue:3756103554 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/usethis-python/usethis-python/1226/issue_layout |
| twitter:image | https://opengraph.githubassets.com/faf6cc5be07513573534587d257721956352b877af426a68a39d7649d2e0f1b2/usethis-python/usethis-python/issues/1226 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/faf6cc5be07513573534587d257721956352b877af426a68a39d7649d2e0f1b2/usethis-python/usethis-python/issues/1226 |
| og:image:alt | for https://github.com/pypest/pyemu/tree/migrate_uv/pyemu Details uvx usethis tool import-linter ✔ Adding dependency 'import-linter' to the 'dev' group in 'pyproject.toml'. ⚠ Could not find any imp... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | nathanjmcdougall |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3d11bb817438277de2a940854450e83a7d32b6aeb5014e9e6b00a6423900251c |
| turbo-cache-control | no-preview |
| go-import | github.com/usethis-python/usethis-python git https://github.com/usethis-python/usethis-python.git |
| octolytics-dimension-user_id | 216362695 |
| octolytics-dimension-user_login | usethis-python |
| octolytics-dimension-repository_id | 842189705 |
| octolytics-dimension-repository_nwo | usethis-python/usethis-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 842189705 |
| octolytics-dimension-repository_network_root_nwo | usethis-python/usethis-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | ae90d426644ca15e89bacceb72e51f4e9dbf85f7 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width