robotframework-roboview 0.0.2__tar.gz → 0.0.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 (67) hide show
  1. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/PKG-INFO +23 -27
  2. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/README.md +11 -11
  3. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/pyproject.toml +18 -17
  4. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/main.py +1 -1
  5. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/robot_parsing/called_keyword_parsing.py +20 -0
  6. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/registries/file_registry.py +1 -1
  7. robotframework_roboview-0.0.4/roboview/schemas/domain/common.py +42 -0
  8. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/keyword_register_service.py +57 -12
  9. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/keyword_similarity_service.py +74 -12
  10. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/keyword_usage_service.py +1 -1
  11. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/robocop_register_service.py +7 -4
  12. robotframework_roboview-0.0.2/roboview/schemas/domain/common.py +0 -26
  13. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/LICENSE.txt +0 -0
  14. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/__init__.py +0 -0
  15. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/__init__.py +0 -0
  16. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/__init__.py +0 -0
  17. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/files/__init__.py +0 -0
  18. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/files/all_files.py +0 -0
  19. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/files/resource_files.py +0 -0
  20. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/files/robot_files.py +0 -0
  21. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/__init__.py +0 -0
  22. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keyword_duplicates.py +0 -0
  23. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keyword_similarity.py +0 -0
  24. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keyword_usage_resource.py +0 -0
  25. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keyword_usage_robot.py +0 -0
  26. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keywords_called.py +0 -0
  27. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keywords_initialized.py +0 -0
  28. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keywords_wo_documentation.py +0 -0
  29. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/keyword_usage/keywords_wo_usages.py +0 -0
  30. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/overview/__init__.py +0 -0
  31. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/overview/kpis.py +0 -0
  32. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/overview/most_used_keywords.py +0 -0
  33. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/overview/robocop_summary.py +0 -0
  34. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/robocop/__init__.py +0 -0
  35. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/robocop/robocop_message.py +0 -0
  36. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/robocop/robocop_messages.py +0 -0
  37. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/system/__init__.py +0 -0
  38. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/system/health.py +0 -0
  39. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/api/endpoints/system/initialize.py +0 -0
  40. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/core/__init__.py +0 -0
  41. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/core/config.py +0 -0
  42. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/core/logging.py +0 -0
  43. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/__init__.py +0 -0
  44. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/robot_parsing/__init__.py +0 -0
  45. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/robot_parsing/keyword_dependency_parsing.py +0 -0
  46. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/robot_parsing/local_keyword_parsing.py +0 -0
  47. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/models/robot_parsing/resource_dependency_parsing.py +0 -0
  48. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/registries/__init__.py +0 -0
  49. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/registries/keyword_registry.py +0 -0
  50. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/registries/robocop_registry.py +0 -0
  51. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/__init__.py +0 -0
  52. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/domain/__init__.py +0 -0
  53. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/domain/files.py +0 -0
  54. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/domain/keywords.py +0 -0
  55. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/domain/robocop.py +0 -0
  56. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/__init__.py +0 -0
  57. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/common.py +0 -0
  58. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/files.py +0 -0
  59. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/keyword_similarity.py +0 -0
  60. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/keyword_usage.py +0 -0
  61. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/overview.py +0 -0
  62. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/schemas/dtos/robocop.py +0 -0
  63. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/__init__.py +0 -0
  64. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/file_register_service.py +0 -0
  65. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/services/robocop_service.py +0 -0
  66. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/utils/__init__.py +0 -0
  67. {robotframework_roboview-0.0.2 → robotframework_roboview-0.0.4}/roboview/utils/directory_parsing.py +0 -0
@@ -1,33 +1,29 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robotframework-roboview
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: RoboView is a Visual Studio Code extension designed to help you manage keywords within your Robot Framework projects and improve overall test quality through built-in Robocop integration. Its primary goal is to provide a comprehensive overview of all keywords and their relationships, making it easier to understand and maintain your test automation codebase.
5
5
  License: Apache 2.0
6
6
  License-File: LICENSE.txt
7
7
  Author: viadee Unternehmensberatung AG
8
- Requires-Python: >=3.10,<3.14
8
+ Requires-Python: >=3.10,<3.15
9
9
  Classifier: License :: Other/Proprietary License
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
15
16
  Requires-Dist: coloredlogs (>=15.0.1,<16.0.0)
16
- Requires-Dist: fastapi (>=0.115.8,<0.116.0)
17
+ Requires-Dist: fastapi (>=0.135.1,<0.136.0)
17
18
  Requires-Dist: httpx (>=0.28.1,<0.29.0)
