noqa-runner 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. noqa_runner-0.1.0/.gitignore +177 -0
  2. noqa_runner-0.1.0/PKG-INFO +117 -0
  3. noqa_runner-0.1.0/noqa_runner/.python-version +1 -0
  4. noqa_runner-0.1.0/noqa_runner/README.md +97 -0
  5. noqa_runner-0.1.0/noqa_runner/RELEASE.md +185 -0
  6. noqa_runner-0.1.0/noqa_runner/__init__.py +13 -0
  7. noqa_runner-0.1.0/noqa_runner/__main__.py +8 -0
  8. noqa_runner-0.1.0/noqa_runner/application/__init__.py +3 -0
  9. noqa_runner-0.1.0/noqa_runner/application/run_test_session.py +397 -0
  10. noqa_runner-0.1.0/noqa_runner/application/services/__init__.py +3 -0
  11. noqa_runner-0.1.0/noqa_runner/application/services/mobile_service.py +335 -0
  12. noqa_runner-0.1.0/noqa_runner/config.py +23 -0
  13. noqa_runner-0.1.0/noqa_runner/domain/__init__.py +3 -0
  14. noqa_runner-0.1.0/noqa_runner/domain/models/__init__.py +3 -0
  15. noqa_runner-0.1.0/noqa_runner/domain/models/test_info.py +13 -0
  16. noqa_runner-0.1.0/noqa_runner/infrastructure/__init__.py +0 -0
  17. noqa_runner-0.1.0/noqa_runner/infrastructure/adapters/http/__init__.py +0 -0
  18. noqa_runner-0.1.0/noqa_runner/infrastructure/adapters/http/agent_api.py +56 -0
  19. noqa_runner-0.1.0/noqa_runner/infrastructure/adapters/mobile/__init__.py +0 -0
  20. noqa_runner-0.1.0/noqa_runner/infrastructure/adapters/mobile/appium_adapter.py +250 -0
  21. noqa_runner-0.1.0/noqa_runner/interfaces/__init__.py +0 -0
  22. noqa_runner-0.1.0/noqa_runner/interfaces/cli/__init__.py +0 -0
  23. noqa_runner-0.1.0/noqa_runner/interfaces/cli/__main__.py +8 -0
  24. noqa_runner-0.1.0/noqa_runner/interfaces/cli/cli.py +188 -0
  25. noqa_runner-0.1.0/noqa_runner/logging_config.py +70 -0
  26. noqa_runner-0.1.0/noqa_runner/pyproject.toml +35 -0
  27. noqa_runner-0.1.0/pyproject.toml +37 -0
  28. noqa_runner-0.1.0/shared/__init__.py +0 -0
  29. noqa_runner-0.1.0/shared/config.py +37 -0
  30. noqa_runner-0.1.0/shared/infrastructure/__init__.py +0 -0
  31. noqa_runner-0.1.0/shared/infrastructure/adapters/http/__init__.py +0 -0
  32. noqa_runner-0.1.0/shared/infrastructure/adapters/http/base_client.py +107 -0
  33. noqa_runner-0.1.0/shared/infrastructure/adapters/http/client_manager.py +66 -0
  34. noqa_runner-0.1.0/shared/infrastructure/adapters/http/generic.py +119 -0
  35. noqa_runner-0.1.0/shared/infrastructure/adapters/storage/__init__.py +0 -0
  36. noqa_runner-0.1.0/shared/infrastructure/adapters/storage/local_storage_adapter.py +112 -0
  37. noqa_runner-0.1.0/shared/models/__init__.py +0 -0
  38. noqa_runner-0.1.0/shared/models/actions/__init__.py +0 -0
  39. noqa_runner-0.1.0/shared/models/actions/action_data.py +41 -0
  40. noqa_runner-0.1.0/shared/models/actions/activate_app.py +15 -0
  41. noqa_runner-0.1.0/shared/models/actions/background_app.py +15 -0
  42. noqa_runner-0.1.0/shared/models/actions/base.py +18 -0
  43. noqa_runner-0.1.0/shared/models/actions/handle_system_alert.py +23 -0
  44. noqa_runner-0.1.0/shared/models/actions/input_text.py +25 -0
  45. noqa_runner-0.1.0/shared/models/actions/open_url.py +21 -0
  46. noqa_runner-0.1.0/shared/models/actions/restart_app.py +15 -0
  47. noqa_runner-0.1.0/shared/models/actions/scroll.py +28 -0
  48. noqa_runner-0.1.0/shared/models/actions/stop.py +21 -0
  49. noqa_runner-0.1.0/shared/models/actions/swipe.py +26 -0
  50. noqa_runner-0.1.0/shared/models/actions/tap.py +23 -0
  51. noqa_runner-0.1.0/shared/models/actions/terminate_app.py +16 -0
  52. noqa_runner-0.1.0/shared/models/actions/wait.py +15 -0
  53. noqa_runner-0.1.0/shared/models/state/__init__.py +0 -0
  54. noqa_runner-0.1.0/shared/models/state/condition.py +27 -0
  55. noqa_runner-0.1.0/shared/models/state/screen.py +70 -0
  56. noqa_runner-0.1.0/shared/models/state/step.py +27 -0
  57. noqa_runner-0.1.0/shared/models/state/test_state.py +101 -0
  58. noqa_runner-0.1.0/shared/pyproject.toml +20 -0
  59. noqa_runner-0.1.0/shared/utils/__init__.py +0 -0
  60. noqa_runner-0.1.0/shared/utils/graceful_shutdown.py +156 -0
  61. noqa_runner-0.1.0/shared/utils/retry_decorator.py +81 -0
  62. noqa_runner-0.1.0/shared/utils/zip_extractor.py +26 -0
