dhisana 0.0.1.dev248__tar.gz → 0.0.1.dev249__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 (121) hide show
  1. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/PKG-INFO +1 -1
  2. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/setup.py +1 -1
  3. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/apollo_tools.py +31 -13
  4. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/PKG-INFO +1 -1
  5. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_apollo_company_search.py +29 -7
  6. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/README.md +0 -0
  7. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/pyproject.toml +0 -0
  8. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/setup.cfg +0 -0
  9. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/__init__.py +0 -0
  10. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/cli/__init__.py +0 -0
  11. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/cli/cli.py +0 -0
  12. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/cli/datasets.py +0 -0
  13. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/cli/models.py +0 -0
  14. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/cli/predictions.py +0 -0
  15. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/schemas/__init__.py +0 -0
  16. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/schemas/common.py +0 -0
  17. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/schemas/sales.py +0 -0
  18. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/ui/__init__.py +0 -0
  19. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/ui/components.py +0 -0
  20. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/__init__.py +0 -0
  21. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/add_mapping.py +0 -0
  22. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/agent_tools.py +0 -0
  23. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/assistant_tool_tag.py +0 -0
  24. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/built_with_api_tools.py +0 -0
  25. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/cache_output_tools.py +0 -0
  26. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/cache_output_tools_local.py +0 -0
  27. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/check_email_validity_tools.py +0 -0
  28. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/check_for_intent_signal.py +0 -0
  29. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
  30. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/clay_tools.py +0 -0
  31. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/clean_properties.py +0 -0
  32. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/company_utils.py +0 -0
  33. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/compose_salesnav_query.py +0 -0
  34. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/compose_search_query.py +0 -0
  35. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
  36. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/composite_tools.py +0 -0
  37. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/dataframe_tools.py +0 -0
  38. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/domain_parser.py +0 -0
  39. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/email_body_utils.py +0 -0
  40. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/email_parse_helpers.py +0 -0
  41. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/email_provider.py +0 -0
  42. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/enrich_lead_information.py +0 -0
  43. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
  44. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/fetch_openai_config.py +0 -0
  45. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/field_validators.py +0 -0
  46. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/g2_tools.py +0 -0
  47. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_content.py +0 -0
  48. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_custom_message.py +0 -0
  49. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_email.py +0 -0
  50. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_email_response.py +0 -0
  51. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_flow.py +0 -0
  52. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
  53. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
  54. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
  55. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
  56. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/google_custom_search.py +0 -0
  57. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/google_oauth_tools.py +0 -0
  58. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/google_workspace_tools.py +0 -0
  59. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/hubspot_clearbit.py +0 -0
  60. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
  61. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/instantly_tools.py +0 -0
  62. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/linkedin_crawler.py +0 -0
  63. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/lusha_tools.py +0 -0
  64. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/mailgun_tools.py +0 -0
  65. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/mailreach_tools.py +0 -0
  66. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/microsoft365_tools.py +0 -0
  67. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
  68. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openai_helpers.py +0 -0
  69. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
  70. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
  71. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
  72. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
  73. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
  74. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
  75. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/profile.py +0 -0
  76. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/proxy_curl_tools.py +0 -0
  77. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
  78. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/python_function_to_tools.py +0 -0
  79. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/research_lead.py +0 -0
  80. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
  81. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
  82. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/search_router.py +0 -0
  83. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/search_router_jobs.py +0 -0
  84. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/sendgrid_tools.py +0 -0
  85. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serarch_router_local_business.py +0 -0
  86. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
  87. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
  88. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serpapi_google_search.py +0 -0
  89. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
  90. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serpapi_search_tools.py +0 -0
  91. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
  92. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serperdev_local_business.py +0 -0
  93. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/serperdev_search.py +0 -0
  94. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/smtp_email_tools.py +0 -0
  95. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/test_connect.py +0 -0
  96. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/trasform_json.py +0 -0
  97. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/web_download_parse_tools.py +0 -0
  98. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/workflow_code_model.py +0 -0
  99. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/utils/zoominfo_tools.py +0 -0
  100. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/workflow/__init__.py +0 -0
  101. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/workflow/agent.py +0 -0
  102. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/workflow/flow.py +0 -0
  103. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/workflow/task.py +0 -0
  104. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana/workflow/test.py +0 -0
  105. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/SOURCES.txt +0 -0
  106. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/dependency_links.txt +0 -0
  107. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/entry_points.txt +0 -0
  108. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/requires.txt +0 -0
  109. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/src/dhisana.egg-info/top_level.txt +0 -0
  110. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_agent_tools.py +0 -0
  111. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_apollo_lead_search.py +0 -0
  112. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_connectivity.py +0 -0
  113. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_email_body_utils.py +0 -0
  114. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_google_document.py +0 -0
  115. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_hubspot_call_logs.py +0 -0
  116. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_linkedin_serper.py +0 -0
  117. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_mailreach.py +0 -0
  118. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_mcp_connectivity.py +0 -0
  119. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_proxycurl_get_company_search_id.py +0 -0
  120. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_proxycurl_job_count.py +0 -0
  121. {dhisana-0.0.1.dev248 → dhisana-0.0.1.dev249}/tests/test_structured_output_with_mcp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev248