18
- Requires-Dist: numpy (>=2.2.4,<3.0.0)
19
- Requires-Dist: pydantic (>=2.11.4,<3.0.0)
20
- Requires-Dist: pydantic-settings (>=2.12.0,<3.0.0)
21
- Requires-Dist: pygments (>=2.19.1,<3.0.0)
22
- Requires-Dist: robotframework (>=7.2.2,<8.0.0)
23
- Requires-Dist: robotframework-browser (>=19.12.4,<20.0.0)
24
- Requires-Dist: robotframework-crypto (>=0.4.2,<0.5.0)
25
- Requires-Dist: robotframework-databaselibrary (>=2.4.1,<3.0.0)
26
- Requires-Dist: robotframework-robocop (>=7.2.0,<8.0.0)
27
- Requires-Dist: robotframework-seleniumlibrary (>=6.8.0,<7.0.0)
28
- Requires-Dist: scikit-learn (>=1.6.1,<2.0.0)
29
- Requires-Dist: starlette (>=0.46.0,<0.47.0)
30
- Requires-Dist: uvicorn (>=0.34.0,<0.35.0)
19
+ Requires-Dist: pydantic (>=2.12.5,<3.0.0)
20
+ Requires-Dist: pydantic-settings (>=2.13.1,<3.0.0)
21
+ Requires-Dist: pygments (>=2.19.2,<3.0.0)
22
+ Requires-Dist: robotframework (>=7.4.1,<8.0.0)
23
+ Requires-Dist: robotframework-robocop (>=8.2.2,<9.0.0)
24
+ Requires-Dist: starlette (>=0.52.1,<0.53.0)
25
+ Requires-Dist: typer (>=0.24.1,<0.25.0)
26
+ Requires-Dist: uvicorn (>=0.41.0,<0.42.0)
31
27
  Description-Content-Type: text/markdown
32
28
 
33
29
  # RoboView - Keyword Management in Robot Framework
@@ -41,7 +37,7 @@ RoboView is a Visual Studio Code extension designed to help you manage keywords
41
37
 
42
38
  ---
43
39
 
44
- <h2 style="border-bottom: none; margin-bottom: 1em;">✨ Key Features</h2>
40
+ ## Key Features
45
41
 
46
42
  - 🗂️ **Workspace:** Automatically selects your current workspace project and generates comprehensive overviews.
47
43
  - 📈 **Dashboard:** Get key performance indicators and a general overview of your robot framework project.
@@ -55,7 +51,7 @@ RoboView is a Visual Studio Code extension designed to help you manage keywords
55
51
 
56
52
  ---
57
53
 
58
- <h2 style="border-bottom: none; margin-bottom: 1em;">⚙️ Installation Guide</h2>
54
+ ## ⚙️ Installation Guide
59
55
 
60
56
  RoboView consists of two parts: a **backend** (Python package) and a **frontend** (Visual Studio Code extension).
61
57
 
@@ -77,7 +73,7 @@ The Frontend is available as a Visual Studio Code extension on the Marketplace
77
73
 
78
74
  ---
79
75
 
80
- <h2 style="border-bottom: none; margin-bottom: 1em;">🛠️ GitHub</h2>
76
+ ## 🛠️ GitHub
81
77
 
82
78
  You can find the RoboView source code and issue tracker on GitHub:
83
79
 
@@ -85,7 +81,7 @@ You can find the RoboView source code and issue tracker on GitHub:
85
81
 
86
82
  ---
87
83
 
88
- <h2 style="border-bottom: none; margin-bottom: 1em;">📝 Notes and Recommendations</h2>
84
+ ## 📝 Notes and Recommendations
89
85
 
90
86
  - For Robocop to automatically detect your configuration, name the file **`robocop.toml`**, **`robot.toml`** or integrate in **`pyproject.toml`**.
91
87
  If you cannot change the filename in your project, you can instead set the environment variable **`ROBOCOP_CONFIG_PATH`** to the full path of your config file.
@@ -94,12 +90,12 @@ You can find the RoboView source code and issue tracker on GitHub:
94
90
 
95
91
  ---
96
92
 
97
- <h2 style="border-bottom: none; margin-bottom: 1em;">🔍 How to navigate RoboView</h2>
93
+ ## 🔍 How to navigate RoboView
98
94
 
99
95
  In the following three sections, we will dive deeper into how to navigate RoboView: where to find the features and understand the terminology we use. We start with the dashboard, then look at the keyword usage overview, and finally the Robocop integration.
100
96
  You can switch between these views using the buttons in the top-right corner of RoboView: <code>Dashboard</code>, <code>Keyword Usage</code>, and <code>Robocop</code>.
101
97
 
102
- <h3 style="border-bottom: none; margin-bottom: 1em;">📋 1) Dashboard</h3>
98
+ ## 📋 1) Dashboard
103
99
 
104
100
  The **Dashboard** gives you a high‑level overview of the selected Robot Framework project and its overall health.
105
101
 
