mvn-tree-visualizer 1.7.0__tar.gz → 1.8.4__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 (66) hide show
  1. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/workflows/ci.yml +3 -3
  2. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/workflows/release.yml +4 -4
  3. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/CHANGELOG.md +44 -4
  4. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/PKG-INFO +19 -2
  5. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/README.md +17 -0
  6. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/ROADMAP.md +23 -12
  7. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/pyproject.toml +12 -11
  8. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/cli.py +31 -2
  9. mvn_tree_visualizer-1.8.4/src/mvn_tree_visualizer/utils.py +29 -0
  10. mvn_tree_visualizer-1.8.4/tests/README.md +69 -0
  11. mvn_tree_visualizer-1.8.4/tests/cli/README.md +61 -0
  12. mvn_tree_visualizer-1.8.4/tests/cli/__init__.py +1 -0
  13. mvn_tree_visualizer-1.8.4/tests/cli/test_open.py +165 -0
  14. mvn_tree_visualizer-1.8.4/tests/cli/test_quiet.py +162 -0
  15. mvn_tree_visualizer-1.8.4/tests/cli/test_timestamp.py +253 -0
  16. mvn_tree_visualizer-1.7.0/tests/test_cli.py → mvn_tree_visualizer-1.8.4/tests/cli/test_version.py +1 -157
  17. mvn_tree_visualizer-1.8.4/tests/large_diagrams/README.md +63 -0
  18. mvn_tree_visualizer-1.8.4/tests/large_diagrams/__init__.py +1 -0
  19. mvn_tree_visualizer-1.8.4/tests/large_diagrams/test_compatibility.py +41 -0
  20. mvn_tree_visualizer-1.8.4/tests/large_diagrams/test_config.py +48 -0
  21. mvn_tree_visualizer-1.8.4/tests/large_diagrams/test_errors.py +35 -0
  22. mvn_tree_visualizer-1.8.4/tests/large_diagrams/test_navigation.py +88 -0
  23. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/uv.lock +88 -86
  24. mvn_tree_visualizer-1.7.0/tests/test_large_diagram_support.py +0 -199
  25. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/FUNDING.yml +0 -0
  26. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  28. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/ISSUE_TEMPLATE/question.md +0 -0
  29. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  30. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/SECURITY.md +0 -0
  31. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.github/dependabot.yml +0 -0
  32. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.gitignore +0 -0
  33. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/.python-version +0 -0
  34. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/CODE_OF_CONDUCT.md +0 -0
  35. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/CONTRIBUTING.md +0 -0
  36. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/LICENSE +0 -0
  37. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/RELEASE.md +0 -0
  38. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/docs/INTEGRATION.md +0 -0
  39. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/docs/README.md +0 -0
  40. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/docs/THEMES.md +0 -0
  41. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/README.md +0 -0
  42. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/complex-project/diagram-dark.html +0 -0
  43. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/complex-project/diagram-minimal.html +0 -0
  44. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/complex-project/maven_dependency_file +0 -0
  45. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/simple-project/dependencies.json +0 -0
  46. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/simple-project/diagram-dark.html +0 -0
  47. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/simple-project/diagram-minimal.html +0 -0
  48. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/simple-project/maven_dependency_file +0 -0
  49. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/watch-test/README.md +0 -0
  50. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/examples/watch-test/test_maven_file +0 -0
  51. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/ruff.toml +0 -0
  52. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/__init__.py +0 -0
  53. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/__main__.py +0 -0
  54. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/diagram.py +0 -0
  55. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/enhanced_template.py +0 -0
  56. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/exceptions.py +0 -0
  57. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/file_watcher.py +0 -0
  58. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/get_dependencies_in_one_file.py +0 -0
  59. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/outputs/html_output.py +0 -0
  60. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/outputs/json_output.py +0 -0
  61. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/themes.py +0 -0
  62. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/src/mvn_tree_visualizer/validation.py +0 -0
  63. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/tests/test_github_issue_7.py +0 -0
  64. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/tests/test_html_output.py +0 -0
  65. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/tests/test_json_output.py +0 -0
  66. {mvn_tree_visualizer-1.7.0 → mvn_tree_visualizer-1.8.4}/tests/test_watch_mode.py +0 -0