3
+ Version: 0.0.1.dev249
4
4
  Summary: A Python SDK for Dhisana AI Platform
5
5
  Home-page: https://github.com/dhisana-ai/dhisana-python-sdk
6
6
  Author: Admin
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='dhisana',
5
- version='0.0.1-dev248',
5
+ version='0.0.1-dev249',
6
6
  description='A Python SDK for Dhisana AI Platform',
7
7
  author='Admin',
8
8
  author_email='contact@dhisana.ai',
@@ -1485,7 +1485,7 @@ async def search_companies_with_apollo_page(
1485
1485
  # -----------------------------------
1486
1486
  else:
1487
1487
  dynamic_payload = {}
1488
-
1488
+
1489
1489
  # Only add fields if they have values (Apollo doesn't like empty arrays)
1490
1490
  if query.organization_locations:
1491
1491
  dynamic_payload["organization_locations"] = query.organization_locations
@@ -1505,19 +1505,37 @@ async def search_companies_with_apollo_page(
1505
1505
  dynamic_payload["organization_num_employees_ranges"] = employee_ranges
1506
1506
 
1507
1507
  # Add optional parameters only if they have values
1508
+ def _normalize_string_list(value: Any) -> List[str]:
1509
+ if value is None:
1510
+ return []
1511
+ if isinstance(value, str):
1512
+ return [part.strip() for part in value.split(",") if part.strip()]
1513
+ if isinstance(value, list):
1514
+ normalized: List[str] = []
1515
+ for item in value:
1516
+ if item is None:
1517
+ continue
1518
+ text = str(item).strip()
1519
+ if not text:
1520
+ continue
1521
+ normalized.extend([part.strip() for part in text.split(",") if part.strip()])
1522
+ return normalized
1523
+ text = str(value).strip()
1524
+ return [text] if text else []
1525
+
1508
1526
  if query.q_keywords:
1509
- # Split comma-separated keywords into an array for company search
1510
- if isinstance(query.q_keywords, str):
1511
- keyword_tags = [tag.strip() for tag in query.q_keywords.split(",") if tag.strip()]
1512
- else:
1513
- keyword_tags = query.q_keywords
1514
-
1515
- if query.q_organization_keyword_tags:
1516
- dynamic_payload["q_organization_keyword_tags"] = keyword_tags
1517
-
1518
- if query.q_not_organization_keyword_tags:
1519
- dynamic_payload["q_not_organization_keyword_tags"] = query.q_not_organization_keyword_tags
1520
-
1527
+ keywords = _normalize_string_list(query.q_keywords)
1528
+ if keywords:
1529
+ dynamic_payload["q_keywords"] = " ".join(keywords)
1530
+
1531
+ org_keyword_tags = _normalize_string_list(query.q_organization_keyword_tags)
1532
+ if org_keyword_tags:
1533
+ dynamic_payload["q_organization_keyword_tags"] = org_keyword_tags
1534
+
1535
+ not_org_keyword_tags = _normalize_string_list(query.q_not_organization_keyword_tags)
1536
+ if not_org_keyword_tags:
1537
+ dynamic_payload["q_not_organization_keyword_tags"] = not_org_keyword_tags
1538
+
1521
1539
  if query.q_organization_domains:
1522
1540
  dynamic_payload["q_organization_domains_list"] = query.q_organization_domains
1523
1541
  if query.revenue_range_min is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dhisana
3
- Version: 0.0.1.dev248
3
+ Version: 0.0.1.dev249
4
4
  Summary: A Python SDK for Dhisana AI Platform
5
5
  Home-page: https://github.com/dhisana-ai/dhisana-python-sdk
6
6
  Author: Admin
@@ -1,8 +1,6 @@
1
- import asyncio
2
- import json
3
- import pytest
4
1
  import unittest
5
- from unittest.mock import patch, MagicMock, AsyncMock
2
+ from unittest.mock import patch
3
+
6
4
  from src.dhisana.schemas.sales import CompanyQueryFilters
7
5
  from src.dhisana.utils.apollo_tools import (
8
6
  search_companies_with_apollo_page,
@@ -11,7 +9,7 @@ from src.dhisana.utils.apollo_tools import (
11
9
  )
12
10
 
13
11
 
14
- class TestApolloCompanySearch(unittest.TestCase):
12
+ class TestApolloCompanySearch(unittest.IsolatedAsyncioTestCase):
15
13
  """Test cases for Apollo company search functionality."""
16
14
 
17
15
  def setUp(self):
@@ -148,13 +146,37 @@ class TestApolloCompanySearch(unittest.TestCase):
148
146
 
149
147
  # Verify API call was made correctly
150
148
  mock_fetch_data.assert_called_once()
151
- call_args = mock_fetch_data.call_args
152
- payload = call_args[1]["payload"]
149
+ payload = mock_fetch_data.call_args.args[3]
153
150
  self.assertEqual(payload["page"], 1)
154
151
  self.assertEqual(payload["per_page"], 25)
155
152
  self.assertIn("organization_locations", payload)
156
153
  self.assertIn("organization_num_employees_ranges", payload)
157
154
 
155
+ @patch('src.dhisana.utils.apollo_tools.fetch_apollo_data')
156
+ @patch('src.dhisana.utils.apollo_tools.get_apollo_access_token')
157
+ async def test_search_companies_with_apollo_page_accepts_keyword_tags_without_q_keywords(
158
+ self, mock_get_token, mock_fetch_data
159
+ ):
160
+ mock_get_token.return_value = ("test_api_key", False)
161
+ mock_fetch_data.return_value = self.mock_apollo_response
162
+
163
+ query = CompanyQueryFilters(
164
+ q_organization_keyword_tags=["Marketing and Advertising", "Media Production"]
165
+ )
166
+
167
+ await search_companies_with_apollo_page(
168
+ query=query,
169
+ page=1,
170
+ per_page=25,
171
+ tool_config=self.tool_config,
172
+ )
173
+
174
+ payload = mock_fetch_data.call_args.args[3]
175
+ self.assertEqual(
176
+ payload["q_organization_keyword_tags"],
177
+ ["Marketing and Advertising", "Media Production"],
178
+ )
179
+
158
180
  def test_company_query_filters_initialization(self):
159
181
  """Test that CompanyQueryFilters can be initialized with various parameters."""
160
182
  query = CompanyQueryFilters(
File without changes
File without changes