@@ -130,7 +126,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
130
126
  - **Robot Framework Files**: Total number of `.robot` and `.resource` files that were analyzed. Use the dashboard to quickly spot problematic areas (e.g. many unused keywords, low documentation coverage, or a high number of Robocop issues) and decide where to focus your refactoring or cleanup efforts first.
131
127
 
132
128
 
133
- <h3 style="border-bottom: none; margin-bottom: 1em;">🌳 2) Keyword Overview</h3>
129
+ ## 🌳 2) Keyword Overview
134
130
 
135
131
  <p align="center" style="margin-bottom: 0.5em;">
136
132
  <strong>Keyword Overview Layout</strong>
@@ -145,7 +141,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
145
141
 
146
142
  <br>
147
143
 
148
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">⬅️ Left Side – Navigation &amp; Filters</h4>
144
+ ### ⬅️ Left Side – Navigation &amp; Filters
149
145
 
150
146
  - <strong>File Selection:</strong> At the top, a dropdown lets you select a file. The current VS Code workspace is used as root, and all
151
147
  <code>.robot</code> and <code>.resource</code> files are available.
@@ -160,7 +156,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
160
156
 
161
157
  <br>
162
158
 
163
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">📊 Middle – Keyword List</h4>
159
+ ### 📊 Middle – Keyword List
164
160
 
165
161
  The middle section lists all keywords found in the selected file and shows key information about each of them:
166
162
 
@@ -173,7 +169,7 @@ The middle section lists all keywords found in the selected file and shows key i
173
169
 
174
170
  <br>
175
171
 
176
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">➡️ Right Side – Keyword Details</h4>
172
+ ### ➡️ Right Side – Keyword Details
177
173
 
178
174
  When you select a keyword (by clicking a row in the middle table), the right panel shows detailed information:
179
175
 
@@ -231,7 +227,7 @@ The **Robocop** view integrates the `https://robocop.readthedocs.io/` linter dir
231
227
 
232
228
  ---
233
229
 
234
- <h2 style="border-bottom: none; margin-bottom: 1em;">🔮 Outlook</h2>
230
+ ## 🔮 Outlook
235
231
 
236
232
  RoboView is an actively evolving project. ✨
237
233
  We’re continuously adding new features, polishing existing workflows, and exploring fresh ideas to make working with Robot Framework even more enjoyable. 💡
@@ -9,7 +9,7 @@ RoboView is a Visual Studio Code extension designed to help you manage keywords
9
9
 
10
10
  ---
11
11
 
12
- <h2 style="border-bottom: none; margin-bottom: 1em;">✨ Key Features</h2>
12
+ ## Key Features
13
13
 
14
14
  - 🗂️ **Workspace:** Automatically selects your current workspace project and generates comprehensive overviews.
15
15
  - 📈 **Dashboard:** Get key performance indicators and a general overview of your robot framework project.
@@ -23,7 +23,7 @@ RoboView is a Visual Studio Code extension designed to help you manage keywords
23
23
 
24
24
  ---
25
25
 
26
- <h2 style="border-bottom: none; margin-bottom: 1em;">⚙️ Installation Guide</h2>
26
+ ## ⚙️ Installation Guide
27
27
 
28
28
  RoboView consists of two parts: a **backend** (Python package) and a **frontend** (Visual Studio Code extension).
29
29
 
@@ -45,7 +45,7 @@ The Frontend is available as a Visual Studio Code extension on the Marketplace
45
45
 
46
46
  ---
47
47
 
48
- <h2 style="border-bottom: none; margin-bottom: 1em;">🛠️ GitHub</h2>
48
+ ## 🛠️ GitHub
49
49
 
50
50
  You can find the RoboView source code and issue tracker on GitHub:
51
51
 
@@ -53,7 +53,7 @@ You can find the RoboView source code and issue tracker on GitHub:
53
53
 
54
54
  ---
55
55
 
56
- <h2 style="border-bottom: none; margin-bottom: 1em;">📝 Notes and Recommendations</h2>
56
+ ## 📝 Notes and Recommendations
57
57
 
58
58
  - For Robocop to automatically detect your configuration, name the file **`robocop.toml`**, **`robot.toml`** or integrate in **`pyproject.toml`**.
59
59
  If you cannot change the filename in your project, you can instead set the environment variable **`ROBOCOP_CONFIG_PATH`** to the full path of your config file.
@@ -62,12 +62,12 @@ You can find the RoboView source code and issue tracker on GitHub:
62
62
 
63
63
  ---
64
64
 
65
- <h2 style="border-bottom: none; margin-bottom: 1em;">🔍 How to navigate RoboView</h2>
65
+ ## 🔍 How to navigate RoboView
66
66
 
67
67
  In the following three sections, we will dive deeper into how to navigate RoboView: where to find the features and understand the terminology we use. We start with the dashboard, then look at the keyword usage overview, and finally the Robocop integration.