@@ -0,0 +1,177 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ .idea/
161
+ secrets/
162
+
163
+ /draft/
164
+
165
+ .DS_Store
166
+
167
+ *.ipa
168
+
169
+ # Local debug configurations
170
+ application/debug/configs/debug_tests.json
171
+ **/debug_tests.json
172
+ # Runner symlink to shared
173
+ runner/shared
174
+
175
+ # Build directory for runner package
176
+ /build_runner/*
177
+ !/build_runner/pyproject.toml
@@ -0,0 +1,117 @@
1
+ Metadata-Version: 2.4
2
+ Name: noqa-runner
3
+ Version: 0.1.0
4
+ Summary: noqa runner
5
+ Author-email: Sergey Ustinov <sergey@noqa.ai>
6
+ Requires-Python: >=3.10
7
+ Requires-Dist: aiofiles>=24.0.0
8
+ Requires-Dist: appium-python-client>=4.0.0
9
+ Requires-Dist: defusedxml>=0.7.1
10
+ Requires-Dist: httpx>=0.27.0
11
+ Requires-Dist: numpy>=1.24.0
12
+ Requires-Dist: pillow>=10.0.0
13
+ Requires-Dist: pydantic-settings>=2.10.0
14
+ Requires-Dist: pydantic>=2.0.0
15
+ Requires-Dist: sentry-sdk>=2.0.0
16
+ Requires-Dist: structlog>=24.0.0
17
+ Requires-Dist: tenacity>=8.0.0
18
+ Requires-Dist: typer>=0.12.0
19
+ Description-Content-Type: text/markdown
20
+
21
+ # noqa-runner
22
+
23
+ AI-powered mobile test execution runner for iOS applications.
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ pip install noqa-runner
29
+ ```
30
+
31
+ ## Quick Start
32
+
33
+ ### CLI
34
+
35
+ ```bash
36
+ # Run from command line
37
+ python -m noqa_runner run \
38
+ --device-id "00008110-001234567890001E" \
39
+ --build-path /path/to/app.ipa \
40
+ --noqa-api-token $NOQA_API_TOKEN \
41
+ --case-input-json '[
42
+ {
43
+ "case_instructions": "Open app and login with valid credentials"
44
+ }
45
+ ]'
46
+ ```
47
+
48
+ **Options:**
49
+
50
+ ```
51
+ --device-id TEXT Device UDID for testing [required]
52
+ --build-path TEXT Path to IPA build file [required]
53
+ --noqa-api-token TEXT noqa API authentication token [required]
54
+ --case-input-json TEXT JSON with test cases: [{case_instructions, test_id, case_name?}]
55
+ --app-context TEXT Application context information [optional]
56
+ --agent-api-url TEXT Agent API base URL [optional, default: https://agent.noqa.ai]
57
+ --log-level TEXT Logging level [optional, default: INFO]
58
+ --appium-url TEXT Appium server URL [optional, default: http://localhost:4723]
59
+ ```
60
+
61
+ **Note:** Either `--case-input-json` or `--case-ids` must be provided. `bundle_id` is extracted automatically from the IPA file.
62
+
63
+ ### Python API
64
+
65
+ ```python
66
+ from uuid import uuid4
67
+ from noqa_runner.application.run_test_session import RunTestSession
68
+ from noqa_runner.domain.models.test_info import RunnerTestInfo
69
+
70
+ # Create session
71
+ session = RunTestSession()
72
+
73
+ # Run tests
74
+ results = session.run(
75
+ device_id="00008110-001234567890001E",
76
+ appium_url="http://localhost:4723",
77
+ build_path="/path/to/app.ipa",
78
+ noqa_api_token="your-token",
79
+ tests=[
80
+ RunnerTestInfo(
81
+ test_id="...",
82
+ case_instructions="Open app and verify home screen",
83
+ case_name="Home Screen Test",
84
+ )
85
+ ],
86
+ )
87
+
88
+ for result in results:
89
+ print(f"Test {result.case_name}: {result.status}")
90
+ ```
91
+
92
+ ## Logging
93
+
94
+ All logs are output in JSON format with the following fields:
95
+
96
+ ```json
97
+ {
98
+ "event": "test_started",
99
+ "event_type": "progress",
100
+ "test_id": "550e8400-e29b-41d4-a716-446655440000",
101
+ "case_name": "Login Test",
102
+ "timestamp": "2025-10-16T10:30:00Z"
103
+ }
104
+ ```
105
+
106
+ Event types:
107
+ - `progress` - Test execution progress
108
+ - `result` - Final test result
109
+
110
+
111
+ ## License
112
+
113
+ Proprietary - noqa.ai
114
+
115
+ ## Support
116
+
117
+ For issues and questions, please contact sergey@noqa.ai
@@ -0,0 +1 @@
1
+ 3.10
@@ -0,0 +1,97 @@
1
+ # noqa-runner
2
+
3
+ AI-powered mobile test execution runner for iOS applications.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install noqa-runner
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### CLI
14
+
15
+ ```bash
16
+ # Run from command line
17
+ python -m noqa_runner run \
18
+ --device-id "00008110-001234567890001E" \
19
+ --build-path /path/to/app.ipa \
20
+ --noqa-api-token $NOQA_API_TOKEN \
21
+ --case-input-json '[
22
+ {
23
+ "case_instructions": "Open app and login with valid credentials"
24
+ }
25
+ ]'
26
+ ```
27
+
28
+ **Options:**
29
+
30
+ ```
31
+ --device-id TEXT Device UDID for testing [required]
32
+ --build-path TEXT Path to IPA build file [required]
33
+ --noqa-api-token TEXT noqa API authentication token [required]
34
+ --case-input-json TEXT JSON with test cases: [{case_instructions, test_id, case_name?}]
35
+ --app-context TEXT Application context information [optional]
36
+ --agent-api-url TEXT Agent API base URL [optional, default: https://agent.noqa.ai]
37
+ --log-level TEXT Logging level [optional, default: INFO]
38
+ --appium-url TEXT Appium server URL [optional, default: http://localhost:4723]
39
+ ```
40
+
41
+ **Note:** Either `--case-input-json` or `--case-ids` must be provided. `bundle_id` is extracted automatically from the IPA file.
42
+
43
+ ### Python API
44
+
45
+ ```python
46
+ from uuid import uuid4
47
+ from noqa_runner.application.run_test_session import RunTestSession
48
+ from noqa_runner.domain.models.test_info import RunnerTestInfo
49
+
50
+ # Create session
51
+ session = RunTestSession()
52
+
53
+ # Run tests
54
+ results = session.run(
55
+ device_id="00008110-001234567890001E",
56
+ appium_url="http://localhost:4723",
57
+ build_path="/path/to/app.ipa",
58
+ noqa_api_token="your-token",
59
+ tests=[
60
+ RunnerTestInfo(
61
+ test_id="...",
62
+ case_instructions="Open app and verify home screen",
63
+ case_name="Home Screen Test",
64
+ )
65
+ ],
66
+ )
67
+
68
+ for result in results:
69
+ print(f"Test {result.case_name}: {result.status}")
70
+ ```
71
+
72
+ ## Logging
73
+
74
+ All logs are output in JSON format with the following fields:
75
+
76
+ ```json
77
+ {
78
+ "event": "test_started",
79
+ "event_type": "progress",
80
+ "test_id": "550e8400-e29b-41d4-a716-446655440000",
81
+ "case_name": "Login Test",
82
+ "timestamp": "2025-10-16T10:30:00Z"
83
+ }
84
+ ```
85
+
86
+ Event types:
87
+ - `progress` - Test execution progress
88
+ - `result` - Final test result
89
+
90
+
91
+ ## License
92
+
93
+ Proprietary - noqa.ai
94
+
95
+ ## Support
96
+
97
+ For issues and questions, please contact sergey@noqa.ai
@@ -0,0 +1,185 @@
1
+ # Runner Package Release Guide
2
+
3
+ ## Подготовка к релизу
4
+
5
+ 1. **Убедитесь, что все изменения закоммичены**
6
+ ```bash
7
+ git status
8
+ git add .
9
+ git commit -m "Prepare runner v0.1.0"
10
+ git push
11
+ ```
12
+
13
+ 2. **Проверьте, что тесты проходят**
14
+ ```bash
15
+ cd runner
16
+ uv run pytest ../tests/runner/ -v
17
+ ```
18
+
19
+ 3. **Проверьте линтер**
20
+ ```bash
21
+ uv run ruff check .
22
+ uv run black --check .
23
+ ```
24
+
25
+ ## Релиз через GitHub Actions
26
+
27
+ ### Способ 1: Через UI
28
+
29
+ 1. Перейдите на https://github.com/noqa-ai/agent/actions
30
+ 2. Выберите "Release Runner Package" в левом меню
31
+ 3. Нажмите "Run workflow" справа
32
+ 4. Заполните форму:
33
+ - **Version**: `0.1.0` (без префикса v)
34
+ - **Pre-release**: отметьте, если это бета-версия
35
+ 5. Нажмите "Run workflow"
36
+
37
+ ### Способ 2: Через GitHub CLI
38
+
39
+ ```bash
40
+ gh workflow run release-runner.yml \
41
+ -f version=0.1.0 \
42
+ -f prerelease=false
43
+ ```
44
+
45
+ ## Что происходит при релизе
46
+
47
+ 1. ✅ **Test Job**: Запуск pytest и ruff
48
+ 2. 📦 **Build Job**: Сборка wheel и sdist
49
+ 3. 🚀 **Publish Job**: Публикация в GitHub Packages
50
+ 4. 📝 **Release Job**: Создание GitHub Release
51
+
52
+ ## После релиза
53
+
54
+ ### Проверка релиза
55
+
56
+ ```bash
57
+ # Проверить GitHub Release
58
+ open https://github.com/noqa-ai/agent/releases
59
+
60
+ # Скачать артефакты
61
+ gh release download runner-v0.1.0
62
+ ```
63
+
64
+ ### Установка пакета
65
+
66
+ ```bash
67
+ # Из GitHub Packages
68
+ pip install noqa-runner==0.1.0
69
+
70
+ # Локально для тестирования
71
+ cd runner
72
+ uv build
73
+ pip install dist/noqa_runner-0.1.0-py3-none-any.whl
74
+ ```
75
+
76
+ ### Тестирование установленного пакета
77
+
78
+ ```bash
79
+ # Проверить версию
80
+ python -c "import runner; print(runner.__version__)"
81
+
82
+ # Запустить CLI
83
+ noqa-runner --help
84
+ ```
85
+
86
+ ## Откат релиза
87
+
88
+ Если релиз содержит критическую ошибку:
89
+
90
+ 1. **Удалить GitHub Release**
91
+ ```bash
92
+ gh release delete runner-v0.1.0 --yes
93
+ ```
94
+
95
+ 2. **Удалить тег**
96
+ ```bash
97
+ git tag -d runner-v0.1.0
98
+ git push origin :refs/tags/runner-v0.1.0
99
+ ```
100
+
101
+ 3. **Создать hotfix релиз**
102
+ - Исправить баг
103
+ - Увеличить версию (например, 0.1.1)
104
+ - Запустить релиз заново
105
+
106
+ ## Версионирование
107
+
108
+ Используем [Semantic Versioning](https://semver.org/):
109
+
110
+ - **MAJOR** (1.0.0): Несовместимые изменения API
111
+ - **MINOR** (0.1.0): Новая функциональность, обратно совместимая
112
+ - **PATCH** (0.0.1): Багфиксы, обратно совместимые
113
+
114
+ ### Примеры
115
+
116
+ - `0.1.0` - Первый рабочий релиз
117
+ - `0.2.0` - Добавлена новая команда CLI
118
+ - `0.2.1` - Исправлен баг в логировании
119
+ - `1.0.0` - Стабильный релиз, готов для продакшена
120
+
121
+ ## Pre-release версии
122
+
123
+ Для тестовых релизов:
124
+
125
+ ```bash
126
+ # Alpha
127
+ gh workflow run release-runner.yml -f version=0.1.0-alpha.1 -f prerelease=true
128
+
129
+ # Beta
130
+ gh workflow run release-runner.yml -f version=0.1.0-beta.1 -f prerelease=true
131
+
132
+ # Release Candidate
133
+ gh workflow run release-runner.yml -f version=0.1.0-rc.1 -f prerelease=true
134
+ ```
135
+
136
+ ## Troubleshooting
137
+
138
+ ### Build failed
139
+
140
+ ```bash
141
+ # Локальная проверка сборки
142
+ cd runner
143
+ uv build
144
+ ls -la dist/
145
+ ```
146
+
147
+ ### Tests failed
148
+
149
+ ```bash
150
+ # Запустить тесты локально
151
+ cd runner
152
+ uv run pytest ../tests/runner/ -v -x # -x останавливается на первой ошибке
153
+ ```
154
+
155
+ ### Publishing failed
156
+
157
+ Проверьте:
158
+ - Есть ли права на публикацию в GitHub Packages
159
+ - Правильно ли настроен `GITHUB_TOKEN`
160
+ - Не существует ли уже такая версия пакета
161
+
162
+ ## Полезные команды
163
+
164
+ ```bash
165
+ # Проверить changelog
166
+ git log --oneline --since="2 weeks ago" -- runner/
167
+
168
+ # Создать changelog автоматически
169
+ git log --pretty=format:"- %s" --since="v0.0.1" -- runner/ > CHANGELOG.md
170
+
171
+ # Проверить размер пакета
172
+ cd runner
173
+ uv build
174
+ ls -lh dist/
175
+ ```
176
+
177
+ ## Checklist перед релизом
178
+
179
+ - [ ] Все тесты проходят локально
180
+ - [ ] Линтер не выдает ошибок
181
+ - [ ] README.md обновлен
182
+ - [ ] RUNNER_REFACTORING.md содержит все изменения
183
+ - [ ] Версия в pyproject.toml корректна (будет обновлена автоматически)
184
+ - [ ] Создан git tag для версии
185
+ - [ ] Все изменения запушены в GitHub
@@ -0,0 +1,13 @@
1
+ """
2
+ noqa runner package.
3
+
4
+ AI-powered mobile test execution runner for iOS applications.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from noqa_runner.logging_config import configure_logging
10
+
11
+ # Configure default logging on module import
12
+ # CLI will reconfigure with custom log level if needed
13
+ configure_logging()
@@ -0,0 +1,8 @@
1
+ """Entry point for running runner as a module: python -m noqa_runner"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from noqa_runner.interfaces.cli.cli import main
6
+
7
+ if __name__ == "__main__":
8
+ main()
@@ -0,0 +1,3 @@
1
+ """Application layer for runner package"""
2
+
3
+ from __future__ import annotations