@@ -12,13 +12,13 @@ jobs:
12
12
  python-version: ["3.13"]
13
13
 
14
14
  steps:
15
- - uses: actions/checkout@v4
15
+ - uses: actions/checkout@v6
16
16
 
17
17
  - name: Set up Python
18
- uses: actions/setup-python@v5
18
+ uses: actions/setup-python@v6
19
19
 
20
20
  - name: Install uv
21
- uses: astral-sh/setup-uv@v4
21
+ uses: astral-sh/setup-uv@v7
22
22
  with:
23
23
  version: "latest"
24
24
 
@@ -18,18 +18,18 @@ jobs:
18
18
 
19
19
  steps:
20
20
  - name: Checkout
21
- uses: actions/checkout@v4
21
+ uses: actions/checkout@v6
22
22
  with:
23
23
  fetch-depth: 0
24
24
  token: ${{ secrets.GITHUB_TOKEN }}
25
25
 
26
26
  - name: Set up Python
27
- uses: actions/setup-python@v5
27
+ uses: actions/setup-python@v6
28
28
  with:
29
29
  python-version: '3.13'
30
30
 
31
31
  - name: Install uv
32
- uses: astral-sh/setup-uv@v6
32
+ uses: astral-sh/setup-uv@v7
33
33
 
34
34
  - name: Install dependencies
35
35
  run: |
@@ -37,7 +37,7 @@ jobs:
37
37
 
38
38
  - name: Python Semantic Release
39
39
  id: release
40
- uses: python-semantic-release/python-semantic-release@v10.2.0
40
+ uses: python-semantic-release/python-semantic-release@v10.5.2
41
41
  with:
42
42
  github_token: ${{ secrets.GITHUB_TOKEN }}
43
43
 