68
68
  You can switch between these views using the buttons in the top-right corner of RoboView: <code>Dashboard</code>, <code>Keyword Usage</code>, and <code>Robocop</code>.
69
69
 
70
- <h3 style="border-bottom: none; margin-bottom: 1em;">📋 1) Dashboard</h3>
70
+ ## 📋 1) Dashboard
71
71
 
72
72
  The **Dashboard** gives you a high‑level overview of the selected Robot Framework project and its overall health.
73
73
 
@@ -98,7 +98,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
98
98
  - **Robot Framework Files**: Total number of `.robot` and `.resource` files that were analyzed. Use the dashboard to quickly spot problematic areas (e.g. many unused keywords, low documentation coverage, or a high number of Robocop issues) and decide where to focus your refactoring or cleanup efforts first.
99
99
 
100
100
 
101
- <h3 style="border-bottom: none; margin-bottom: 1em;">🌳 2) Keyword Overview</h3>
101
+ ## 🌳 2) Keyword Overview
102
102
 
103
103
  <p align="center" style="margin-bottom: 0.5em;">
104
104
  <strong>Keyword Overview Layout</strong>
@@ -113,7 +113,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
113
113
 
114
114
  <br>
115
115
 
116
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">⬅️ Left Side – Navigation &amp; Filters</h4>
116
+ ### ⬅️ Left Side – Navigation &amp; Filters
117
117
 
118
118
  - <strong>File Selection:</strong> At the top, a dropdown lets you select a file. The current VS Code workspace is used as root, and all
119
119
  <code>.robot</code> and <code>.resource</code> files are available.
@@ -128,7 +128,7 @@ The **KPIs** section summarizes the most important metrics of your test suite:
128
128
 
129
129
  <br>
130
130
 
131
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">📊 Middle – Keyword List</h4>
131
+ ### 📊 Middle – Keyword List
132
132
 
133
133
  The middle section lists all keywords found in the selected file and shows key information about each of them:
134
134
 
@@ -141,7 +141,7 @@ The middle section lists all keywords found in the selected file and shows key i
141
141
 
142
142
  <br>
143
143
 
144
- <h4 style="border-bottom: none; margin-bottom: 0.5em;">➡️ Right Side – Keyword Details</h4>
144
+ ### ➡️ Right Side – Keyword Details
145
145
 
146
146
  When you select a keyword (by clicking a row in the middle table), the right panel shows detailed information:
147
147
 
@@ -199,7 +199,7 @@ The **Robocop** view integrates the `https://robocop.readthedocs.io/` linter dir
199
199
 
200
200
  ---
201
201
 
202
- <h2 style="border-bottom: none; margin-bottom: 1em;">🔮 Outlook</h2>
202
+ ## 🔮 Outlook
203
203
 
204
204
  RoboView is an actively evolving project. ✨
205
205
  We’re continuously adding new features, polishing existing workflows, and exploring fresh ideas to make working with Robot Framework even more enjoyable. 💡
@@ -1,38 +1,39 @@
1
1
  [tool.poetry]
2
2
  name = "robotframework-roboview"
3
- version = "0.0.2"
3
+ version = "0.0.4"
4
4
  description = "RoboView is a Visual Studio Code extension designed to help you manage keywords within your Robot Framework projects and improve overall test quality through built-in Robocop integration. Its primary goal is to provide a comprehensive overview of all keywords and their relationships, making it easier to understand and maintain your test automation codebase."
5
5
  license = "Apache 2.0"
6
6
  authors = ["viadee Unternehmensberatung AG"]
7
7
  readme = "README.md"
8
8
 
9
9
  packages = [
10
- { include = "roboview" }
10
+ { include = "roboview" }
11
11
  ]
12
12
 
13
13
  [tool.poetry.dependencies]
14
- python = ">=3.10,<3.14"
15
- robotframework = "^7.2.2"
16
- fastapi = "^0.115.8"
17
- uvicorn = "^0.34.0"
18
- pygments = "^2.19.1"
19
- scikit-learn = "^1.6.1"
20
- numpy = "^2.2.4"
21
- pydantic = "^2.11.4"
22
- starlette = "^0.46.0"
23
- pydantic-settings = "^2.12.0"
14
+ python = ">=3.10,<3.15"
15
+ robotframework = "^7.4.1"
16
+ fastapi = "^0.135.1"
17
+ uvicorn = "^0.41.0"
18
+ pygments = "^2.19.2"
19
+ pydantic = "^2.12.5"
20
+ starlette = "^0.52.1"
21
+ pydantic-settings = "^2.13.1"
24
22
  coloredlogs = "^15.0.1"
25
- robotframework-robocop = "^7.2.0"
23
+ robotframework-robocop = "^8.2.2"
26
24
  httpx = "^0.28.1"
