alita-sdk 0.3.344__py3-none-any.whl → 0.3.345__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 alita-sdk might be problematic. Click here for more details.
- alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +11 -3
- alita_sdk/tools/figma/api_wrapper.py +43 -10
- alita_sdk/tools/github/github_client.py +13 -10
- alita_sdk/tools/testrail/api_wrapper.py +83 -9
- {alita_sdk-0.3.344.dist-info → alita_sdk-0.3.345.dist-info}/METADATA +2 -2
- {alita_sdk-0.3.344.dist-info → alita_sdk-0.3.345.dist-info}/RECORD +9 -9
- {alita_sdk-0.3.344.dist-info → alita_sdk-0.3.345.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.344.dist-info → alita_sdk-0.3.345.dist-info}/licenses/LICENSE +0 -0
- {alita_sdk-0.3.344.dist-info → alita_sdk-0.3.345.dist-info}/top_level.txt +0 -0
|
@@ -36,15 +36,23 @@ class AlitaPowerPointLoader:
|
|
|
36
36
|
def read_pptx_slide(self, slide, index):
|
|
37
37
|
text_content = f'Slide: {index}\n'
|
|
38
38
|
for shape in slide.shapes:
|
|
39
|
-
if hasattr(shape, "
|
|
40
|
-
|
|
39
|
+
if hasattr(shape, "text_frame") and shape.text_frame is not None:
|
|
40
|
+
for paragraph in shape.text_frame.paragraphs:
|
|
41
|
+
for run in paragraph.runs:
|
|
42
|
+
if run.hyperlink and run.hyperlink.address:
|
|
43
|
+
link_text = run.text.strip() or "Link"
|
|
44
|
+
link_url = run.hyperlink.address
|
|
45
|
+
text_content += f" [{link_text}]({link_url}) "
|
|
46
|
+
else:
|
|
47
|
+
text_content += run.text
|
|
48
|
+
text_content += "\n"
|
|
41
49
|
elif self.extract_images and shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
|
|
42
50
|
try:
|
|
43
51
|
caption = perform_llm_prediction_for_image_bytes(shape.image.blob, self.llm)
|
|
44
52
|
except:
|
|
45
53
|
caption = "unknown"
|
|
46
54
|
text_content += "\n**Image Transcript:**\n" + caption + "\n--------------------\n"
|
|
47
|
-
return text_content
|
|
55
|
+
return text_content + "\n"
|
|
48
56
|
|
|
49
57
|
def load(self):
|
|
50
58
|
if not self.file_path:
|
|
@@ -227,9 +227,9 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
227
227
|
self._log_tool_event(f"Loading files: {file_keys_include}")
|
|
228
228
|
for file_key in file_keys_include:
|
|
229
229
|
self._log_tool_event(f"Loading file `{file_key}`")
|
|
230
|
-
file = self._client.get_file(file_key)
|
|
230
|
+
file = self._client.get_file(file_key, geometry='depth=1') # fetch only top-level structure (only pages without inner components)
|
|
231
231
|
if not file:
|
|
232
|
-
raise ToolException(f"Unexpected error while retrieving file {file_key}.
|
|
232
|
+
raise ToolException(f"Unexpected error while retrieving file {file_key}. Please try specifying the node-id of an inner page.")
|
|
233
233
|
metadata = {
|
|
234
234
|
'id': file_key,
|
|
235
235
|
'file_key': file_key,
|
|
@@ -284,20 +284,47 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
284
284
|
for child in node['children']:
|
|
285
285
|
texts.extend(self.get_texts_recursive(child))
|
|
286
286
|
return texts
|
|
287
|
+
|
|
288
|
+
def _load_pages(self, document: Document):
|
|
289
|
+
file_key = document.metadata.get('id', '')
|
|
290
|
+
node_ids_include = document.metadata.pop('figma_pages_include', [])
|
|
291
|
+
node_ids_exclude = document.metadata.pop('figma_pages_exclude', [])
|
|
292
|
+
self._log_tool_event(f"Included pages: {node_ids_include}. Excluded pages: {node_ids_exclude}.")
|
|
293
|
+
if node_ids_include:
|
|
294
|
+
# try to fetch only specified pages/nodes in one request
|
|
295
|
+
file = self._get_file_nodes(file_key,','.join(node_ids_include)) # attempt to fetch only specified pages/nodes in one request
|
|
296
|
+
if file:
|
|
297
|
+
return [node['document'] for node in file.get('nodes', {}).values() if 'document' in node]
|
|
298
|
+
else:
|
|
299
|
+
#
|
|
300
|
+
file = self._client.get_file(file_key)
|
|
301
|
+
if file:
|
|
302
|
+
figma_pages = file.document.get('children', [])
|
|
303
|
+
return [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') not in node_ids_exclude)]
|
|
304
|
+
# fallback to loading all pages and filtering them one by one
|
|
305
|
+
file = self._client.get_file(file_key, geometry='depth=1')
|
|
306
|
+
if not file:
|
|
307
|
+
raise ToolException(
|
|
308
|
+
f"Unexpected error while retrieving file {file_key}. Please try specifying the node-id of an inner page.")
|
|
309
|
+
figma_pages_raw = file.document.get('children', [])
|
|
310
|
+
# extract pages one by one
|
|
311
|
+
if node_ids_include:
|
|
312
|
+
return [self._get_file_nodes(file_key, node_id) for node_id in node_ids_include]
|
|
313
|
+
else:
|
|
314
|
+
# return [self._get_file_nodes(file_key, page["id"]) for page in figma_pages_raw if ('id' in page and page['id'].replace(':', '-') not in node_ids_exclude)]
|
|
315
|
+
result = []
|
|
316
|
+
for page in figma_pages_raw:
|
|
317
|
+
if 'id' in page and page['id'].replace(':', '-') not in node_ids_exclude:
|
|
318
|
+
page_res = self._get_file_nodes(file_key, page["id"]).get('nodes', {}).get(page["id"], {}).get("document", {})
|
|
319
|
+
result.append(page_res)
|
|
320
|
+
return result
|
|
287
321
|
|
|
288
322
|
def _process_document(self, document: Document) -> Generator[Document, None, None]:
|
|
289
323
|
file_key = document.metadata.get('id', '')
|
|
290
324
|
self._log_tool_event(f"Loading details (images) for `{file_key}`")
|
|
291
|
-
figma_pages = self.
|
|
292
|
-
node_ids_include = document.metadata.pop('figma_pages_include', [])
|
|
293
|
-
node_ids_exclude = document.metadata.pop('figma_pages_exclude', [])
|
|
325
|
+
figma_pages = self._load_pages(document)
|
|
294
326
|
node_types_include = [t.strip().lower() for t in document.metadata.pop('figma_nodes_include', [])]
|
|
295
327
|
node_types_exclude = [t.strip().lower() for t in document.metadata.pop('figma_nodes_exclude', [])]
|
|
296
|
-
self._log_tool_event(f"Included pages: {node_ids_include}. Excluded pages: {node_ids_exclude}.")
|
|
297
|
-
if node_ids_include:
|
|
298
|
-
figma_pages = [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') in node_ids_include)]
|
|
299
|
-
elif node_ids_exclude:
|
|
300
|
-
figma_pages = [node for node in figma_pages if ('id' in node and node['id'].replace(':', '-') not in node_ids_exclude)]
|
|
301
328
|
|
|
302
329
|
image_nodes = []
|
|
303
330
|
text_nodes = {}
|
|
@@ -609,6 +636,12 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
|
|
|
609
636
|
f"files/{file_key}/nodes?ids={str(ids)}", method="get"
|
|
610
637
|
)
|
|
611
638
|
|
|
639
|
+
def _get_file_nodes(self, file_key: str, ids: str, **kwargs):
|
|
640
|
+
"""Reads a specified file nodes by field key from Figma."""
|
|
641
|
+
return self._client.api_request(
|
|
642
|
+
f"files/{file_key}/nodes?ids={str(ids)}", method="get"
|
|
643
|
+
)
|
|
644
|
+
|
|
612
645
|
@process_output
|
|
613
646
|
def get_file(
|
|
614
647
|
self,
|
|
@@ -87,7 +87,6 @@ class GitHubClient(BaseModel):
|
|
|
87
87
|
|
|
88
88
|
# Using optional variables with None defaults instead of PrivateAttr
|
|
89
89
|
github_api: Optional[Github] = Field(default=None, exclude=True)
|
|
90
|
-
github_repo_instance: Optional[Repository.Repository] = Field(default=None, exclude=True)
|
|
91
90
|
|
|
92
91
|
# Adding auth config and repo config as optional fields for initialization
|
|
93
92
|
auth_config: Optional[GitHubAuthConfig] = Field(default=None, exclude=True)
|
|
@@ -96,6 +95,19 @@ class GitHubClient(BaseModel):
|
|
|
96
95
|
# Alita instance
|
|
97
96
|
alita: Optional[Any] = Field(default=None, exclude=True)
|
|
98
97
|
|
|
98
|
+
@property
|
|
99
|
+
def github_repo_instance(self) -> Optional[Repository.Repository]:
|
|
100
|
+
if not hasattr(self, "_github_repo_instance") or self._github_repo_instance is None:
|
|
101
|
+
try:
|
|
102
|
+
if self.github_api and self.github_repository:
|
|
103
|
+
self._github_repo_instance = self.github_api.get_repo(self.github_repository)
|
|
104
|
+
else:
|
|
105
|
+
self._github_repo_instance = None
|
|
106
|
+
except Exception as e:
|
|
107
|
+
# Only raise when accessed, not during initialization
|
|
108
|
+
return ToolException(e)
|
|
109
|
+
return self._github_repo_instance
|
|
110
|
+
|
|
99
111
|
@model_validator(mode='before')
|
|
100
112
|
def initialize_github_client(cls, values):
|
|
101
113
|
"""
|
|
@@ -144,15 +156,6 @@ class GitHubClient(BaseModel):
|
|
|
144
156
|
else:
|
|
145
157
|
values["github_api"] = Github(base_url=values["github_base_url"], auth=auth)
|
|
146
158
|
|
|
147
|
-
# Get repository instance
|
|
148
|
-
if values.get("github_repository"):
|
|
149
|
-
values["github_repo_instance"] = values["github_api"].get_repo(values["github_repository"])
|
|
150
|
-
else:
|
|
151
|
-
# Initialize with default authentication if no auth_config provided
|
|
152
|
-
values["github_api"] = Github(base_url=values.get("github_base_url", DEFAULT_BASE_URL))
|
|
153
|
-
if values.get("github_repository"):
|
|
154
|
-
values["github_repo_instance"] = values["github_api"].get_repo(values["github_repository"])
|
|
155
|
-
|
|
156
159
|
return values
|
|
157
160
|
|
|
158
161
|
@staticmethod
|
|
@@ -10,7 +10,7 @@ from pydantic import SecretStr, create_model, model_validator
|
|
|
10
10
|
from pydantic.fields import Field, PrivateAttr
|
|
11
11
|
from testrail_api import StatusCodeError, TestRailAPI
|
|
12
12
|
|
|
13
|
-
from ..chunkers.code.constants import get_file_extension
|
|
13
|
+
from ..chunkers.code.constants import get_file_extension, image_extensions
|
|
14
14
|
from ..non_code_indexer_toolkit import NonCodeIndexerToolkit
|
|
15
15
|
from ..utils.available_tools_decorator import extend_with_parent_available_tools
|
|
16
16
|
from ...runtime.utils.utils import IndexerKeywords
|
|
@@ -117,6 +117,13 @@ getCases = create_model(
|
|
|
117
117
|
description="A list of case field keys to include in the data output. If None, defaults to ['title', 'id'].",
|
|
118
118
|
),
|
|
119
119
|
),
|
|
120
|
+
suite_id=(Optional[str],
|
|
121
|
+
Field(
|
|
122
|
+
default=None,
|
|
123
|
+
description="[Optional] Suite id for test cases extraction in case "
|
|
124
|
+
"project is in multiple suite mode (setting 3)",
|
|
125
|
+
),
|
|
126
|
+
),
|
|
120
127
|
)
|
|
121
128
|
|
|
122
129
|
getCasesByFilter = create_model(
|
|
@@ -323,6 +330,30 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
323
330
|
cls._client = TestRailAPI(url, email, password)
|
|
324
331
|
return super().validate_toolkit(values)
|
|
325
332
|
|
|
333
|
+
def _validate_suite_mode_requirements(self, project_id: str, suite_id: Optional[str] = None) -> None:
|
|
334
|
+
"""
|
|
335
|
+
Validate if project requires suite_id when in multiple suite mode.
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
project_id: The TestRail project ID to check
|
|
339
|
+
suite_id: The suite ID if provided (optional)
|
|
340
|
+
custom_error_msg: Custom error message to use (optional)
|
|
341
|
+
|
|
342
|
+
Raises:
|
|
343
|
+
ToolException: If project is in multiple suite mode and no suite_id is provided
|
|
344
|
+
"""
|
|
345
|
+
if suite_id:
|
|
346
|
+
return # No validation needed if suite_id is already provided
|
|
347
|
+
|
|
348
|
+
try:
|
|
349
|
+
project = self._client.projects.get_project(project_id=project_id)
|
|
350
|
+
# 1 for single suite mode, 2 for single suite + baselines, 3 for multiple suites
|
|
351
|
+
suite_mode = project.get('suite_mode', 1)
|
|
352
|
+
if suite_mode == 3:
|
|
353
|
+
raise ToolException("Project is in multiple suite mode, please provide suite_id to extract test cases.")
|
|
354
|
+
except StatusCodeError as e:
|
|
355
|
+
logger.warning(f"Unable to check project suite mode: {e}")
|
|
356
|
+
|
|
326
357
|
def add_cases(self, add_test_cases_data: str):
|
|
327
358
|
"""Adds new test cases into Testrail per defined parameters.
|
|
328
359
|
add_test_cases_data: str - JSON string which includes list of objects with following parameters:
|
|
@@ -389,7 +420,8 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
389
420
|
return f"Extracted test case:\n{str(extracted_case)}"
|
|
390
421
|
|
|
391
422
|
def get_cases(
|
|
392
|
-
self, project_id: str, output_format: str = "json", keys: Optional[List[str]] = None
|
|
423
|
+
self, project_id: str, output_format: str = "json", keys: Optional[List[str]] = None,
|
|
424
|
+
suite_id: Optional[str] = None
|
|
393
425
|
) -> Union[str, ToolException]:
|
|
394
426
|
"""
|
|
395
427
|
Extracts a list of test cases in the specified format: `json`, `csv`, or `markdown`.
|
|
@@ -410,8 +442,15 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
410
442
|
invalid_keys = [key for key in keys if key not in SUPPORTED_KEYS]
|
|
411
443
|
|
|
412
444
|
try:
|
|
413
|
-
|
|
414
|
-
|
|
445
|
+
# Check if project requires suite_id for multiple suite mode
|
|
446
|
+
self._validate_suite_mode_requirements(
|
|
447
|
+
project_id=project_id,
|
|
448
|
+
suite_id=suite_id
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
extracted_cases = self._client.cases.get_cases(project_id=project_id, suite_id=suite_id)
|
|
452
|
+
# support old versions of testrail_api
|
|
453
|
+
cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
|
|
415
454
|
|
|
416
455
|
if cases is None:
|
|
417
456
|
return ToolException("No test cases found in the extracted data.")
|
|
@@ -466,10 +505,18 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
466
505
|
"json_case_arguments must be a JSON string or dictionary."
|
|
467
506
|
)
|
|
468
507
|
self._log_tool_event(message=f"Extract test cases per filter {params}", tool_name='get_cases_by_filter')
|
|
508
|
+
|
|
509
|
+
# Check if project requires suite_id when not provided in params
|
|
510
|
+
suite_id_in_params = params.get('suite_id', None)
|
|
511
|
+
self._validate_suite_mode_requirements(
|
|
512
|
+
project_id=project_id,
|
|
513
|
+
suite_id=str(suite_id_in_params) if suite_id_in_params else None
|
|
514
|
+
)
|
|
515
|
+
|
|
469
516
|
extracted_cases = self._client.cases.get_cases(
|
|
470
517
|
project_id=project_id, **params
|
|
471
518
|
)
|
|
472
|
-
self._log_tool_event(message=
|
|
519
|
+
self._log_tool_event(message="Test cases were extracted", tool_name='get_cases_by_filter')
|
|
473
520
|
# support old versions of testrail_api
|
|
474
521
|
cases = extracted_cases.get("cases") if isinstance(extracted_cases, dict) else extracted_cases
|
|
475
522
|
|
|
@@ -542,13 +589,21 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
542
589
|
self._include_attachments = kwargs.get('include_attachments', False)
|
|
543
590
|
self._skip_attachment_extensions = kwargs.get('skip_attachment_extensions', [])
|
|
544
591
|
|
|
592
|
+
def _extract_cases_from_response(response):
|
|
593
|
+
"""Extract cases from API response, supporting both old and new testrail_api versions."""
|
|
594
|
+
return response.get('cases', []) if isinstance(response, dict) else response
|
|
595
|
+
|
|
545
596
|
try:
|
|
597
|
+
# Check if project requires suite_id when not provided
|
|
598
|
+
self._validate_suite_mode_requirements(project_id=project_id, suite_id=suite_id)
|
|
599
|
+
|
|
546
600
|
if suite_id:
|
|
547
601
|
resp = self._client.cases.get_cases(project_id=project_id, suite_id=int(suite_id))
|
|
548
|
-
cases = resp.get('cases', [])
|
|
549
602
|
else:
|
|
550
603
|
resp = self._client.cases.get_cases(project_id=project_id)
|
|
551
|
-
|
|
604
|
+
|
|
605
|
+
cases = _extract_cases_from_response(resp)
|
|
606
|
+
|
|
552
607
|
except StatusCodeError as e:
|
|
553
608
|
raise ToolException(f"Unable to extract test cases: {e}")
|
|
554
609
|
# Apply filters
|
|
@@ -603,11 +658,30 @@ class TestrailAPIWrapper(NonCodeIndexerToolkit):
|
|
|
603
658
|
case_id = base_data.get("id")
|
|
604
659
|
|
|
605
660
|
# get a list of attachments for the case
|
|
606
|
-
|
|
661
|
+
attachments_response = self._client.attachments.get_attachments_for_case(case_id=case_id)
|
|
662
|
+
|
|
663
|
+
# Extract attachments from response - handle both old and new API response formats
|
|
664
|
+
if isinstance(attachments_response, dict) and 'attachments' in attachments_response:
|
|
665
|
+
attachments = attachments_response['attachments']
|
|
666
|
+
else:
|
|
667
|
+
attachments = attachments_response if isinstance(attachments_response, list) else []
|
|
607
668
|
|
|
608
669
|
# process each attachment to extract its content
|
|
609
670
|
for attachment in attachments:
|
|
610
|
-
|
|
671
|
+
attachment_name = attachment.get('filename') or attachment.get('name')
|
|
672
|
+
attachment['filename'] = attachment_name
|
|
673
|
+
|
|
674
|
+
# Handle filetype: use existing field if present, otherwise extract from filename
|
|
675
|
+
if 'filetype' not in attachment or not attachment['filetype']:
|
|
676
|
+
file_extension = get_file_extension(attachment_name)
|
|
677
|
+
attachment['filetype'] = file_extension.lstrip('.')
|
|
678
|
+
|
|
679
|
+
# Handle is_image: use existing field if present, otherwise check file extension
|
|
680
|
+
if 'is_image' not in attachment:
|
|
681
|
+
file_extension = get_file_extension(attachment_name)
|
|
682
|
+
attachment['is_image'] = file_extension in image_extensions
|
|
683
|
+
|
|
684
|
+
if get_file_extension(attachment_name) in self._skip_attachment_extensions:
|
|
611
685
|
logger.info(f"Skipping attachment {attachment['filename']} with unsupported extension.")
|
|
612
686
|
continue
|
|
613
687
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alita_sdk
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.345
|
|
4
4
|
Summary: SDK for building langchain agents using resources from Alita
|
|
5
5
|
Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -82,7 +82,7 @@ Requires-Dist: gitpython==3.1.43; extra == "tools"
|
|
|
82
82
|
Requires-Dist: atlassian-python-api~=4.0.7; extra == "tools"
|
|
83
83
|
Requires-Dist: jira==3.8.0; extra == "tools"
|
|
84
84
|
Requires-Dist: qtest-swagger-client==0.0.3; extra == "tools"
|
|
85
|
-
Requires-Dist: testrail-api==1.13.
|
|
85
|
+
Requires-Dist: testrail-api==1.13.4; extra == "tools"
|
|
86
86
|
Requires-Dist: azure-devops==7.1.0b4; extra == "tools"
|
|
87
87
|
Requires-Dist: msrest==0.7.1; extra == "tools"
|
|
88
88
|
Requires-Dist: python-graphql-client~=0.4.3; extra == "tools"
|
|
@@ -63,7 +63,7 @@ alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py,sha256=Nav2cgCQK
|
|
|
63
63
|
alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py,sha256=M2q3YThkps0yAZOjfoLcyE7qycVTYKcXEGtpmp0N6C8,10950
|
|
64
64
|
alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py,sha256=RGHDfleYTn7AAc3H-yFZrjm06L0Ux14ZtEJpFlVBNCA,2474
|
|
65
65
|
alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py,sha256=usSrPnYQ3dDOJDdg6gBDTnBJnHiqjLxd_kvOBfRyVxY,5946
|
|
66
|
-
alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py,sha256=
|
|
66
|
+
alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py,sha256=CHIaUnP2Alu7D1NHxlL5N98iY7Gqm4tA5wHjBYUsQLc,2833
|
|
67
67
|
alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py,sha256=m_7aq-aCFVb4vXZsJNinfN1hAuyy_S0ylRknv_ahxDc,340
|
|
68
68
|
alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py,sha256=CUVVnisxm7b5yZWV6rn0Q3MEEaO1GWNcfnz5yWz8T0k,13283
|
|
69
69
|
alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py,sha256=nI8lyndVZxVAxbjX3yiqyuFQKFE8MjLPyYSyqRWxHqQ,4077
|
|
@@ -236,10 +236,10 @@ alita_sdk/tools/custom_open_api/api_wrapper.py,sha256=sDSFpvEqpSvXHGiBISdQQcUecf
|
|
|
236
236
|
alita_sdk/tools/elastic/__init__.py,sha256=iwnSRppRpzvJ1da2K3Glu8Uu41MhBDCYbguboLkEbW0,2818
|
|
237
237
|
alita_sdk/tools/elastic/api_wrapper.py,sha256=pl8CqQxteJAGwyOhMcld-ZgtOTFwwbv42OITQVe8rM0,1948
|
|
238
238
|
alita_sdk/tools/figma/__init__.py,sha256=W6vIMMkZI2Lmpg6_CRRV3oadaIbVI-qTLmKUh6enqWs,4509
|
|
239
|
-
alita_sdk/tools/figma/api_wrapper.py,sha256=
|
|
239
|
+
alita_sdk/tools/figma/api_wrapper.py,sha256=KbKet1Xvjq1Vynz_jEE1MtEAVtLYNlSCg67u4dfhe90,33681
|
|
240
240
|
alita_sdk/tools/github/__init__.py,sha256=2rHu0zZyZGnLC5CkHgDIhe14N9yCyaEfrrt7ydH8478,5191
|
|
241
241
|
alita_sdk/tools/github/api_wrapper.py,sha256=uDwYckdnpYRJtb0uZnDkaz2udvdDLVxuCh1tSwspsiU,8411
|
|
242
|
-
alita_sdk/tools/github/github_client.py,sha256=
|
|
242
|
+
alita_sdk/tools/github/github_client.py,sha256=IhTYcqByJ_wnYg2GFkLkYaiG2j8kFkL8p8CTIVZwmqY,86598
|
|
243
243
|
alita_sdk/tools/github/graphql_client_wrapper.py,sha256=d3AGjzLGH_hdQV2V8HeAX92dJ4dlnE5OXqUlCO_PBr0,71539
|
|
244
244
|
alita_sdk/tools/github/schemas.py,sha256=TxEWR3SjDKVwzo9i2tLnss_uPAv85Mh7oWjvQvYLDQE,14000
|
|
245
245
|
alita_sdk/tools/github/tool.py,sha256=Jnnv5lenV5ds8AAdyo2m8hSzyJ117HZBjzHC6T1ck-M,1037
|
|
@@ -325,7 +325,7 @@ alita_sdk/tools/sql/models.py,sha256=AKJgSl_kEEz4fZfw3kbvdGHXaRZ-yiaqfJOB6YOj3i0
|
|
|
325
325
|
alita_sdk/tools/testio/__init__.py,sha256=NEvQtzsffqAXryaffVk0GpdcxZQ1AMkfeztnxHwNql4,2798
|
|
326
326
|
alita_sdk/tools/testio/api_wrapper.py,sha256=BvmL5h634BzG6p7ajnQLmj-uoAw1gjWnd4FHHu1h--Q,21638
|
|
327
327
|
alita_sdk/tools/testrail/__init__.py,sha256=Xg4nVjULL_D8JpIXLYXppnwUfGF4-lguFwKHmP5VwxM,4696
|
|
328
|
-
alita_sdk/tools/testrail/api_wrapper.py,sha256=
|
|
328
|
+
alita_sdk/tools/testrail/api_wrapper.py,sha256=kocA4ok7WDN7nGRpH-r7wPiqQaiWfBRrvbHm0Y961L4,36756
|
|
329
329
|
alita_sdk/tools/utils/__init__.py,sha256=W9rCCUPtHCP5nGAbWp0n5jaNA84572aiRoqKneBnaS4,3330
|
|
330
330
|
alita_sdk/tools/utils/available_tools_decorator.py,sha256=IbrdfeQkswxUFgvvN7-dyLMZMyXLiwvX7kgi3phciCk,273
|
|
331
331
|
alita_sdk/tools/utils/content_parser.py,sha256=q0wj__flyFlmzwlvbzAj3wCdHhLXysFbpcpCtrNfsGg,14437
|
|
@@ -350,8 +350,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
|
|
|
350
350
|
alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
|
|
351
351
|
alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
|
|
352
352
|
alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
|
|
353
|
-
alita_sdk-0.3.
|
|
354
|
-
alita_sdk-0.3.
|
|
355
|
-
alita_sdk-0.3.
|
|
356
|
-
alita_sdk-0.3.
|
|
357
|
-
alita_sdk-0.3.
|
|
353
|
+
alita_sdk-0.3.345.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
354
|
+
alita_sdk-0.3.345.dist-info/METADATA,sha256=xKGJO9ArLAkIHbt6Ow6scbFIqtp0cqbqca2NPHVk6ao,19015
|
|
355
|
+
alita_sdk-0.3.345.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
356
|
+
alita_sdk-0.3.345.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
|
|
357
|
+
alita_sdk-0.3.345.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|