@@ -6,13 +6,53 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  <!-- insertion marker -->
9
- ## [v1.6.0](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.6.0) - 2025-07-24
9
+ ## [v1.8.3](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.8.3) - 2025-11-24
10
+
11
+ <small>[Compare with v1.8.2](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.8.2...v1.8.3)</small>
12
+
13
+ ## [v1.8.2](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.8.2) - 2025-11-10
14
+
15
+ <small>[Compare with v1.8.1](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.8.1...v1.8.2)</small>
16
+
17
+ ## [v1.8.1](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.8.1) - 2025-11-10
18
+
19
+ <small>[Compare with v1.8.0](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.8.0...v1.8.1)</small>
20
+
21
+ ## [v1.8.0](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.8.0) - 2025-08-13
22
+
23
+ <small>[Compare with v1.7.0](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.7.0...v1.8.0)</small>
24
+
25
+ ### Features
26
+
27
+ - add --timestamp-output flag to append timestamp to output filenames ([0292ac5](https://github.com/dyka3773/mvn-tree-visualizer/commit/0292ac5209a6b16c281b8146acc32e47264a02a7) by Hercules Konsoulas).
28
+ - add --open flag to automatically open HTML diagrams in browser ([fb5237e](https://github.com/dyka3773/mvn-tree-visualizer/commit/fb5237ee5e3696bd550b08c1d8a4d5b428666b6f) by Hercules Konsoulas).
29
+
30
+ ### Code Refactoring
10
31
 
11
- <small>[Compare with v1.6.0-beta.1](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.6.0-beta.1...v1.6.0)</small>
32
+ - encode URL with proper built-in function ([eed841d](https://github.com/dyka3773/mvn-tree-visualizer/commit/eed841d007f1d2a0b0d6632d8a36b93e4524acc2) by Hercules Konsoulas).
33
+ - restructure test suite into modular architecture ([6d25b7b](https://github.com/dyka3773/mvn-tree-visualizer/commit/6d25b7b1948252615d32ff7076428dc520ed60de) by Hercules Konsoulas).
34
+ - moved timestamp creation to a separate util module for clarity ([cf8d188](https://github.com/dyka3773/mvn-tree-visualizer/commit/cf8d1885b0a4056988dba94496a4ac992af2b693) by Hercules Konsoulas).
12
35
 
13
- ## [v1.6.0-beta.1](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.6.0-beta.1) - 2025-07-24
36
+ ## [v1.7.0](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.7.0) - 2025-08-02
37
+
38
+ <small>[Compare with v1.6.0](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.6.0...v1.7.0)</small>
39
+
40
+ ### Features
41
+
42
+ - add --quiet/-q flag for silent operation ([5dfc82c](https://github.com/dyka3773/mvn-tree-visualizer/commit/5dfc82c57987870ab6200a7ec6682bda3aaf06c7) by Hercules Konsoulas).
43
+ - add --version/-v flag to display current tool version ([6ee3e56](https://github.com/dyka3773/mvn-tree-visualizer/commit/6ee3e56302893aecb5ad87c115ea801acf03b4bc) by Hercules Konsoulas).
44
+
45
+ ### Bug Fixes
46
+
47
+ - CLI test timeouts and file cleanup issues ([3d236d9](https://github.com/dyka3773/mvn-tree-visualizer/commit/3d236d93406e4bcc0a0ee6ea4c6f096ba5c0f861) by Hercules Konsoulas).
48
+
49
+ ### Code Refactoring
50
+
51
+ - correct copilot's mistake for traceback ([d33b5a8](https://github.com/dyka3773/mvn-tree-visualizer/commit/d33b5a847399b34cb101f5650ff98af29e133db1) by Hercules Konsoulas).
52
+
53
+ ## [v1.6.0](https://github.com/dyka3773/mvn-tree-visualizer/releases/tag/v1.6.0) - 2025-07-24
14
54
 
15
- <small>[Compare with v1.5.2](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.5.2...v1.6.0-beta.1)</small>
55
+ <small>[Compare with v1.5.2](https://github.com/dyka3773/mvn-tree-visualizer/compare/v1.5.2...v1.6.0)</small>
16
56
 
17
57
  ### Features
18
58
 
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mvn-tree-visualizer
3
- Version: 1.7.0
3
+ Version: 1.8.4
4
4
  Summary: A simple command line tool to visualize the dependency tree of a Maven project in a graphical format.
5
5
  Project-URL: source, https://github.com/dyka3773/mvn-tree-visualizer
6
6
  Author-email: Iraklis Konsoulas <dyka3773@gmail.com>
7
7
  License-Expression: MIT
8
8
  License-File: LICENSE
9
9
  Keywords: cli,command-line,dependency,graph,maven,mermaid,tool,tree,visualization
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.10
@@ -124,6 +124,21 @@ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" -
124
124
  mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" -q
125
125
  ```
126
126
 
127
+ #### Auto-Open in Browser
128
+ ```bash
129
+ # Automatically open the generated HTML diagram in your default browser
130
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --open
131
+ ```
132
+
133
+ #### Timestamped Output Files
134
+ ```bash
135
+ # Generate files with timestamps (e.g., diagram_20250813_143022.html)
136
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --timestamp-output
137
+
138
+ # Combine with auto-open for immediate viewing
139
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --timestamp-output --open
140
+ ```
141
+
127
142
  > **💡 Tip:** In watch mode, the tool will monitor for changes to your Maven dependency files and automatically regenerate the diagram. Perfect for development workflows! Press `Ctrl+C` to stop watching.
128
143
 
129
144
  ### Step 3: View the output
@@ -156,6 +171,8 @@ Each example includes:
156
171
  | `--directory` | The directory to scan for the Maven dependency file(s) | current directory |
157
172
  | `--keep-tree` | Keep the intermediate `dependency_tree.txt` file | `False` |
158
173
  | `--quiet`, `-q` | Suppress all console output except errors | `False` |
174
+ | `--open` | Automatically open generated HTML files in default browser | `False` |
175
+ | `--timestamp-output` | Add timestamp to output filename (e.g., `diagram-2025-08-13-203045.html`) | `False` |
159
176
  | `--version`, `-v` | Show the current version and exit | - |
160
177
  | `--help` | Show the help message and exit | - |
161
178
 
@@ -101,6 +101,21 @@ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" -
101
101
  mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" -q
102
102
  ```
103
103
 
104
+ #### Auto-Open in Browser
105
+ ```bash
106
+ # Automatically open the generated HTML diagram in your default browser
107
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --open
108
+ ```
109
+
110
+ #### Timestamped Output Files
111
+ ```bash
112
+ # Generate files with timestamps (e.g., diagram_20250813_143022.html)
113
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --timestamp-output
114
+
115
+ # Combine with auto-open for immediate viewing
116
+ mvn-tree-visualizer --filename "maven_dependency_file" --output "diagram.html" --timestamp-output --open
117
+ ```
118
+
104
119
  > **💡 Tip:** In watch mode, the tool will monitor for changes to your Maven dependency files and automatically regenerate the diagram. Perfect for development workflows! Press `Ctrl+C` to stop watching.
105
120
 
106
121
  ### Step 3: View the output
@@ -133,6 +148,8 @@ Each example includes:
133
148
  | `--directory` | The directory to scan for the Maven dependency file(s) | current directory |
134
149
  | `--keep-tree` | Keep the intermediate `dependency_tree.txt` file | `False` |
135
150
  | `--quiet`, `-q` | Suppress all console output except errors | `False` |
151
+ | `--open` | Automatically open generated HTML files in default browser | `False` |
152
+ | `--timestamp-output` | Add timestamp to output filename (e.g., `diagram-2025-08-13-203045.html`) | `False` |
136
153
  | `--version`, `-v` | Show the current version and exit | - |
137
154
  | `--help` | Show the help message and exit | - |
138
155
 
@@ -4,6 +4,28 @@ This document outlines the evolution and future direction of the `mvn-tree-visua
4
4
 
5
5
  ## 🎉 Recently Completed ✅
6
6
 
7
+ ### v1.8.0 - User Experience & Test Architecture Improvements (In Progress)
8
+
9
+ **Focus:** Practical CLI enhancements and improved maintainability
10
+
11
+ **Status:** Ready for Release - August 13, 2025
12
+
13
+ **Completed Features:**
14
+ * [x] **`--open` flag:** Automatically open generated HTML diagrams in default browser
15
+ * Platform-agnostic implementation using Python's `webbrowser` module
16
+ * Intelligent handling: only works with HTML output, graceful error handling
17
+ * Combined functionality with quiet mode and other flags
18
+ * [x] **`--timestamp-output` flag:** Auto-append timestamp to output filenames
19
+ * Format: `diagram_20250813_143022.html` for version tracking
20
+ * Works with both HTML and JSON output formats
21
+ * Perfect for CI/CD and avoiding file overwrites
22
+ * [x] **Comprehensive Test Architecture Refactoring:**
23
+ * Modular test structure: Split monolithic test files into focused modules
24
+ * `tests/cli/` - Individual CLI feature testing (version, quiet, open, timestamp)
25
+ * `tests/large_diagrams/` - Focused large diagram feature testing
26
+ * Single-responsibility principle: Each test file has one clear purpose
27
+ * Improved maintainability and parallel test execution support
28
+
7
29
  ### v1.6.0 - Mistake Release (Released)
8
30
 
9
31
  **Focus:** Enhance automatic documentation generation and prerelease configs
@@ -40,22 +62,11 @@ This document outlines the evolution and future direction of the `mvn-tree-visua
40
62
 
41
63
  **Philosophy:** Small, practical improvements that provide immediate value to users. Features will be selected based on user feedback, development bandwidth, and priority.
42
64
 
43
- #### Essential CLI Features
44
- * [ ] **`--quiet` / `-q` flag:** Suppress all console output except errors
45
- * **Use Case:** Perfect for CI/CD pipelines and scripted usage
46
- * [ ] **`--version` / `-v` flag:** Display the current version of the tool
47
- * **Use Case:** Essential for any CLI tool, currently missing
48
-
49
65
  #### User Experience Enhancements
50
- * [ ] **Alternative output filename patterns:** `--timestamp-output` flag to auto-append timestamp
51
- * **Use Case:** Useful for version tracking (e.g., `diagram-2025-08-01-143022.html`)
52
- * [ ] **`--open` flag:** Automatically open generated diagram in default browser
53
- * **Implementation:** Platform-agnostic using Python's `webbrowser` module
54
66
  * [ ] **Custom title support:** `--title "My Project Dependencies"`
55
67
  * **Use Case:** Personalize diagrams with meaningful project names
56
68
  * [ ] **Progress indicators:** Simple feedback during long operations
57
69
  * **Implementation:** "Parsing dependencies..." → "Generating diagram..." → "Done!"
58
-
59
70
  #### Configuration & Customization
60
71
  * [ ] **Configuration file support:** `.mvnviz.conf` file for default options
61
72
  * **Use Case:** Avoid typing same flags repeatedly, team consistency
@@ -116,4 +127,4 @@ If you're interested in contributing to any of these features, please check out
116
127
 
117
128
  ---
118
129
 
119
- *Last updated: August 1, 2025*
130
+ *Last updated: August 13, 2025*
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mvn-tree-visualizer"
3
- version = "1.7.0"
3
+ version = "1.8.4"
4
4
  authors = [
5
5
  { name = "Iraklis Konsoulas", email = "dyka3773@gmail.com" },
6
6
  ]
@@ -20,7 +20,7 @@ keywords = [
20
20
  "mermaid",
21
21
  ]
22
22
  classifiers = [
23
- "Development Status :: 4 - Beta",
23
+ "Development Status :: 5 - Production/Stable",
24
24
  "Intended Audience :: Developers",
25
25
  "Programming Language :: Python :: 3",
26
26
  "Programming Language :: Python :: 3.10",
@@ -43,12 +43,12 @@ mvn-tree-visualizer = "mvn_tree_visualizer.cli:cli"
43
43
 
44
44
  [dependency-groups]
45
45
  dev = [
46
- "twine>=6.1.0",
47
- "python-semantic-release>=10.2.0",
48
- "build>=1.0.0",
49
- "git-changelog>=2.5.3",
50
- "tox>=4.28.4",
51
- "pytest>=8.4.1",
46
+ "twine>=6.2.0",
47
+ "python-semantic-release>=10.5.2",
48
+ "build>=1.3.0",
49
+ "git-changelog>=2.7.0",
50
+ "tox>=4.32.0",
51
+ "pytest>=9.0.1",
52
52
  ]
53
53
 
54
54
  [build-system]
@@ -71,9 +71,9 @@ match = "master"
71
71
  prerelease = false
72
72
 
73
73
  [tool.semantic_release.commit_parser_options]
74
- allowed_tags = ["build", "chore", "ci", "docs", "feat", "fix", "perf", "style", "refactor", "test"]
74
+ allowed_tags = ["build", "chore", "deps", "ci", "docs", "feat", "fix", "perf", "style", "refactor", "test"]
75
75
  minor_tags = ["feat"]
76
- patch_tags = ["fix", "perf"]
76
+ patch_tags = ["fix", "perf", "deps"]
77
77
 
78
78
  [tool.git-changelog]
79
79
  convention = "conventional"
@@ -89,6 +89,7 @@ sections = [
89
89
  {type = "build", section = "Build System", scopes = []},
90
90
  {type = "test", section = "Tests", scopes = []},
91
91
  {type = "style", section = "Style", scopes = []},
92
+ {type = "deps", section = "Dependencies", scopes = []},
92
93
  ]
93
94
 
94
95
  [tool.tox]
@@ -97,7 +98,7 @@ env_list = ["lint", "3.10", "3.11", "3.12", "3.13"]
97
98
  [tool.tox.env_run_base]
98
99
  description = "Run tests with the current Python version"
99
100
  deps = [
100
- "pytest>=8.3.2",
101
+ "pytest>=9.0.1",
101
102
  ]
102
103
  commands = [[ "pytest", "-v" ]]
103
104
 
@@ -2,6 +2,7 @@ import argparse
2
2
  import sys
3
3
  import time
4
4
  import traceback
5
+ import webbrowser
5
6
  from importlib import metadata
6
7
  from pathlib import Path
7
8
  from typing import NoReturn
@@ -12,6 +13,7 @@ from .file_watcher import FileWatcher
12
13
  from .get_dependencies_in_one_file import merge_files
13
14
  from .outputs.html_output import create_html_diagram
14
15
  from .outputs.json_output import create_json_output
16
+ from .utils import add_timestamp_to_filename
15
17
  from .validation import find_dependency_files, validate_dependency_files, validate_output_directory
16
18
 
17
19
 
@@ -32,6 +34,7 @@ def generate_diagram(
32
34
  show_versions: bool,
33
35
  theme: str = "minimal",
34
36
  quiet: bool = False,
37
+ open_browser: bool = False,
35
38
  ) -> None:
36
39
  """Generate the dependency diagram with comprehensive error handling."""
37
40
  timestamp = time.strftime("%H:%M:%S")
@@ -118,6 +121,14 @@ def generate_diagram(
118
121
  if not quiet:
119
122
  print(f"[{timestamp}] SUCCESS: Diagram generated and saved to {output_file}")
120
123
 
124
+ # Open in browser if requested and format is HTML
125
+ if open_browser and output_format == "html" and not quiet:
126
+ try:
127
+ webbrowser.open(Path(output_file).resolve().as_uri())
128
+ print(f"[{timestamp}] Opening diagram in your default browser...")
129
+ except Exception as e:
130
+ print(f"[{timestamp}] WARNING: Could not open browser: {e}", file=sys.stderr)
131
+
121
132
  except MvnTreeVisualizerError as e:
122
133
  # Our custom errors already have helpful messages
123
134
  print(f"[{timestamp}] ERROR: {e}", file=sys.stderr)
@@ -216,6 +227,18 @@ def cli() -> NoReturn:
216
227
  help="Suppress all console output except errors. Perfect for CI/CD pipelines and scripted usage.",
217
228
  )
218
229
 
230
+ parser.add_argument(
231
+ "--open",
232
+ action="store_true",
233
+ help="Automatically open the generated HTML diagram in your default browser. Only works with HTML output format.",
234
+ )
235
+
236
+ parser.add_argument(
237
+ "--timestamp-output",
238
+ action="store_true",
239
+ help="Append timestamp to output filename (e.g., diagram-2025-08-13-203045.html). Useful for version tracking and CI/CD.",
240
+ )
241
+
219
242
  args = parser.parse_args()
220
243
  directory: str = args.directory
221
244
  output_file: str = args.output
@@ -226,6 +249,12 @@ def cli() -> NoReturn:
226
249
  watch_mode: bool = args.watch
227
250
  theme: str = args.theme
228
251
  quiet: bool = args.quiet
252
+ open_browser: bool = args.open
253
+ timestamp_output: bool = args.timestamp_output
254
+
255
+ # Apply timestamp to output filename if requested
256
+ if timestamp_output:
257
+ output_file = add_timestamp_to_filename(output_file)
229
258
 
230
259
  # Generate initial diagram
231
260
  if not quiet:
@@ -233,7 +262,7 @@ def cli() -> NoReturn:
233
262
  print(f"[{timestamp}] Generating initial diagram...")
234
263
 
235
264
  try:
236
- generate_diagram(directory, output_file, filename, keep_tree, output_format, show_versions, theme, quiet)
265
+ generate_diagram(directory, output_file, filename, keep_tree, output_format, show_versions, theme, quiet, open_browser)
237
266
  except MvnTreeVisualizerError:
238
267
  sys.exit(1)
239
268
  except KeyboardInterrupt:
@@ -251,7 +280,7 @@ def cli() -> NoReturn:
251
280
  def regenerate_callback():
252
281
  """Callback function for file watcher."""
253
282
  try:
254
- generate_diagram(directory, output_file, filename, keep_tree, output_format, show_versions, theme, quiet)
283
+ generate_diagram(directory, output_file, filename, keep_tree, output_format, show_versions, theme, quiet, open_browser)
255
284
  except Exception:
256
285
  # In watch mode, we don't want to exit on errors, just log them
257
286
  print("Error during diagram regeneration:", file=sys.stderr)
@@ -0,0 +1,29 @@
1
+ import time
2
+ from pathlib import Path
3
+
4
+
5
+ def add_timestamp_to_filename(filename: str) -> str:
6
+ """Add timestamp to filename before the extension.
7
+
8
+ Args:
9
+ filename: Original filename (e.g., 'diagram.html', 'output.json', 'folder/diagram.html')
10
+
11
+ Returns:
12
+ Timestamped filename (e.g., 'diagram-2025-08-13-203045.html')
13
+ """
14
+ timestamp = time.strftime("%Y-%m-%d-%H%M%S")
15
+ path = Path(filename)
16
+
17
+ # Handle paths by preserving directory and only modifying the filename
18
+ if path.parent != Path("."):
19
+ # Has a directory component
20
+ directory = path.parent
21
+ stem = path.stem
22
+ suffix = path.suffix
23
+ timestamped_name = f"{stem}-{timestamp}{suffix}"
24
+ return str(directory / timestamped_name)
25
+ else:
26
+ # No directory component
27
+ stem = path.stem
28
+ suffix = path.suffix
29
+ return f"{stem}-{timestamp}{suffix}"
@@ -0,0 +1,69 @@
1
+ # Test Structure Documentation
2
+
3
+ ## Overview
4
+ This document describes the organization and structure of our test suite, which has been refactored to follow single-responsibility principles and improve maintainability.
5
+
6
+ ## Test Organization
7
+
8
+ ### Modular Test Structure
9
+ We have moved away from monolithic test files containing multiple test classes to focused, single-purpose modules:
10
+
11
+ #### CLI Tests (`tests/cli/`)
12
+ - **`test_version.py`** - Version flag functionality (`--version`, `-v`)
13
+ - **`test_quiet.py`** - Quiet mode functionality (`--quiet`, `-q`)
14
+ - **`test_open.py`** - Auto-open browser functionality (`--open`)
15
+ - **`test_timestamp.py`** - Timestamp output functionality (`--timestamp-output`)
16
+
17
+ Each CLI test module contains a single test class focused on one specific CLI feature.
18
+
19
+ #### Large Diagram Tests (`tests/large_diagrams/`)
20
+ - **`test_config.py`** - Mermaid configuration for large diagrams
21
+ - **`test_navigation.py`** - Enhanced navigation controls and zoom features
22
+ - **`test_compatibility.py`** - Backward compatibility testing
23
+ - **`test_errors.py`** - Error handling scenarios
24
+
25
+ Each large diagram test module contains a single test class focused on one aspect of large diagram support.
26
+
27
+ ### Standalone Test Files
28
+ - **`test_github_issue_7.py`** - Specific GitHub issue #7 fix testing (single class)
29
+ - **`test_html_output.py`** - HTML output generation testing (function-based tests)
30
+ - **`test_json_output.py`** - JSON output generation testing (function-based tests)
31
+ - **`test_watch_mode.py`** - File watching mode testing (function-based tests)
32
+
33
+ ## Benefits of Current Structure
34
+
35
+ 1. **Single Responsibility**: Each test file has a clear, focused purpose
36
+ 2. **Maintainability**: Changes to one feature don't affect tests for other features
37
+ 3. **Readability**: Easier to find and understand tests for specific functionality
38
+ 4. **Parallel Testing**: Better support for parallel test execution
39
+ 5. **Modularity**: Easy to add new feature tests without modifying existing files
40
+
41
+ ## Test Execution
42
+
43
+ ### Run All Tests
44
+ ```bash
45
+ python -m pytest tests/ -v
46
+ ```
47
+
48
+ ### Run Specific Module Tests
49
+ ```bash
50
+ # CLI functionality tests
51
+ python -m pytest tests/cli/ -v
52
+
53
+ # Large diagram tests
54
+ python -m pytest tests/large_diagrams/ -v
55
+
56
+ # Specific feature tests
57
+ python -m pytest tests/cli/test_open.py -v
58
+ ```
59
+
60
+ ## Test Count Summary
61
+ - **CLI Tests**: 23 tests across 4 modules
62
+ - **Large Diagram Tests**: 14 tests across 4 modules
63
+ - **Other Tests**: 31 tests in standalone modules
64
+ - **Total**: 68 tests
65
+
66
+ ## Refactoring History
67
+ - **Before**: Monolithic files with multiple test classes (e.g., `test_cli.py` with 4 classes)
68
+ - **After**: Focused modules with single test classes or related functions
69
+ - **Result**: Improved maintainability and clearer test organization
@@ -0,0 +1,61 @@
1
+ # CLI Tests
2
+
3
+ This directory contains modular tests for CLI functionality. Each file focuses on a specific CLI feature or flag, making tests easier to maintain and understand.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ tests/cli/
9
+ ├── __init__.py # Package initialization
10
+ ├── test_version.py # Tests for --version/-v flag
11
+ ├── test_quiet.py # Tests for --quiet/-q flag
12
+ ├── test_open.py # Tests for --open flag
13
+ └── test_timestamp.py # Tests for --timestamp-output flag
14
+ ```
15
+
16
+ ## Test Organization
17
+
18
+ ### `test_version.py`
19
+ - Tests version string formatting and validation
20
+ - Tests both `--version` and `-v` flags
21
+ - Tests version precedence over other arguments
22
+ - Tests edge cases like package not found
23
+
24
+ ### `test_quiet.py`
25
+ - Tests output suppression with `--quiet`/`-q` flags
26
+ - Tests that errors still show in quiet mode
27
+ - Tests normal vs quiet behavior comparison
28
+
29
+ ### `test_open.py`
30
+ - Tests automatic browser opening with `--open` flag
31
+ - Tests HTML vs JSON format behavior
32
+ - Tests quiet mode interaction
33
+ - Tests error handling for browser failures
34
+
35
+ ### `test_timestamp.py`
36
+ - Tests timestamp filename generation with `--timestamp-output`
37
+ - Tests format consistency and path handling
38
+ - Tests interaction with other flags
39
+ - Tests both HTML and JSON output formats
40
+
41
+ ## Benefits of This Structure
42
+
43
+ 1. **Single Responsibility**: Each file tests one specific feature
44
+ 2. **Easy Navigation**: Developers can quickly find tests for a specific flag
45
+ 3. **Maintainable**: Changes to one feature don't affect other test files
46
+ 4. **Modular**: Can run tests for specific features independently
47
+ 5. **Clear Naming**: File names clearly indicate what functionality is tested
48
+
49
+ ## Running Tests
50
+
51
+ ```bash
52
+ # Run all CLI tests
53
+ pytest tests/cli/ -v
54
+
55
+ # Run specific feature tests
56
+ pytest tests/cli/test_version.py -v
57
+ pytest tests/cli/test_open.py -v
58
+
59
+ # Run specific test class
60
+ pytest tests/cli/test_version.py::TestVersionFlag -v
61
+ ```
@@ -0,0 +1 @@
1
+ """CLI tests package."""