27
- robotframework-browser = "^19.12.4"
28
- robotframework-databaselibrary = "^2.4.1"
29
- robotframework-crypto = "^0.4.2"
30
- robotframework-seleniumlibrary = "^6.8.0"
25
+ typer = "^0.24.1"
31
26
 
32
27
  [tool.poetry.group.dev.dependencies]
33
28
  pyright = "^1.1.408"
34
29
  pytest = "^9.0.2"
35
30
  deptry = "^0.24.0"
31
+ robotframework-browser = "^19.12.5"
32
+ robotframework-databaselibrary = "^2.4.1"
33
+ robotframework-crypto = "^0.4.2"
34
+ robotframework-seleniumlibrary = "^6.8.0"
35
+ robotframework-appiumlibrary = "^3.2.1"
36
+ robotframework-requests = "^0.9.7"
36
37
 
37
38
  [build-system]
38
39
  requires = ["poetry-core"]
@@ -73,6 +73,6 @@ if __name__ == "__main__":
73
73
  uvicorn.run(
74
74
  app,
75
75
  host="127.0.0.1",
76
- port=8000,
76
+ port=18123,
77
77
  log_level=settings.LOG_LEVEL.lower(),
78
78
  )
@@ -8,6 +8,8 @@ from robot.api.parsing import (
8
8
  from robot.parsing.model.statements import (
9
9
  KeywordCall,
10
10
  Setup,
11
+ SuiteSetup,
12
+ SuiteTeardown,
11
13
  Teardown,
12
14
  TestSetup,
13
15
  TestTeardown,
@@ -51,6 +53,24 @@ class CalledKeywordFinder(ModelVisitor):
51
53
  """
52
54
  self._add_keyword(node.keyword)
53
55
 
56
+ def visit_SuiteSetup(self, node: SuiteSetup) -> None: # noqa: N802
57
+ """Visit a SuiteSetup node and extract the keyword.
58
+
59
+ Arguments:
60
+ node (SuiteSetup): SuiteSetup node in the AST.
61
+
62
+ """
63
+ self._add_keyword(node.name)
64
+
65
+ def visit_SuiteTeardown(self, node: SuiteTeardown) -> None: # noqa: N802
66
+ """Visit a SuiteTeardown node and extract the keyword.
67
+
68
+ Arguments:
69
+ node (SuiteTeardown): SuiteTeardown node in the AST.
70
+
71
+ """
72
+ self._add_keyword(node.name)
73
+
54
74
  def visit_Setup(self, node: Setup) -> None: # noqa: N802
55
75
  """Visit a Setup node and extract the keyword.
56
76
 
@@ -30,7 +30,7 @@ class FileRegistry:
30
30
 
31
31
  """
32
32
  try:
33
- self._file_registry[file.file_name] = file
33
+ self._file_registry[file.path] = file
34
34
 
35
35
  except Exception:
36
36
  logger.exception("Failed to register file: %s", file.path)
@@ -0,0 +1,42 @@
1
+ """Common domain schemas for pydantic validation."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class ExternalLibraryType(Enum):
7
+ """Supported external Robot Framework libraries."""
8
+
9
+ BROWSER = "Browser"
10
+ SELENIUM = "SeleniumLibrary"
11
+ DATABASE = "DatabaseLibrary"
12
+ APPIUM = "AppiumLibrary"
13
+ REQUESTS = "RequestsLibrary"
14
+
15
+
16
+ class BuiltinLibraryType(Enum):
17
+ """Supported Robot Framework BuiltIn libraries."""
18
+
19
+ BUILTIN = "BuiltIn"
20
+ COLLECTIONS = "Collections"
21
+ DATETIME = "DateTime"
22
+ DIALOGS = "Dialogs"
23
+ OPERATINGSYSTEM = "OperatingSystem"
24
+ PROCESS = "Process"
25
+ SCREENSHOT = "Screenshot"
26
+ STRING = "String"
27
+ TELNET = "Telnet"
28
+ XML = "XML"
29
+
30
+
31
+ class FileType(Enum):
32
+ """Supported Robot Framework files."""
33
+
34
+ ROBOT = "robot"
35
+ RESOURCE = "resource"
36
+
37
+
38
+ class KeywordType(Enum):
39
+ """Supported Robot Framework keyword types."""
40
+
41
+ INITIALIZED = "initialized"
42
+ CALLED = "called"
@@ -3,12 +3,13 @@
3
3
  import logging
4
4
  from pathlib import Path
5
5
 
6
+ from robot.errors import DataError
6
7
  from robot.libdocpkg import LibraryDocumentation
7
8
  from robot.parsing import get_model, get_resource_model
8
9
  from roboview.models.robot_parsing.keyword_dependency_parsing import KeywordDependencyFinder
9
10
  from roboview.models.robot_parsing.local_keyword_parsing import LocalKeywordFinder
10
11
  from roboview.registries.keyword_registry import KeywordRegistry
11
- from roboview.schemas.domain.common import FileType, LibraryType
12
+ from roboview.schemas.domain.common import BuiltinLibraryType, ExternalLibraryType, FileType
12
13
  from roboview.schemas.domain.keywords import KeywordProperties
13
14
  from roboview.utils.directory_parsing import DirectoryParser
14
15
 
@@ -45,16 +46,33 @@ class KeywordRegistryService:
45
46
 
46
47
  This method:
47
48
  1. Loads local keywords from .robot and .resource files
48
- 2. Loads external library keywords (Browser, Selenium, Database, BuiltIn)
49
- 3. Populates the KeywordRegistry with all discovered keywords
49
+ 2. Loads built-in library keywords (BuiltIn, Collections, DateTime, etc.)
50
+ 3. Loads external library keywords (Browser, Selenium, Database, Appium, Requests) if installed
51
+ 4. Populates the KeywordRegistry with all discovered keywords
50
52
 
51
53
  """
52
54
  try:
55
+ logger.info("Register user-defined keywords")
53
56
  self._load_local_keywords()
54
- self._load_library_keywords()
55
- logger.info("Registry initialized with %d keywords", len(self.registry))
57
+ logger.info("Finished registering user-defined keywords")
56
58
  except Exception:
57
- logger.exception("Failed to initialize keyword registry")
59
+ logger.exception("Failed to register keywords with user-defined keywords")
60
+
61
+ try:
62
+ logger.info("Register built-in library keywords")
63
+ self._load_builtin_library_keywords()
64
+ logger.info("Finished registering built-in library keywords")
65
+ except Exception:
66
+ logger.exception("Failed to register keywords with built-in keywords")
67
+
68
+ try:
69
+ logger.info("Register external library keywords")
70
+ self._load_external_library_keywords()
71
+ logger.info("Finished registering external library keywords")
72
+ except Exception:
73
+ logger.exception("Failed to register keywords with external keywords")
74
+
75
+ logger.info("Registry initialized with %d keywords", len(self.registry))
58
76
 
59
77
  def _load_local_keywords(self) -> None:
60
78
  """Load local keywords from Robot Framework files."""
@@ -125,13 +143,37 @@ class KeywordRegistryService:
125
143
  keyword_doc.called_keywords = dependency_map.get(keyword_name, [])
126
144
  return keyword_doc
127
145
 
128
- def _load_library_keywords(self) -> None:
146
+ def _load_builtin_library_keywords(self) -> None:
147
+ libraries = [
148
+ BuiltinLibraryType.BUILTIN,
149
+ BuiltinLibraryType.COLLECTIONS,
150
+ BuiltinLibraryType.DATETIME,
151
+ BuiltinLibraryType.DIALOGS,
152
+ BuiltinLibraryType.OPERATINGSYSTEM,
153
+ BuiltinLibraryType.PROCESS,
154
+ BuiltinLibraryType.SCREENSHOT,
155
+ BuiltinLibraryType.STRING,
156
+ BuiltinLibraryType.TELNET,
157
+ BuiltinLibraryType.XML,
158
+ ]
159
+
160
+ for library_type in libraries:
161
+ try:
162
+ keyword_doc = self._get_library_keywords(library_type)
163
+ for keyword in keyword_doc:
164
+ self.registry.register(keyword)
165
+ except Exception:
166
+ logger.exception("Failed to load library: %s", library_type.value)
167
+ continue
168
+
169
+ def _load_external_library_keywords(self) -> None:
129
170
  """Load keywords from external Robot Framework libraries."""
130
171
  libraries = [
131
- LibraryType.BROWSER,
132
- LibraryType.SELENIUM,
133
- LibraryType.DATABASE,
134
- LibraryType.BUILTIN,
172
+ ExternalLibraryType.BROWSER,
173
+ ExternalLibraryType.SELENIUM,
174
+ ExternalLibraryType.APPIUM,
175
+ ExternalLibraryType.DATABASE,
176
+ ExternalLibraryType.REQUESTS,
135
177
  ]
136
178
 
137
179
  for library_type in libraries:
@@ -145,7 +187,7 @@ class KeywordRegistryService:
145
187
  continue
146
188
 
147
189
  @staticmethod
148
- def _get_library_keywords(library_type: LibraryType) -> list[KeywordProperties]:
190
+ def _get_library_keywords(library_type: BuiltinLibraryType | ExternalLibraryType) -> list[KeywordProperties]:
149
191
  """Get keyword metadata for a specific library.
150
192
 
151
193
  Arguments:
@@ -176,6 +218,9 @@ class KeywordRegistryService:
176
218
  validation_str_with_prefix=str(keyword_with_prefix).lower().replace(" ", "").replace("_", ""),
177
219
  )
178
220
  )
