codemie-test-harness 0.1.214__py3-none-any.whl → 0.1.216__py3-none-any.whl

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.

Potentially problematic release.


This version of codemie-test-harness might be problematic. Click here for more details.

@@ -16,6 +16,7 @@ from codemie_test_harness.tests.test_data.project_management_test_data import (
16
16
  from codemie_test_harness.tests.utils.base_utils import (
17
17
  credentials_to_dict,
18
18
  assert_tool_triggered,
19
+ get_random_name,
19
20
  )
20
21
  from codemie_test_harness.tests.utils.constants import (
21
22
  project_management_integrations,
@@ -45,6 +46,9 @@ def test_assistant_with_project_management_tools(
45
46
  project_management_integrations[integration_type]
46
47
  )
47
48
 
49
+ if "%s" in prompt:
50
+ prompt = prompt % get_random_name()
51
+
48
52
  assistant = assistant(
49
53
  Toolkit.PROJECT_MANAGEMENT,
50
54
  tool_name,
@@ -439,6 +439,41 @@ def webhook_integration(integration_utils):
439
439
  pass
440
440
 
441
441
 
442
+ @pytest.fixture(scope="module")
443
+ def scheduler_integration(integration_utils):
444
+ created_integrations = []
445
+
446
+ def _create(
447
+ alias,
448
+ resource_type,
449
+ resource_id,
450
+ prompt: str = None,
451
+ schedule: str = "* * * * *", # every minute
452
+ is_enabled: bool = True,
453
+ ):
454
+ credential_values = [
455
+ CredentialValues(key="url", value=CredentialsManager.AUTO_GENERATED),
456
+ CredentialValues(key="is_enabled", value=is_enabled),
457
+ CredentialValues(key="schedule", value=schedule),
458
+ CredentialValues(key="resource_type", value=resource_type),
459
+ CredentialValues(key="resource_id", value=resource_id),
460
+ CredentialValues(key="prompt", value=prompt),
461
+ ]
462
+ integration = integration_utils.create_integration(
463
+ CredentialTypes.SCHEDULER, credential_values, integration_alias=alias
464
+ )
465
+ created_integrations.append(integration)
466
+ return integration
467
+
468
+ yield _create
469
+
470
+ for integration in created_integrations:
471
+ try:
472
+ integration_utils.delete_integration(integration)
473
+ except HTTPError:
474
+ pass
475
+
476
+
442
477
  @pytest.fixture(scope="function")
443
478
  def general_integration(integration_utils):
444
479
  created_integration: Optional[Integration] = None
File without changes
@@ -0,0 +1,264 @@
1
+ """Scheduler integration tests for CodeMie.
2
+
3
+ This module contains tests for scheduler functionality including:
4
+ - Basic scheduler operations with different resource types (assistant, workflow, datasource)
5
+ - Error handling and validation for invalid cron expressions
6
+ - Error handling for invalid resource IDs
7
+ - Disabled scheduler verification
8
+ """
9
+
10
+ import pytest
11
+
12
+ from hamcrest import (
13
+ assert_that,
14
+ equal_to,
15
+ has_item,
16
+ any_of,
17
+ )
18
+ from requests import HTTPError
19
+ from codemie_test_harness.tests.utils.base_utils import get_random_name, wait_for_entity
20
+ from codemie_sdk.models.datasource import DataSourceStatus
21
+
22
+
23
+ @pytest.mark.scheduler
24
+ @pytest.mark.api
25
+ class TestSchedulerValidIntegrations:
26
+ """Tests for valid scheduler integrations - verify scheduler creation with different resource types."""
27
+
28
+ def test_scheduler_with_assistant(
29
+ self, assistant, scheduler_integration, conversation_utils
30
+ ):
31
+ """Test scheduler can be created with assistant resource type.
32
+
33
+ This test verifies:
34
+ 1. Scheduler integration can be created with an assistant
35
+ 2. Integration stores correct configuration (schedule, resource type, resource ID)
36
+ 3. Assistant can be triggered manually to verify the resource is valid
37
+ """
38
+ scheduler_alias = get_random_name()
39
+ message = f"Test message for scheduler {scheduler_alias}"
40
+
41
+ # Create assistant
42
+ assistant = assistant()
43
+
44
+ # Create scheduler integration with assistant
45
+ scheduler_integration(
46
+ alias=scheduler_alias,
47
+ resource_type="assistant",
48
+ resource_id=assistant.id,
49
+ prompt=message,
50
+ is_enabled=True,
51
+ )
52
+
53
+ # Wait for conversation
54
+ conversation = wait_for_entity(
55
+ lambda: conversation_utils.list_conversations(),
56
+ entity_name=message,
57
+ timeout=80,
58
+ )
59
+
60
+ # Verify conversation details
61
+ assert_that(conversation.name, equal_to(message))
62
+ assert_that(conversation.initial_assistant_id, equal_to(assistant.id))
63
+ assert_that(conversation.assistant_ids, has_item(assistant.id))
64
+
65
+ def test_scheduler_with_workflow(
66
+ self,
67
+ workflow_with_virtual_assistant,
68
+ scheduler_integration,
69
+ workflow_utils,
70
+ ):
71
+ """Test scheduler can be created with workflow resource type.
72
+
73
+ This test verifies:
74
+ 1. Scheduler integration can be created with a workflow
75
+ 2. Integration stores correct configuration
76
+ 3. Workflow can be executed manually to verify the resource is valid
77
+ """
78
+ scheduler_alias = get_random_name()
79
+ message = f"Test message for scheduler {scheduler_alias}"
80
+
81
+ # Create a simple workflow
82
+ workflow = workflow_with_virtual_assistant(scheduler_alias)
83
+
84
+ # Create scheduler integration with workflow
85
+ scheduler_integration(
86
+ alias=scheduler_alias,
87
+ resource_type="workflow",
88
+ resource_id=workflow.id,
89
+ prompt=message,
90
+ is_enabled=True,
91
+ )
92
+
93
+ # Wait for execution with specific prompt
94
+ execution = wait_for_entity(
95
+ lambda: workflow_utils.get_executions(workflow),
96
+ entity_name=message,
97
+ timeout=80,
98
+ )
99
+
100
+ # Verify execution details
101
+ assert_that(execution.prompt.strip('""'), equal_to(message))
102
+ assert_that(execution.workflow_id, equal_to(workflow.id))
103
+
104
+ @pytest.mark.parametrize(
105
+ "datasource_fixture",
106
+ [
107
+ "jira_datasource",
108
+ "confluence_datasource",
109
+ "code_datasource",
110
+ ],
111
+ )
112
+ def test_scheduler_with_datasource(
113
+ self,
114
+ request,
115
+ datasource_fixture,
116
+ scheduler_integration,
117
+ datasource_utils,
118
+ ):
119
+ """Test scheduler can be created with datasource resource type.
120
+
121
+ This test verifies:
122
+ 1. Scheduler integration can be created with different datasource types
123
+ 2. Integration stores correct configuration
124
+ 3. Datasource indexing can be triggered manually to verify the resource is valid
125
+
126
+ Test is parametrized to work with different datasource types:
127
+ - jira_datasource
128
+ - confluence_datasource
129
+ - code_datasource
130
+ """
131
+ # Get the datasource from the fixture
132
+ datasource = request.getfixturevalue(datasource_fixture)
133
+ scheduler_alias = get_random_name()
134
+
135
+ # Create scheduler integration with datasource
136
+ scheduler_integration(
137
+ alias=scheduler_alias,
138
+ resource_type="datasource",
139
+ resource_id=datasource.id,
140
+ is_enabled=True,
141
+ )
142
+
143
+ triggered_datasource = datasource_utils.wait_for_update_date_change(
144
+ datasource_id=datasource.id, timeout=80
145
+ )
146
+
147
+ # Verify datasource exists and check its status (indexing should be in progress)
148
+ assert_that(triggered_datasource.id, equal_to(datasource.id))
149
+ assert_that(triggered_datasource.name, equal_to(datasource.name))
150
+ assert_that(triggered_datasource.status, DataSourceStatus.FETCHING)
151
+
152
+
153
+ @pytest.mark.scheduler
154
+ @pytest.mark.api
155
+ class TestSchedulerInvalidIntegrations:
156
+ """Tests for invalid scheduler integrations - verify proper error handling."""
157
+
158
+ @pytest.mark.parametrize(
159
+ "invalid_cron",
160
+ [
161
+ ("invalid_cron_expression"),
162
+ ("* * * *"),
163
+ ("60 0 * * *"),
164
+ ("0 25 * * *"),
165
+ ("0 0 32 * *"),
166
+ ("0 0 * 13 *"),
167
+ ("0 0 * * 8"),
168
+ (""),
169
+ ],
170
+ )
171
+ def test_scheduler_with_invalid_cron(
172
+ self, assistant, scheduler_integration, invalid_cron
173
+ ):
174
+ """Test scheduler creation fails with invalid cron expressions.
175
+
176
+ This test verifies that the system properly validates cron expressions
177
+ and rejects invalid formats.
178
+
179
+ Parametrized with various invalid cron expressions:
180
+ - Completely invalid format
181
+ - Incomplete expressions
182
+ - Out-of-range values for each field
183
+ - Empty expressions
184
+ """
185
+ scheduler_alias = get_random_name()
186
+ created_assistant = assistant()
187
+
188
+ with pytest.raises(HTTPError) as exc_info:
189
+ scheduler_integration(
190
+ alias=scheduler_alias,
191
+ resource_type="assistant",
192
+ resource_id=created_assistant.id,
193
+ schedule=invalid_cron,
194
+ prompt=scheduler_alias,
195
+ is_enabled=True,
196
+ )
197
+
198
+ assert_that(exc_info.value.response.status_code, equal_to(422))
199
+ assert_that(
200
+ exc_info.value.response.json()["error"]["message"],
201
+ any_of(
202
+ equal_to("Invalid cron expression"), equal_to("Invalid schedule format")
203
+ ),
204
+ )
205
+
206
+ @pytest.mark.parametrize(
207
+ "resource_type, error",
208
+ [
209
+ ("assistant", "Assistant not found"),
210
+ ("workflow", "Workflow not found"),
211
+ ("datasource", "Datasource not found"),
212
+ ],
213
+ )
214
+ def test_scheduler_with_invalid_resource_id(
215
+ self, scheduler_integration, resource_type, error
216
+ ):
217
+ """Test scheduler creation with non-existent resource ID.
218
+
219
+ This test verifies that the system handles invalid resource IDs properly,
220
+ either by rejecting them during creation or handling them gracefully during execution.
221
+ """
222
+ scheduler_alias = get_random_name()
223
+ invalid_resource_id = "invalid_resource_" + get_random_name()
224
+
225
+ with pytest.raises(HTTPError) as exc_info:
226
+ scheduler_integration(
227
+ alias=scheduler_alias,
228
+ resource_type=resource_type,
229
+ resource_id=invalid_resource_id,
230
+ prompt=scheduler_alias,
231
+ is_enabled=True,
232
+ )
233
+
234
+ assert_that(exc_info.value.response.status_code, equal_to(404))
235
+ assert_that(
236
+ exc_info.value.response.json()["error"]["message"],
237
+ equal_to(error),
238
+ )
239
+
240
+ def test_scheduler_with_invalid_resource_type(
241
+ self, assistant, scheduler_integration
242
+ ):
243
+ """Test scheduler creation with invalid resource type.
244
+
245
+ This test verifies that the system properly validates resource types.
246
+ """
247
+ scheduler_alias = get_random_name()
248
+ created_assistant = assistant()
249
+
250
+ with pytest.raises(HTTPError) as exc_info:
251
+ scheduler_integration(
252
+ alias=scheduler_alias,
253
+ resource_type="invalid_resource_type",
254
+ resource_id=created_assistant.id,
255
+ prompt=scheduler_alias,
256
+ is_enabled=True,
257
+ )
258
+
259
+ # Verify error has 422 status code (Unprocessable Entity)
260
+ assert_that(exc_info.value.response.status_code, equal_to(422))
261
+ assert_that(
262
+ exc_info.value.response.json()["error"]["message"],
263
+ equal_to("Invalid resource type"),
264
+ )
@@ -803,36 +803,101 @@ DOCX_TOOL_TEST_DATA = [
803
803
  id="image_extraction",
804
804
  ),
805
805
  pytest.param(
806
- "From test_extended.docx extract and show the text with OCR from images",
806
+ "From test_extended.docx extract and show the OCR from images and text from the first page",
807
807
  """
808
- ### Extracted Text with OCR from Images in *test_extended.docx*
809
-
810
- #### **Image 1: Capability Configuration**
811
- The image contains text related to client authentication, authorization settings, and available flows. Below is the OCR-extracted text:
812
-
808
+ Here is the extracted content from the first page of the `test_extended.docx` document including text and OCR results from images:
809
+
810
+ ### Text Content
813
811
  ```
814
- **Capability config**
815
-
816
- - **Client authentication**
817
- - 🟦 On
818
-
819
- - **Authorization**
820
- - Off
821
-
812
+ 1. Getting Started with AI/RunTM CodeMie
813
+
814
+ This section provides a brief description of what AI/RunTM CodeMie is and describes how to start using the AI/RunTM CodeMie tool as soon as possible.
815
+
816
+ 1.1 What is AI/RunTM CodeMie?
817
+
818
+ AI/RunTM CodeMie is a sophisticated AI assistant tool tailored specifically for developers. AI/RunTM CodeMie is an innovative LLM-powered platform designed to help users to address specific challenges and find solutions for their needs. Unlike conventional large language models (LLMs) such as ChatGPT, Bard, and Copilot, AI/RunTM CodeMie is engineered to support development processes more comprehensively. It integrates seamlessly with essential development tools including Git, Jira, Confluence, and various search engines. This integration empowers AI/RunTM CodeMie to go beyond the capabilities of a standard chatbot, enabling it to manage Jira issues, devise appropriate implementations, and generate pull requests.
819
+
820
+ AI/RunTM CodeMie leverages AI to automate coding tasks, reduce technical debt, streamline code reviews and legacy application migrations, enhance onboarding, improve information access and analysis, optimize call center operations, ensure consistent customer support, maintain data security, and analyze market sentiment, ultimately enhancing productivity and reducing costs. The development of such a powerful assistant necessitates extensive customization and fine-tuning. The following sections will delve into the intricate adjustments and configurations required to harness the full potential of AI/RunTM CodeMie.
821
+
822
+ 1.2 What Are AI/RunTM CodeMie Capabilities?
823
+
824
+ AI/RunTM CodeMie efficiently addresses numerous tasks across varying difficulty levels. Below is an overview of AI/RunTM CodeMie’s key capabilities:
825
+
826
+ Comprehensive SDLC Smart Assistance and Assistants Library: AI/RunTM CodeMie offers robust smart assistance across all phases of the SDLC process by leveraging a variety of AI assistant roles, such as Business Analyst (BA), Developer, Quality Assurance (QA), Project Manager (PM), and more. These pre-built AI assistants enhance performance and productivity, and automate routine work, significantly reducing process costs and accelerating the software development cycle. The platform comes with a comprehensive library of pre-built AI assistants tailored to various roles within the SDLC to suit the diverse needs within a project.
827
+
828
+ Assistants Constructor: Provides the flexibility to create personalized assistants equipped with specific tools and abilities tailored to your project's needs.
829
+
830
+ Indexing and Data Management: AI/RunTM CodeMie provides options for data indexing, including the ability to monitor the current progress and status of the indexing process, perform incremental or full reindexing, and manage indexed data sources effectively. Supported data sources include Jira, Confluence, various file formats (PDF, PPT, Excel, etc.), and Git.
831
+
832
+ Support for Multi-Agent Workflows: AI/RunTM аCodeMie supports multi-agent workflows, allowing multiple AI assistants to collaborate seamlessly on complex tasks and workflows. This capability covers use cases where different agents need to interact and share information to achieve a common goal, enhancing coordination and efficiency across various phases of the SDLC.
833
+
834
+ Ease of Use for Beginners: Simple use cases for newcomers include code review, newcomer training, and user story creation. These require minimal setup, such as configuring your Git token for code-related tasks or your Jira token for project management tasks.
835
+
836
+ Extensive Library of Tools: AI/RunTM CodeMie includes a wide array of tools to support various aspects of software development and project management:
837
+
838
+ Version Control Systems (VCS): Tools for managing and tracking changes in the codebase, such as Git.
839
+
840
+ Codebase Tools: Tools for code review, static code analysis, and automated code formatting.
841
+
842
+ Research Tools: Tools to assist in gathering and organizing research data and documentation.
843
+
844
+ Cloud Tools: Integration with major cloud providers for deployment, monitoring, and management of cloud resources.
845
+
846
+ Project Management Tool (Jira: For project management, task tracking, and issue tracking,
847
+
848
+ Confluence: For documentation, knowledge sharing, and collaboration.)
849
+
850
+ Open API: Integration with various open APIs to extend functionality and connect with other services.
851
+
852
+ Notification Tools: Tools for sending notifications and alerts via email, chat, or other communication channels.
853
+
854
+ Data Management Tools: Tools for querying Elasticsearch indexes.
855
+
856
+ Git
857
+
858
+ Access Management: Keycloak
859
+
860
+ Plugin
861
+
862
+ Open API
863
+
864
+ Notification
865
+
866
+ File Management
867
+
868
+ Data Management
869
+
870
+ Quality Assurance
871
+
872
+ There is no priority or sequential system in place. Everything depends on the given instructions. It is possible to instruct the model to use a specific data source for a particular use case or provide a description for the data source when it is created. Data source descriptions are provided to the model so it can understand better use cases for it.
873
+
874
+ The data source does not have rules, only description. System Instructions(System prompt) extends based on data source description. If contradictions arise, the model will use its creative problem-solving abilities to address them.
875
+
876
+ The model has a context window, but it is irrelevant to data source size. The model answer will depend on query quality. There is a use case when the model has thousands of data sources, however with queries that are specific and on point there are no problems. If a poor query provided e.g., “tell me about something” answer would be vague.
877
+
878
+ Other than the context window there is no limit, however there is a simple rule: the smaller and clearer the instructions, the better. Also, the instructions must be uncontradictory, as this will reduce the risk of confusing LLM.
879
+
880
+ 1.3 Meet the AI/Run FAQ Assistant
881
+ ```
882
+
883
+ ### OCR from Image Text
884
+ ```
885
+ Capability config
886
+
887
+ - **Client authentication**
888
+ - On
889
+
890
+ - **Authorization**
891
+ - Off
892
+
822
893
  - **Authentication flow**
823
- - ☑️ Standard flow
824
- - ☑️ Direct access grants
825
- - Implicit flow
826
- - ☑️ Service accounts roles
827
- - OAuth 2.0 Device Authorization Grant
828
- - OIDC CIBA Grant
894
+ - [x] Standard flow
895
+ - [x] Direct access grants
896
+ - [ ] Implicit flow
897
+ - [x] Service accounts roles
898
+ - [ ] OAuth 2.0 Device Authorization Grant
899
+ - [ ] OIDC CIBA Grant
829
900
  ```
830
-
831
- This image primarily highlights authentication configurations, flow types, and the enabling/disabling of various features.
832
-
833
- ---
834
-
835
- Let me know if you'd like to perform further analysis or extract more details!
836
901
  """,
837
902
  id="text_with_images",
838
903
  ),
@@ -1,4 +1,3 @@
1
- from codemie_test_harness.tests.utils.base_utils import get_random_name
2
1
  from codemie_test_harness.tests.utils.confluence_utils import CONFLUENCE_SPACE_KEYS
3
2
  from codemie_test_harness.tests.utils.jira_utils import JIRA_PROJECT_KEYS
4
3
 
@@ -101,7 +100,7 @@ def get_jira_tool_create_prompt(jira_type: str) -> str:
101
100
  "For generic jira tool use exactly the same parameters: "
102
101
  "relative_url=/rest/api/2/issue "
103
102
  "method=POST "
104
- f"params={{'fields': {{'project': {{'key': '{JIRA_PROJECT_KEYS[jira_type]}'}}, 'summary': '{get_random_name()} Test issue created by automation', "
103
+ f"params={{'fields': {{'project': {{'key': '{JIRA_PROJECT_KEYS[jira_type]}'}}, 'summary': '%s Test issue created by automation', "
105
104
  "'description': 'This is a test issue created for testing purposes', 'issuetype': {'name': 'Task'}}}}}"
106
105
  )
107
106
 
@@ -121,7 +120,7 @@ def get_confluence_tool_create_prompt(confluence_type: str) -> str:
121
120
  Create a new page in Confluence with the following details using Generic Confluence Tool with the params:
122
121
  relative_url='/rest/api/content'
123
122
  method='POST'
124
- params={{'type': 'page', 'title': '{get_random_name()} Test Page Created by Automation', 'space': {{'key': '{CONFLUENCE_SPACE_KEYS[confluence_type]}'}},
123
+ params={{'type': 'page', 'title': '%s Test Page Created by Automation', 'space': {{'key': '{CONFLUENCE_SPACE_KEYS[confluence_type]}'}},
125
124
  'body': {{'storage': {{'value': '<p>This is a test page created for testing purposes.</p>', 'representation': 'storage'}}}}}}
126
125
  """
127
126
 
@@ -104,12 +104,14 @@ def wait_for_entity(get_entity_callable, entity_name, timeout=10, poll_interval=
104
104
  start_time = time.time()
105
105
 
106
106
  while time.time() - start_time < timeout:
107
- try:
108
- entities = [raw for raw in get_entity_callable() if raw.name == entity_name]
109
- except AttributeError:
110
- entities = [
111
- raw for raw in get_entity_callable() if raw.alias == entity_name
112
- ]
107
+ entities = [
108
+ raw
109
+ for raw in get_entity_callable()
110
+ if (hasattr(raw, "name") and entity_name == raw.name)
111
+ or (hasattr(raw, "alias") and entity_name == raw.alias)
112
+ or (hasattr(raw, "prompt") and entity_name == raw.prompt)
113
+ ]
114
+
113
115
  if len(entities) > 0:
114
116
  return entities[0]
115
117
  time.sleep(poll_interval)
@@ -208,6 +208,47 @@ class DataSourceUtils(BaseUtils):
208
208
  raise ApiError(f"Datasource {datasource_id} indexing failed")
209
209
  raise TimeoutError("Datasource was not indexed within the timeout period.")
210
210
 
211
+ def wait_for_update_date_change(
212
+ self,
213
+ datasource_id: str,
214
+ timeout: int = 80,
215
+ pool_interval: int = 3,
216
+ ) -> DataSource:
217
+ """Wait for datasource update_date to become greater than created_date.
218
+
219
+ This method polls the datasource and waits until the update_date is greater
220
+ than the created_date, indicating that the datasource has been updated/re-indexed.
221
+
222
+ Args:
223
+ datasource_id: The ID of the datasource to monitor
224
+ timeout: Maximum time to wait in seconds (default from DEFAULT_TIMEOUT)
225
+ pool_interval: Time between polling attempts in seconds (default 3)
226
+
227
+ Returns:
228
+ DataSource: The updated datasource object with update_date > created_date
229
+
230
+ Raises:
231
+ TimeoutError: If update_date doesn't change within the timeout period
232
+ """
233
+ start_time = time.time()
234
+
235
+ # Get initial datasource state
236
+ datasource = self.client.datasources.get(datasource_id)
237
+ created_date = datasource.created_date
238
+
239
+ while time.time() - start_time < timeout:
240
+ sleep(pool_interval)
241
+ datasource = self.client.datasources.get(datasource_id)
242
+
243
+ # Check if update_date is greater than created_date
244
+ if datasource.update_date and datasource.update_date > created_date:
245
+ return datasource
246
+
247
+ raise TimeoutError(
248
+ f"Datasource {datasource_id} update_date did not change within the timeout period. "
249
+ f"Created: {created_date}, Last checked update: {datasource.update_date}"
250
+ )
251
+
211
252
  def get_datasource(self, datasource_id):
212
253
  return self.client.datasources.get(datasource_id)
213
254
 
@@ -123,11 +123,15 @@ class WorkflowUtils(BaseUtils):
123
123
  ):
124
124
  self.client.workflows.run(workflow, user_input=user_input, file_name=file_name)
125
125
  executions_service = self.client.workflows.executions(workflow)
126
- execution_id = next(
127
- row.execution_id
128
- for row in executions_service.list()
129
- if row.prompt == user_input
126
+
127
+ # Wait for execution to appear (returns execution object with prompt attribute)
128
+ execution = wait_for_entity(
129
+ lambda: executions_service.list(),
130
+ entity_name=user_input,
130
131
  )
132
+ execution_id = execution.execution_id
133
+
134
+ # Wait for state to appear
131
135
  states_service = executions_service.states(execution_id)
132
136
  state = wait_for_entity(
133
137
  lambda: states_service.list(),
@@ -4,7 +4,10 @@ from codemie_test_harness.tests.enums.tools import Toolkit
4
4
  from codemie_test_harness.tests.test_data.project_management_test_data import (
5
5
  pm_tools_test_data,
6
6
  )
7
- from codemie_test_harness.tests.utils.base_utils import assert_tool_triggered
7
+ from codemie_test_harness.tests.utils.base_utils import (
8
+ assert_tool_triggered,
9
+ get_random_name,
10
+ )
8
11
  from codemie_test_harness.tests.utils.constants import (
9
12
  project_management_integrations,
10
13
  )
@@ -36,6 +39,9 @@ def test_workflow_with_assistant_with_project_management_tools(
36
39
  project_management_integrations[integration_type]
37
40
  )
38
41
 
42
+ if "%s" in prompt:
43
+ prompt = prompt % get_random_name()
44
+
39
45
  assistant = assistant(
40
46
  Toolkit.PROJECT_MANAGEMENT,
41
47
  tool_name,
@@ -3,6 +3,9 @@ import json
3
3
  import pytest
4
4
  from hamcrest import assert_that, equal_to
5
5
 
6
+ from codemie_test_harness.tests.assistant.test_assistants import (
7
+ system_prompt_for_chatting_with_files,
8
+ )
6
9
  from codemie_test_harness.tests.enums.tools import Default
7
10
  from codemie_test_harness.tests.test_data.assistant_test_data import (
8
11
  EXCEL_TOOL_TEST_DATA,
@@ -84,15 +87,17 @@ def test_workflow_with_user_input_and_file_attachment(
84
87
 
85
88
  # Create workflow with virtual assistant that has file analysis capabilities
86
89
  # Note: File analysis tools are automatically available when files are processed
87
- system_prompt = "You are a helpful assistant that can analyze and process files. "
90
+ task = (
91
+ f"What is the content/text of the {file_name}. Show information from ALL pages. "
92
+ "For PDF use 'Text' for query. If provided file is CSV then run python_repl_ast tool and show first 5 rows."
93
+ "For images explain what you see on it."
94
+ "For excel show data from the sheet with name 'Sheet1'"
95
+ )
88
96
 
89
97
  workflow_instance = workflow_with_virtual_assistant(
90
98
  assistant_and_state_name=assistant_and_state_name,
91
- system_prompt=system_prompt,
92
- task=(
93
- "Analyze the uploaded file from the provided file URL and give a detailed summary. "
94
- "Use the appropriate file analysis tools based on the file type to extract and process the content."
95
- ),
99
+ system_prompt=system_prompt_for_chatting_with_files,
100
+ task=task,
96
101
  )
97
102
 
98
103
  # Prepare user input that includes file reference
@@ -36,6 +36,10 @@ def test_workflow_with_virtual_assistant_with_project_management_tools(
36
36
  project_management_integrations[integration_type]
37
37
  )
38
38
  assistant_and_state_name = get_random_name()
39
+
40
+ if "%s" in prompt:
41
+ prompt = prompt % get_random_name()
42
+
39
43
  test_workflow = workflow_with_virtual_assistant(
40
44
  assistant_and_state_name, tool_name, integration=integration
41
45
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: codemie-test-harness
3
- Version: 0.1.214
3
+ Version: 0.1.216
4
4
  Summary: Autotest for CodeMie backend and UI
5
5
  Author: Anton Yeromin
6
6
  Author-email: anton_yeromin@epam.com
@@ -13,7 +13,7 @@ Requires-Dist: aws-assume-role-lib (>=2.10.0,<3.0.0)
13
13
  Requires-Dist: boto3 (>=1.39.8,<2.0.0)
14
14
  Requires-Dist: click (>=8.1.7,<9.0.0)
15
15
  Requires-Dist: codemie-plugins (>=0.1.123,<0.2.0)
16
- Requires-Dist: codemie-sdk-python (==0.1.214)
16
+ Requires-Dist: codemie-sdk-python (==0.1.216)
17
17
  Requires-Dist: pytest (>=8.4.1,<9.0.0)
18
18
  Requires-Dist: pytest-playwright (>=0.7.0,<0.8.0)
19
19
  Requires-Dist: pytest-repeat (>=0.9.3,<0.10.0)
@@ -55,7 +55,7 @@ codemie_test_harness/tests/assistant/tools/plugin/test_assistant_with_developmen
55
55
  codemie_test_harness/tests/assistant/tools/plugin/test_assistant_with_plugin_and_mcp_servers.py,sha256=YjKlVactCaPZhRXLu3GQXrPPgVHkUrbTgwhNbz-OP84,2239
56
56
  codemie_test_harness/tests/assistant/tools/plugin/test_single_assistant_dual_time_plugins.py,sha256=6CmNPIaFXpJdvCmV1xu48v8mXWxL0O83ecQYthENvPE,5386
57
57
  codemie_test_harness/tests/assistant/tools/project_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- codemie_test_harness/tests/assistant/tools/project_management/test_assistant_pm_tools.py,sha256=gmoNr2XEZA2hgKtlnY9ULZnQW_rId9v6O5dvZdKokjk,6024
58
+ codemie_test_harness/tests/assistant/tools/project_management/test_assistant_pm_tools.py,sha256=XAdHnB5q4UNUOEA_sCE_BH0K8EUbbK78G_562UigSTI,6113
59
59
  codemie_test_harness/tests/assistant/tools/report_portal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  codemie_test_harness/tests/assistant/tools/report_portal/test_assistant_report_portal_tools.py,sha256=bGv3MS7hV3yX5S3QwaeoWkA273QCOKYAew7M4BhDUso,969
61
61
  codemie_test_harness/tests/assistant/tools/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -64,7 +64,7 @@ codemie_test_harness/tests/assistant/tools/servicenow/__init__.py,sha256=47DEQpj
64
64
  codemie_test_harness/tests/assistant/tools/servicenow/test_servicenow_tools.py,sha256=aUjfZ4773WoQJjcHx3JqH5e8ckaKB-aIMO-OZWTm0Ek,888
65
65
  codemie_test_harness/tests/assistant/tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  codemie_test_harness/tests/assistant/tools/vcs/test_assistant_with_vcs_tools.py,sha256=qOPr4XOh2rgUV2MXMxkRzRGkAKl9ViwQGCZ-dMEtscU,1145
67
- codemie_test_harness/tests/conftest.py,sha256=zSOjH7Pak73BtntTPNBdBS488xJag28jNsJRzTOvh5E,32640
67
+ codemie_test_harness/tests/conftest.py,sha256=o2A8_JrhYCIqPzBJwPtlORQexLjv8k6HpZmJNPy7An0,33807
68
68
  codemie_test_harness/tests/conversations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  codemie_test_harness/tests/conversations/test_conversations_endpoints.py,sha256=HQ2nu9lXfRNkyJhA0rzar7Rmv6pMe-te0rFYAy-X5UA,4128
70
70
  codemie_test_harness/tests/e2e/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -87,6 +87,8 @@ codemie_test_harness/tests/llm/assistants/test_lite_llm.py,sha256=jYtf_J7lBSmB1L
87
87
  codemie_test_harness/tests/llm/assistants/test_llm.py,sha256=b5HhrDkz1lwCaSZH5kdPdacmLXH_Bxnj5vO_A5ho3k8,4838
88
88
  codemie_test_harness/tests/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  codemie_test_harness/tests/providers/test_providers_endpoints.py,sha256=iV9pxFOxTPVbk8aH8RGFjVDUCUDMUiRWcDMrvwqoTqk,8043
90
+ codemie_test_harness/tests/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
+ codemie_test_harness/tests/scheduler/test_scheduler_service.py,sha256=CRPoqANVErsTunJ3i9d-zqroEbBLL5R3Ks6udtlPK6g,9039
90
92
  codemie_test_harness/tests/search/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
91
93
  codemie_test_harness/tests/search/test_search_assistant.py,sha256=dMTH619tOWKSCLpEVTnrClEEDEo10tqe8o4rSfs4SXs,3269
92
94
  codemie_test_harness/tests/search/test_search_datasource.py,sha256=qFxopY4w8U7EgY_vh74V0ra315iW-7u16r9APzgw5W8,6871
@@ -107,7 +109,7 @@ codemie_test_harness/tests/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
107
109
  codemie_test_harness/tests/test_data/ado_test_plan_tools_test_data.py,sha256=Al5u4HNfrcoj-b072uEGsqUqjKqwXLGJXKQ0QeJT3PI,5778
108
110
  codemie_test_harness/tests/test_data/ado_wiki_tools_test_data.py,sha256=xvgEja5vE0l41sP4fE0stdFLQ0M201FWynOCEcRYufE,3188
109
111
  codemie_test_harness/tests/test_data/ado_work_item_tools_test_data.py,sha256=4Y195fG7K7FfjXXapEuTmAEz7YkBgkuO2YCQKu5YC8k,5693
110
- codemie_test_harness/tests/test_data/assistant_test_data.py,sha256=jUsLVws5Zt23W2AxDU6oXvzMNzY_8h6mCjq_wuQn-Lk,45359
112
+ codemie_test_harness/tests/test_data/assistant_test_data.py,sha256=ctjyRWLo_b4JN99UFrrO2SazoIJ2ojw2zgTUg9XZKmc,51838
111
113
  codemie_test_harness/tests/test_data/cloud_tools_test_data.py,sha256=SWz-VTNcWteCvVupl2xksv4eEFkmtWMdRIqrZxjpFYk,6200
112
114
  codemie_test_harness/tests/test_data/codebase_tools_test_data.py,sha256=Y2vB2yxDli7Ebadsyt2O60Vj0gXiX7nYqyWZicHqjGQ,3505
113
115
  codemie_test_harness/tests/test_data/data_management_tools_test_data.py,sha256=K3_JBJaBW7BhgkjFSeFtqW4jcKhNOmz0EFOGeyfk4jQ,3455
@@ -161,7 +163,7 @@ codemie_test_harness/tests/test_data/open_api_tools_test_data.py,sha256=mvf0legy
161
163
  codemie_test_harness/tests/test_data/openapi.json,sha256=X4uqtfjpTUuMifefQRf8mHI1k8pspp8-L0rpJlhLOI4,10459
162
164
  codemie_test_harness/tests/test_data/output_schema_test_data.py,sha256=4l7AvXbMl9hIvoFxu1LPPSGz9hb5Uz2_is4zTm77ARY,261
163
165
  codemie_test_harness/tests/test_data/plugin_tools_test_data.py,sha256=bVamztyQ4bAVo1CRSrtu6f5H-gkjhAN2nq5Jbc0erqM,4168
164
- codemie_test_harness/tests/test_data/pm_tools_test_data.py,sha256=SnXG0knX7uMb-jMvbmE1OObzYQZQSCDQtD0tL2XTvIo,5256
166
+ codemie_test_harness/tests/test_data/pm_tools_test_data.py,sha256=yjEG24F10Rb5Br5dEPMIO74WMi2p3huZFgfRMYfzG7c,5150
165
167
  codemie_test_harness/tests/test_data/project_management_test_data.py,sha256=2RWzrJmdlrOuJQKcmlWOfYz2daw_Oc2RkDU5XyM-w6U,3242
166
168
  codemie_test_harness/tests/test_data/report_portal_tools_test_data.py,sha256=YZdmfEwrwOdCduNxs768LOB8OHfL8sfNI-R2k-koKTk,14555
167
169
  codemie_test_harness/tests/test_data/research_tools_test_data.py,sha256=zwpzm-VSnrLZEfG97AE9Ms7z7j3xmqxiNd1EmZyWCSk,9102
@@ -269,13 +271,13 @@ codemie_test_harness/tests/ui/workflows/test_workflows.py,sha256=zRBFiQYhJ_MWKGG
269
271
  codemie_test_harness/tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
272
  codemie_test_harness/tests/utils/assistant_utils.py,sha256=2s1MikCfIcM3UlkcuwaedyxI2hePuWT3h8F3SDjBCtk,8022
271
273
  codemie_test_harness/tests/utils/aws_parameters_store.py,sha256=YAVpvwElkKZJZvzSVxtOue1Gjs-kvSBS2y5QvIlz484,3267
272
- codemie_test_harness/tests/utils/base_utils.py,sha256=MaYrJIQVmOYjqMIkfr7fJYgZQhnIlRr-3Xp2QlA1Ak0,7000
274
+ codemie_test_harness/tests/utils/base_utils.py,sha256=WIuwbnmA5xZhb8C40zH59tf4HhjSrOh5cHWDASLTQEU,7044
273
275
  codemie_test_harness/tests/utils/client_factory.py,sha256=xGta0ZaVYzWfwJ4cu3f89KkGc_R5Bq-9lqnhr57x_2w,972
274
276
  codemie_test_harness/tests/utils/confluence_utils.py,sha256=auhip1ntqSDsHWAoWCxQxfuNv05BinS6TWXyg_F2dfc,4544
275
277
  codemie_test_harness/tests/utils/constants.py,sha256=aGs0gdHB38Ozd-UyCKNpWRoQXMy3D0bjmfxiPcdZdqY,1165
276
278
  codemie_test_harness/tests/utils/conversation_utils.py,sha256=SWj6TBWOQoX5Yh6Wk63yHQFveRXgK1mpLb3PUKAa57A,648
277
279
  codemie_test_harness/tests/utils/credentials_manager.py,sha256=xF7fjQbT4b1rPrOOQfo3ie5c06FLjUzppvTaJDVOg2s,55252
278
- codemie_test_harness/tests/utils/datasource_utils.py,sha256=7I37BBD-ySvH9u-y9wjposohqXZG8ksx2CGvbsHK3WY,12707
280
+ codemie_test_harness/tests/utils/datasource_utils.py,sha256=1QthGUSAUPaA9N_pIZkrR0wK4S5r9e4y7ILjQ_0z2Oc,14318
279
281
  codemie_test_harness/tests/utils/env_resolver.py,sha256=25776Aq9oIDcDzGtfFs07lj7eldeFgmsocxeS3RUclE,4280
280
282
  codemie_test_harness/tests/utils/env_utils.py,sha256=9tyVgxKfYqdtSoo9dRTScOZWjAUm82_65JjaKggcwCg,3999
281
283
  codemie_test_harness/tests/utils/file_utils.py,sha256=hY-kwnyzvtd1BQif8r5NhvRTGfpKLmQKyRsq1Tuflhg,585
@@ -293,7 +295,7 @@ codemie_test_harness/tests/utils/search_utils.py,sha256=SrXiB2d9wiI5ka9bgg0CD73G
293
295
  codemie_test_harness/tests/utils/similarity_check.py,sha256=2URqvD3Ft7efwLmhh2iYVsXrYboP9f-_B_ekZmJn0ac,1527
294
296
  codemie_test_harness/tests/utils/user_utils.py,sha256=zJNrmL3Fb7iGuaVRobUMwJ2Og6NqEPcM_9lw60m18T8,242
295
297
  codemie_test_harness/tests/utils/webhook_utils.py,sha256=YjyLwAqQjR12vYFOUmYhJCJIyZvKm4SvU-1oIjIYNqg,340
296
- codemie_test_harness/tests/utils/workflow_utils.py,sha256=tCSJ-6QyumveTP15ZiNzlkBgGxg97GcKV5Kkc02k_Zs,11409
298
+ codemie_test_harness/tests/utils/workflow_utils.py,sha256=bHxPQkblRPF1fZp_AXI36elMFm14nzqGYoU5Eqz4MWY,11553
297
299
  codemie_test_harness/tests/utils/yaml_utils.py,sha256=iIdEl-rUUh1LgzAmD_mjfftthhvlzXyCuA37yBoH0Gw,1617
298
300
  codemie_test_harness/tests/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
301
  codemie_test_harness/tests/webhook/test_webhook_service.py,sha256=POmxQG0tpcNW9-yKQ62CcnQpUEFYlTOs0_4H9MijIHY,8127
@@ -329,7 +331,7 @@ codemie_test_harness/tests/workflow/assistant_tools/plugin/__init__.py,sha256=47
329
331
  codemie_test_harness/tests/workflow/assistant_tools/plugin/test_workflow_with_assistant_with_development_plugin.py,sha256=FBB0Ej0LQxSHuLAwHC-Ew7mAr942TaiI2qIVY5Sze_E,4113
330
332
  codemie_test_harness/tests/workflow/assistant_tools/plugin/test_workflow_with_assistant_with_plugin_and_mcp_servers.py,sha256=hI7Mjy44y_hjR8hIWGNK5WDFR9oNBU4duyQ-t2QcKIg,2882
331
333
  codemie_test_harness/tests/workflow/assistant_tools/project_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
- codemie_test_harness/tests/workflow/assistant_tools/project_management/test_workflow_with_assistant_pm_tools.py,sha256=Xw0T5dOZ1uG1vb15vdjKYgSibhMTmTGWtNPhPozl7d8,1566
334
+ codemie_test_harness/tests/workflow/assistant_tools/project_management/test_workflow_with_assistant_pm_tools.py,sha256=mv_y9HXuaHbDlWuFLFI75JhCbga1ENQQ50nrFI36syU,1664
333
335
  codemie_test_harness/tests/workflow/assistant_tools/report_portal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
336
  codemie_test_harness/tests/workflow/assistant_tools/report_portal/test_workflow_with_assistant_with_report_portal_tools.py,sha256=ch9khNuvBvFjIH5IepcPVA9p-TZ_znpSs5EZC8_kjts,1223
335
337
  codemie_test_harness/tests/workflow/assistant_tools/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -361,7 +363,7 @@ codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_repo
361
363
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_research_tools.py,sha256=lQzzWV6mcKH1_8k4-OxXoI9_hb48JJbYAmDT9bj-WQ0,2558
362
364
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_servicenow_tools.py,sha256=meR9c8BgMTgM6LpwqE0n7ygTCIHGVooMvYfb6kGF7UE,2377
363
365
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_vcs_tools.py,sha256=dbfjHnIhjneW3_JZyElvmswE7omOp0A0EgzoztZ7vow,3098
364
- codemie_test_harness/tests/workflow/test_workflows.py,sha256=HxwY2VKGLvLW2sl3CwR_0xFOmXrLwj_nfGdqnC39CSw,8129
366
+ codemie_test_harness/tests/workflow/test_workflows.py,sha256=335GghMSWEhkC4CNRDHISgU_89MDFpkv4r4Y3vntrFA,8300
365
367
  codemie_test_harness/tests/workflow/virtual_assistant_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
366
368
  codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
367
369
  codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/test_workflow_with_keycloak_tool.py,sha256=eLM804LRG-Rd5ZIgrO_W53FGoSJ_TxWPKQPtWG598CY,1203
@@ -393,7 +395,7 @@ codemie_test_harness/tests/workflow/virtual_assistant_tools/plugin/__init__.py,s
393
395
  codemie_test_harness/tests/workflow/virtual_assistant_tools/plugin/test_workflow_with_development_plugin.py,sha256=rTf0Ucx2CcKk7snb3hqYqAueXo8OJC3SEh6DzDkof5k,4116
394
396
  codemie_test_harness/tests/workflow/virtual_assistant_tools/plugin/test_workflow_with_plugin_and_mcp_servers.py,sha256=Q3DKdwMsKMy5urVIYU4IJP-z3TMSCYFyodafKEjcPaQ,2882
395
397
  codemie_test_harness/tests/workflow/virtual_assistant_tools/project_management/__init__.py,sha256=64jHPoFuGaohGEe-2iYPlEvB8pOG_ZANKzZRubVC4qQ,56
396
- codemie_test_harness/tests/workflow/virtual_assistant_tools/project_management/test_workflow_with_project_management_tools.py,sha256=l3lodzEyFezf8lQRA4QJk6wk4RyopHRjBE8e98iwUZs,1517
398
+ codemie_test_harness/tests/workflow/virtual_assistant_tools/project_management/test_workflow_with_project_management_tools.py,sha256=aDGDi4IE0yz10G0-QOt7ILbvnqL0OTsNAnCcQEFd4FM,1586
397
399
  codemie_test_harness/tests/workflow/virtual_assistant_tools/report_portal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
398
400
  codemie_test_harness/tests/workflow/virtual_assistant_tools/report_portal/test_workflow_with_report_portal_tool.py,sha256=Rs9dGwNAcPjkrLDAuHnmyRdrvGS1l-16aNoAjS431II,1280
399
401
  codemie_test_harness/tests/workflow/virtual_assistant_tools/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -402,7 +404,7 @@ codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/__init__.
402
404
  codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/test_workflow_with_servicenow_tools.py,sha256=D835gaRbCnB4va5mi9TdA_u9StSpGXQ_fgzwW0S2pwo,1173
403
405
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
404
406
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/test_workflow_with_vcs_tools.py,sha256=Se9imIiBYuJU78m1pLu0g4ZmHygKZjr6JjIWkGXTy1Q,1364
405
- codemie_test_harness-0.1.214.dist-info/METADATA,sha256=P60BQniiZByraDIAxld3bYLAQ1l5dhPAk8OLFvxwKVs,27184
406
- codemie_test_harness-0.1.214.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
407
- codemie_test_harness-0.1.214.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
408
- codemie_test_harness-0.1.214.dist-info/RECORD,,
407
+ codemie_test_harness-0.1.216.dist-info/METADATA,sha256=fKeAEuW49ob_i-nA7XkkBXKG8ml_33f7MbkPiwg3ZAQ,27184
408
+ codemie_test_harness-0.1.216.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
409
+ codemie_test_harness-0.1.216.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
410
+ codemie_test_harness-0.1.216.dist-info/RECORD,,