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.
Files changed (124) hide show
  1. {domd-2.2.8 → domd-2.2.9}/PKG-INFO +1 -1
  2. {domd-2.2.8 → domd-2.2.9}/pyproject.toml +1 -1
  3. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/__init__.py +1 -0
  4. domd-2.2.9/src/domd/parsers/markdown_parser.py +69 -0
  5. {domd-2.2.8 → domd-2.2.9}/LICENSE +0 -0
  6. {domd-2.2.8 → domd-2.2.9}/README.md +0 -0
  7. {domd-2.2.8 → domd-2.2.9}/src/domd/__init__.py +0 -0
  8. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/__init__.py +0 -0
  9. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/api/__init__.py +0 -0
  10. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/api/flask_api.py +0 -0
  11. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/cli/__init__.py +0 -0
  12. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/cli/command_presenter.py +0 -0
  13. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/formatters/__init__.py +0 -0
  14. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/formatters/markdown_formatter.py +0 -0
  15. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/__init__.py +0 -0
  16. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/in_memory_command_repository.py +0 -0
  17. {domd-2.2.8 → domd-2.2.9}/src/domd/adapters/persistence/shell_command_executor.py +0 -0
  18. {domd-2.2.8 → domd-2.2.9}/src/domd/api.py +0 -0
  19. {domd-2.2.8 → domd-2.2.9}/src/domd/application/__init__.py +0 -0
  20. {domd-2.2.8 → domd-2.2.9}/src/domd/application/factory.py +0 -0
  21. {domd-2.2.8 → domd-2.2.9}/src/domd/cli.py +0 -0
  22. {domd-2.2.8 → domd-2.2.9}/src/domd/command_execution/__init__.py +0 -0
  23. {domd-2.2.8 → domd-2.2.9}/src/domd/core/__init__.py +0 -0
  24. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/__init__.py +0 -0
  25. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/base_detector.py +0 -0
  26. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/__init__.py +0 -0
  27. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/command_handler.py +0 -0
  28. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/handlers/config_handler.py +0 -0
  29. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/models.py +0 -0
  30. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/__init__.py +0 -0
  31. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/base_parser.py +0 -0
  32. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/parsers/parser_registry.py +0 -0
  33. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/project_detector.py +0 -0
  34. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/__init__.py +0 -0
  35. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/file_utils.py +0 -0
  36. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_detection/utils/virtualenv.py +0 -0
  37. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/__init__.py +0 -0
  38. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_executor.py +0 -0
  39. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_recorder.py +0 -0
  40. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/command_runner.py +0 -0
  41. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/environment_detector.py +0 -0
  42. {domd-2.2.8 → domd-2.2.9}/src/domd/core/command_execution/executor.py +0 -0
  43. {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/__init__.py +0 -0
  44. {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/command.py +0 -0
  45. {domd-2.2.8 → domd-2.2.9}/src/domd/core/commands/executor.py +0 -0
  46. {domd-2.2.8 → domd-2.2.9}/src/domd/core/detector.py +0 -0
  47. {domd-2.2.8 → domd-2.2.9}/src/domd/core/domain/__init__.py +0 -0
  48. {domd-2.2.8 → domd-2.2.9}/src/domd/core/domain/command.py +0 -0
  49. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/__init__.py +0 -0
  50. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_galaxy.py +0 -0
  51. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_inventory.py +0 -0
  52. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_playbook.py +0 -0
  53. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_role.py +0 -0
  54. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/ansible_vault.py +0 -0
  55. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/base.py +0 -0
  56. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/cargo_toml.py +0 -0
  57. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/composer_json.py +0 -0
  58. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/go_mod.py +0 -0
  59. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/makefile.py +0 -0
  60. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/package_json.py +0 -0
  61. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/pyproject_toml.py +0 -0
  62. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsers/tox_ini.py +0 -0
  63. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/__init__.py +0 -0
  64. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/base.py +0 -0
  65. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/file_processor.py +0 -0
  66. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/parser_registry.py +0 -0
  67. {domd-2.2.8 → domd-2.2.9}/src/domd/core/parsing/pattern_matcher.py +0 -0
  68. {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/__init__.py +0 -0
  69. {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/command_executor.py +0 -0
  70. {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/command_repository.py +0 -0
  71. {domd-2.2.8 → domd-2.2.9}/src/domd/core/ports/report_formatter.py +0 -0
  72. {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/__init__.py +0 -0
  73. {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/command_handling.py +0 -0
  74. {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/config_files.py +0 -0
  75. {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/detector.py +0 -0
  76. {domd-2.2.8 → domd-2.2.9}/src/domd/core/project_detection/virtualenv.py +0 -0
  77. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/__init__.py +0 -0
  78. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/base.py +0 -0
  79. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/done_md.py +0 -0
  80. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporters/todo_md.py +0 -0
  81. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/__init__.py +0 -0
  82. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/formatters.py +0 -0
  83. {domd-2.2.8 → domd-2.2.9}/src/domd/core/reporting/reporter.py +0 -0
  84. {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/__init__.py +0 -0
  85. {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/command_service.py +0 -0
  86. {domd-2.2.8 → domd-2.2.9}/src/domd/core/services/report_service.py +0 -0
  87. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/__init__.py +0 -0
  88. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/command_utils.py +0 -0
  89. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/environment.py +0 -0
  90. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/file_utils.py +0 -0
  91. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/logging_utils.py +0 -0
  92. {domd-2.2.8 → domd-2.2.9}/src/domd/core/utils/virtualenv.py +0 -0
  93. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/ansible.py +0 -0
  94. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/base.py +0 -0
  95. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/build_systems.py +0 -0
  96. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/ci_cd.py +0 -0
  97. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/__init__.py +0 -0
  98. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/docker_compose.py +0 -0
  99. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker/dockerfile.py +0 -0
  100. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/docker.py +0 -0
  101. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/javascript/__init__.py +0 -0
  102. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/javascript.py +0 -0
  103. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/package_json.py +0 -0
  104. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/python.py +0 -0
  105. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_build_systems.py +0 -0
  106. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_ci_cd.py +0 -0
  107. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_docker.py +0 -0
  108. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_javascript.py +0 -0
  109. {domd-2.2.8 → domd-2.2.9}/src/domd/parsers/test_python.py +0 -0
  110. {domd-2.2.8 → domd-2.2.9}/src/domd/parsing/__init__.py +0 -0
  111. {domd-2.2.8 → domd-2.2.9}/src/domd/parsing/base.py +0 -0
  112. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/__init__.py +0 -0
  113. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/console.py +0 -0
  114. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/json_reporter.py +0 -0
  115. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_console.py +0 -0
  116. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_json_reporter.py +0 -0
  117. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/test_todo_md.py +0 -0
  118. {domd-2.2.8 → domd-2.2.9}/src/domd/reporters/todo_md.py +0 -0
  119. {domd-2.2.8 → domd-2.2.9}/src/domd/reporting/__init__.py +0 -0
  120. {domd-2.2.8 → domd-2.2.9}/src/domd/utils/__init__.py +0 -0
  121. {domd-2.2.8 → domd-2.2.9}/src/domd/utils/command_runner.py +0 -0
  122. {domd-2.2.8 → domd-2.2.9}/src/domd/utils/file_utils.py +0 -0
  123. {domd-2.2.8 → domd-2.2.9}/src/domd/utils/test_command_runner.py +0 -0
  124. {domd-2.2.8 → domd-2.2.9}/src/domd/utils/test_file_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: domd
3
- Version: 2.2.8
3
+ Version: 2.2.9
4
4
  Summary: Project Command Detector - Automatically detects and tests project commands, generates TODO.md for failed commands
5
5
  License: Apache-2.0
6
6
  Author: Tom Sapletta
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "domd"
3
- version = "2.2.8"
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