221
+ except DataError:
222
+ logger.warning("Library not installed: %s will be skipped", library_type.value)
223
+ return []
179
224
 
180
225
  except Exception:
181
226
  logger.exception("Library %s could not be loaded", lib_name)
@@ -1,14 +1,13 @@
1
1
  """Functionality to cover the KeywordSimilarity."""
2
2
 
3
3
  import logging
4
+ from collections import Counter
5
+ from math import sqrt
4
6
 
5
- import numpy as np
6
7
  from pygments import lex
7
8
  from pygments.lexers import get_lexer_by_name
8
9
  from roboview.registries.keyword_registry import KeywordRegistry
9
10
  from roboview.schemas.domain.keywords import KeywordProperties, SimilarKeyword
10
- from sklearn.feature_extraction.text import CountVectorizer
11
- from sklearn.metrics.pairwise import cosine_similarity
12
11
 
13
12
  logger = logging.getLogger(__name__)
14
13
 
@@ -17,7 +16,7 @@ class KeywordSimilarityService:
17
16
  """Class for calculating and querying the similarity between Keywords.
18
17
 
19
18
  This class provides functionality to analyze keyword similarity across Robot Framework
20
- files using TF-IDF vectorization and cosine similarity metrics. It can identify
19
+ files using token frequency vectors and cosine similarity metrics. It can identify
21
20
  similar keywords based on their source code structure and content.
22
21
 
23
22
  Attributes:
@@ -36,10 +35,71 @@ class KeywordSimilarityService:
36
35
  """
