domd 2.2.8__tar.gz → 2.2.9__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.
- {domd-2.2.8 → domd-2.2.9}/PKG-INFO +1 -1
- {domd-2.2.8 → domd-2.2.9}/pyproject.toml +1 -1
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/__init__.py +1 -0
- domd-2.2.9/src/domd/parsers/markdown_parser.py +69 -0
- {domd-2.2.8 → domd-2.2.9}/LICENSE +0 -0
- {domd-2.2.8 → domd-2.2.9}/README.md +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/api/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/api/flask_api.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/cli/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/cli/command_presenter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/formatters/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/formatters/markdown_formatter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/in_memory_command_repository.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/shell_command_executor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/api.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/application/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/application/factory.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/cli.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/command_execution/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/base_detector.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/command_handler.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/config_handler.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/models.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/base_parser.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/parser_registry.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/project_detector.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/file_utils.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/virtualenv.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_executor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_recorder.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_runner.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/environment_detector.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/executor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/command.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/executor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/detector.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/domain/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/domain/command.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_galaxy.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_inventory.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_playbook.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_role.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_vault.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/base.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/cargo_toml.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/composer_json.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/go_mod.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/makefile.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/package_json.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/pyproject_toml.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/tox_ini.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/base.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/file_processor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/parser_registry.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/pattern_matcher.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/command_executor.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/command_repository.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/report_formatter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/command_handling.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/config_files.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/detector.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/virtualenv.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/base.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/done_md.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/todo_md.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/formatters.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/reporter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/command_service.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/report_service.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/command_utils.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/environment.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/file_utils.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/logging_utils.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/virtualenv.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/ansible.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/base.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/build_systems.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/ci_cd.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/docker_compose.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/dockerfile.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/javascript/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/javascript.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/package_json.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/python.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_build_systems.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_ci_cd.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_docker.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_javascript.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_python.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsing/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/parsing/base.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/console.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/json_reporter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_console.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_json_reporter.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_todo_md.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/todo_md.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/reporting/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/utils/__init__.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/utils/command_runner.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/utils/file_utils.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/utils/test_command_runner.py +0 -0
- {domd-2.2.8 → domd-2.2.9}/src/domd/utils/test_file_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "domd"
|
|
3
|
-
version = "2.2.
|
|
3
|
+
version = "2.2.9"
|
|
4
4
|
description = "Project Command Detector - Automatically detects and tests project commands, generates TODO.md for failed commands"
|
|
5
5
|
authors = ["Tom Sapletta <info@softreck.dev>"]
|
|
6
6
|
maintainers = ["WRONAI Team"]
|
|
@@ -26,6 +26,7 @@ PARSER_MODULES = [
|
|
|
26
26
|
"domd.parsers.docker",
|
|
27
27
|
"domd.parsers.javascript", # This now includes package.json parser
|
|
28
28
|
"domd.parsers.python",
|
|
29
|
+
"domd.parsers.markdown_parser", # Markdown file parser
|
|
29
30
|
]
|
|
30
31
|
|
|
31
32
|
logger.debug(f"Parser modules to load: {PARSER_MODULES}")
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Markdown file parser for extracting commands from README files."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Dict, List, Optional, Union
|
|
7
|
+
|
|
8
|
+
from domd.core.parsing.base import BaseParser
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
class MarkdownParser(BaseParser):
|
|
13
|
+
"""Parser for Markdown files to extract commands from code blocks."""
|
|
14
|
+
|
|
15
|
+
supported_file_patterns = ["**/README.md", "**/*.md"]
|
|
16
|
+
|
|
17
|
+
def _parse_commands(self) -> List[Dict[str, Any]]:
|
|
18
|
+
"""Parse commands from markdown file.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
List of command dictionaries with 'command', 'description', 'source', and 'type' keys
|
|
22
|
+
"""
|
|
23
|
+
if not self.file_path or not self.file_path.exists():
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
content = self.file_path.read_text(encoding="utf-8")
|
|
28
|
+
except Exception as e:
|
|
29
|
+
logger.error(f"Error reading {self.file_path}: {e}")
|
|
30
|
+
return []
|
|
31
|
+
|
|
32
|
+
commands = []
|
|
33
|
+
in_code_block = False
|
|
34
|
+
current_command = ""
|
|
35
|
+
current_lang = ""
|
|
36
|
+
|
|
37
|
+
# Look for code blocks with bash, shell, or no language specified
|
|
38
|
+
code_block_pattern = re.compile(r'```(?:bash|shell|sh)?\s*\n(.*?)\n```', re.DOTALL)
|
|
39
|
+
|
|
40
|
+
for match in code_block_pattern.finditer(content):
|
|
41
|
+
code_block = match.group(1).strip()
|
|
42
|
+
if not code_block:
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
# Split into lines and clean up
|
|
46
|
+
lines = [line.strip() for line in code_block.split('\n') if line.strip()]
|
|
47
|
+
for line in lines:
|
|
48
|
+
# Skip comments and empty lines
|
|
49
|
+
if line.startswith('#') or not line.strip():
|
|
50
|
+
continue
|
|
51
|
+
|
|
52
|
+
# Add the command
|
|
53
|
+
commands.append({
|
|
54
|
+
'command': line,
|
|
55
|
+
'description': f'Command from {self.file_path.name}',
|
|
56
|
+
'type': 'shell',
|
|
57
|
+
'source': str(self.file_path.relative_to(self.project_root) if self.project_root else self.file_path),
|
|
58
|
+
'metadata': {
|
|
59
|
+
'line_number': content[:match.start()].count('\n') + 1,
|
|
60
|
+
'file': str(self.file_path.relative_to(self.project_root) if self.project_root else self.file_path),
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
logger.debug(f"Found {len(commands)} commands in {self.file_path}")
|
|
65
|
+
return commands
|
|
66
|
+
|
|
67
|
+
def get_parsers() -> List[type]:
|
|
68
|
+
"""Return list of parser classes in this module."""
|
|
69
|
+
return [MarkdownParser]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|