37
36
  self.keyword_registry = keyword_registry
38
37
  self.keyword_names_list = []
39
- self.similarity_matrix: np.ndarray = np.array([])
38
+ self.similarity_matrix: list[list[float]] = []
39
+
40
+ @staticmethod
41
+ def _calculate_cosine_similarity(
42
+ vector_a: Counter[str],
43
+ vector_b: Counter[str],
44
+ norm_a: float,
45
+ norm_b: float,
46
+ ) -> float:
47
+ """Calculate cosine similarity for two sparse token vectors.
48
+
49
+ Arguments:
50
+ vector_a (Counter[str]): Sparse token frequency vector for the first keyword.
51
+ vector_b (Counter[str]): Sparse token frequency vector for the second keyword.
52
+ norm_a (float): Precomputed Euclidean norm of vector_a.
53
+ norm_b (float): Precomputed Euclidean norm of vector_b.
54
+
55
+ Returns:
56
+ float: Cosine similarity score in range [0.0, 1.0]. Returns 0.0 if one
57
+ of the vectors has a zero norm.
58
+
59
+ """
60
+ if norm_a == 0.0 or norm_b == 0.0:
61
+ return 0.0
62
+
63
+ if len(vector_a) > len(vector_b):
64
+ vector_a, vector_b = vector_b, vector_a
65
+
66
+ dot_product = sum(value * vector_b.get(token, 0) for token, value in vector_a.items())
67
+ return dot_product / (norm_a * norm_b)
68
+
69
+ def _build_similarity_matrix(self, tokenized_keywords: list[str]) -> list[list[float]]:
70
+ """Build a full pairwise similarity matrix for tokenized keywords.
71
+
72
+ Arguments:
73
+ tokenized_keywords (list[str]): List of whitespace-separated token strings,
74
+ one entry per keyword.
75
+
76
+ Returns:
77
+ list[list[float]]: Symmetric cosine similarity matrix where matrix[i][j]
78
+ represents the similarity between keyword i and keyword j.
79
+
80
+ """
81
+ token_vectors = [Counter(tokens.split()) for tokens in tokenized_keywords]
82
+ norms = [sqrt(sum(value * value for value in token_vector.values())) for token_vector in token_vectors]
83
+
84
+ vector_count = len(token_vectors)
85
+ similarity_matrix = [[0.0] * vector_count for _ in range(vector_count)]
86
+
87
+ for i in range(vector_count):
88
+ similarity_matrix[i][i] = 1.0
89
+ for j in range(i + 1, vector_count):
90
+ similarity = self._calculate_cosine_similarity(
91
+ token_vectors[i],
92
+ token_vectors[j],
93
+ norms[i],
94
+ norms[j],
95
+ )
96
+ similarity_matrix[i][j] = similarity
97
+ similarity_matrix[j][i] = similarity
98
+
99
+ return similarity_matrix
40
100
 
41
101
  def calculate_keyword_similarity_matrix(self) -> None:
42
- """Calculate the keyword similarity matrix using TF-IDF and cosine similarity.
102
+ """Calculate the keyword similarity matrix using token vectors and cosine similarity.
43
103
 
44
104
  Analyzes keyword source code to compute similarity scores between all keywords
45
105
  in the project using tokenization and vectorization techniques.
@@ -76,9 +136,7 @@ class KeywordSimilarityService:
76
136
 
77
137
  # Create similarity matrix
78
138
  try:
79
- vectorizer = CountVectorizer()
80
- vectors = vectorizer.fit_transform(tokenized_keywords)
81
- similarity_matrix = cosine_similarity(vectors)
139
+ similarity_matrix = self._build_similarity_matrix(tokenized_keywords)
82
140
  except Exception:
83
141
  logger.exception("Failed to create vectors or calculate similarity matrix")
84
142
  return
@@ -123,7 +181,11 @@ class KeywordSimilarityService:
123
181
 
124
182
  try:
125
183
  similarities = self.similarity_matrix[index]
126
- similar_indices = np.argsort(similarities)[::-1]
184
+ similar_indices = sorted(
185
+ range(len(similarities)),
186
+ key=lambda similarity_index: similarities[similarity_index],
187
+ reverse=True,
188
+ )
127
189
 
128
190
  similar_keywords = []
129
191
  for i in similar_indices:
@@ -171,7 +233,7 @@ class KeywordSimilarityService:
171
233
  list: List of keywords that have high similarity with at least one other keyword.
172
234
 
173
235
  """
174
- if self.similarity_matrix.size == 0:
236
+ if not self.similarity_matrix:
175
237
  logger.warning("Similarity matrix is empty")
176
238
  return []
177
239
 
@@ -181,7 +243,7 @@ class KeywordSimilarityService:
181
243
 
182
244
  for i in range(n):
183
245
  for j in range(i + 1, n):
184
- similarity_score = round(float(self.similarity_matrix[i, j]), 4)
246
+ similarity_score = round(float(self.similarity_matrix[i][j]), 4)
185
247
  if similarity_score >= threshold:
186
248
  similar_keyword_indices.add(i)
187
249
  similar_keyword_indices.add(j)
@@ -410,7 +410,7 @@ class KeywordUsageService:
410
410
  """Get called keywords for a Robot Framework file.
411
411
 
412
412
  Arguments:
413
- file_path (str): Path of the file to fetch initialized keywords from.
413
+ file_path (str): Path of the file to fetch called keywords from.
414
414
 
415
415
  Returns:
416
416
  list: List of called keywords for the target file.
@@ -7,8 +7,10 @@ from contextlib import redirect_stderr, redirect_stdout
7
7
  from pathlib import Path
8
8
 
9
9
  import click
10
- from robocop.config import Config, ConfigManager
10
+ from robocop.config.manager import ConfigManager
11
+ from robocop.linter.fix import FixApplier
11
12
  from robocop.linter.runner import RobocopLinter
13
+ from robocop.source_file import SourceFile
12
14
  from roboview.registries.robocop_registry import RobocopRegistry
13
15
  from roboview.schemas.domain.robocop import RobocopMessage, RuleCategory
14
16
  from roboview.utils.directory_parsing import DirectoryParser
@@ -73,7 +75,7 @@ class RobocopRegistryService:
73
75
  diagnostics = linter.diagnostics
74
76
  if diagnostics:
75
77
  for error in diagnostics:
76
- rf_script_path = Path(error.source)
78
+ rf_script_path = Path(error.source.path)
77
79
  self.robocop_registry.register(
78
80
  RobocopMessage(
79
81
  rule_id=self._extract_rule_id(str(error.rule)),
@@ -105,11 +107,12 @@ class RobocopRegistryService:
105
107
  files = robot_files + resources_files
106
108
 
107
109
  try:
108
- config = Config(silent=True)
110
+ config = ConfigManager().default_config
109
111
  linter = RobocopLinter(ConfigManager())
110
112
 
111
113
  for file in files:
112
- diagnostics = linter.get_model_diagnostics(config, file)
114
+ source_file = SourceFile(path=file, config=config)
115
+ diagnostics = linter.get_model_diagnostics(source_file, FixApplier())
113
116
 
114
117
  if diagnostics:
115
118
  for error in diagnostics:
@@ -1,26 +0,0 @@
1
- """Common domain schemas for pydantic validation."""
2
-
3
- from enum import Enum
4
-
5
-
6
- class LibraryType(Enum):
7
- """Supported Robot Framework libraries."""
8
-
9
- BROWSER = "Browser"
10
- SELENIUM = "SeleniumLibrary"
11
- BUILTIN = "BuiltIn"
12
- DATABASE = "DatabaseLibrary"
13
-
14
-
15
- class FileType(Enum):
16
- """Supported Robot Framework files."""
17
-
18
- ROBOT = "robot"
19
- RESOURCE = "resource"
20
-
21
-
22
- class KeywordType(Enum):
23
- """Supported Robot Framework keyword types."""
24
-
25
- INITIALIZED = "initialized"
26
- CALLED = "called"