Spaces:
Paused
Paused
niwayandm commited on
Commit ·
ebf1ef6
1
Parent(s): 82f122d
Added urllib3 2.5.0 to avoid breaking change affecting hubspot-api-client (removal of HTTPResponse.getheader in 2.6.0); changed docstring python file names
Browse files- python/hubspot_audit.py +7 -7
- python/hubspot_billing.py +5 -5
- python/hubspot_companies.py +9 -9
- python/hubspot_contacts.py +11 -3
- python/hubspot_deals.py +5 -5
- python/hubspot_emails.py +5 -5
- python/hubspot_tickets.py +5 -5
- python/load_hubspot_data.py +3 -3
- requirements.txt +2 -1
python/hubspot_audit.py
CHANGED
|
@@ -2,23 +2,23 @@
|
|
| 2 |
HubSpot Audit → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
# ISO-8601
|
| 12 |
-
python
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
-
python
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import logging
|
| 18 |
import datetime
|
| 19 |
from typing import Dict, List, Optional, Union
|
| 20 |
import re
|
| 21 |
-
from dotenv import
|
| 22 |
from supabase import create_client
|
| 23 |
from supabase_utils import batched_insert, update_sync_metadata
|
| 24 |
from hubspot_utils import (
|
|
@@ -40,7 +40,7 @@ logging.basicConfig(
|
|
| 40 |
)
|
| 41 |
|
| 42 |
# Environment
|
| 43 |
-
|
| 44 |
HUBSPOT_TOKEN = os.getenv("HUBSPOT_TOKEN")
|
| 45 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
| 46 |
SUPABASE_SERVICE_ROLE_KEY = os.getenv("SUPABASE_SERVICE_ROLE_KEY")
|
|
|
|
| 2 |
HubSpot Audit → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_audit
|
| 6 |
+
hubspot_audit.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_audit.py 1754025600000
|
| 11 |
# ISO-8601
|
| 12 |
+
python hubspot_audit.py 2025-08-01T09:30:00Z
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_audit.py 2025-08-01
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import logging
|
| 18 |
import datetime
|
| 19 |
from typing import Dict, List, Optional, Union
|
| 20 |
import re
|
| 21 |
+
from dotenv import dotenv
|
| 22 |
from supabase import create_client
|
| 23 |
from supabase_utils import batched_insert, update_sync_metadata
|
| 24 |
from hubspot_utils import (
|
|
|
|
| 40 |
)
|
| 41 |
|
| 42 |
# Environment
|
| 43 |
+
dotenv()
|
| 44 |
HUBSPOT_TOKEN = os.getenv("HUBSPOT_TOKEN")
|
| 45 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
| 46 |
SUPABASE_SERVICE_ROLE_KEY = os.getenv("SUPABASE_SERVICE_ROLE_KEY")
|
python/hubspot_billing.py
CHANGED
|
@@ -2,16 +2,16 @@
|
|
| 2 |
HubSpot Billing → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
# ISO-8601
|
| 12 |
-
python
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
-
python
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import re
|
|
|
|
| 2 |
HubSpot Billing → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_billing
|
| 6 |
+
hubspot_billing.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_billing.py 1754025600000
|
| 11 |
# ISO-8601
|
| 12 |
+
python hubspot_billing.py 2025-08-01T09:30:00Z
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_billing.py 2025-08-01
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import re
|
python/hubspot_companies.py
CHANGED
|
@@ -2,16 +2,16 @@
|
|
| 2 |
HubSpot Companies → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
# ISO-8601
|
| 12 |
-
python
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
-
python
|
| 15 |
"""
|
| 16 |
|
| 17 |
import os
|
|
@@ -23,7 +23,7 @@ from typing import List, Dict, Optional, Tuple, Union
|
|
| 23 |
|
| 24 |
import httpx
|
| 25 |
import hubspot
|
| 26 |
-
from dotenv import
|
| 27 |
from supabase import create_client
|
| 28 |
from hubspot.crm.companies import ApiException as CompaniesApiException
|
| 29 |
|
|
@@ -31,7 +31,7 @@ from hubspot_utils import (
|
|
| 31 |
try_parse_int, parse_ts, get_property_label_mapping,
|
| 32 |
)
|
| 33 |
from supabase_utils import (
|
| 34 |
-
update_sync_metadata, enrich_supabase_row,
|
| 35 |
batched_insert, fetch_supabase_table,
|
| 36 |
)
|
| 37 |
|
|
@@ -48,7 +48,7 @@ logging.basicConfig(
|
|
| 48 |
# -----------------------------------------------------------------------------
|
| 49 |
# Environment
|
| 50 |
# -----------------------------------------------------------------------------
|
| 51 |
-
|
| 52 |
HUBSPOT_TOKEN = os.getenv("HUBSPOT_TOKEN")
|
| 53 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
| 54 |
SUPABASE_SERVICE_ROLE_KEY = os.getenv("SUPABASE_SERVICE_ROLE_KEY")
|
|
@@ -407,7 +407,7 @@ def upsert_companies(companies: List[Dict]) -> None:
|
|
| 407 |
print(f"{len(rows_to_upsert)} companies to insert/update (out of {len(companies)} read).")
|
| 408 |
|
| 409 |
if rows_to_upsert:
|
| 410 |
-
#
|
| 411 |
batched_insert(supabase_client, "hubspot_companies",
|
| 412 |
rows_to_upsert, batch_size=1000)
|
| 413 |
|
|
|
|
| 2 |
HubSpot Companies → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_companies
|
| 6 |
+
hubspot_companies.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_companies.py 1754025600000
|
| 11 |
# ISO-8601
|
| 12 |
+
python hubspot_companies.py 2025-08-01T09:30:00Z
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_companies.py 2025-08-01
|
| 15 |
"""
|
| 16 |
|
| 17 |
import os
|
|
|
|
| 23 |
|
| 24 |
import httpx
|
| 25 |
import hubspot
|
| 26 |
+
from dotenv import dotenv
|
| 27 |
from supabase import create_client
|
| 28 |
from hubspot.crm.companies import ApiException as CompaniesApiException
|
| 29 |
|
|
|
|
| 31 |
try_parse_int, parse_ts, get_property_label_mapping,
|
| 32 |
)
|
| 33 |
from supabase_utils import (
|
| 34 |
+
update_sync_metadata, enrich_supabase_row, upraw_json_to_supabase,
|
| 35 |
batched_insert, fetch_supabase_table,
|
| 36 |
)
|
| 37 |
|
|
|
|
| 48 |
# -----------------------------------------------------------------------------
|
| 49 |
# Environment
|
| 50 |
# -----------------------------------------------------------------------------
|
| 51 |
+
dotenv()
|
| 52 |
HUBSPOT_TOKEN = os.getenv("HUBSPOT_TOKEN")
|
| 53 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
| 54 |
SUPABASE_SERVICE_ROLE_KEY = os.getenv("SUPABASE_SERVICE_ROLE_KEY")
|
|
|
|
| 407 |
print(f"{len(rows_to_upsert)} companies to insert/update (out of {len(companies)} read).")
|
| 408 |
|
| 409 |
if rows_to_upsert:
|
| 410 |
+
# upraw_json_to_supabase(supabase_client, rows_to_upsert, object_type="companies")
|
| 411 |
batched_insert(supabase_client, "hubspot_companies",
|
| 412 |
rows_to_upsert, batch_size=1000)
|
| 413 |
|
python/hubspot_contacts.py
CHANGED
|
@@ -1,9 +1,17 @@
|
|
| 1 |
"""
|
| 2 |
-
HubSpot
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
"""
|
| 8 |
|
| 9 |
import os
|
|
|
|
| 1 |
"""
|
| 2 |
+
HubSpot Companies → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_contacts
|
| 6 |
+
hubspot_contacts.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
+
|
| 8 |
+
Direct CLI:
|
| 9 |
+
# epoch ms
|
| 10 |
+
python hubspot_contacts.py 1754025600000
|
| 11 |
+
# ISO-8601
|
| 12 |
+
python hubspot_contacts.py 2025-08-01T09:30:00Z
|
| 13 |
+
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_contacts.py 2025-08-01
|
| 15 |
"""
|
| 16 |
|
| 17 |
import os
|
python/hubspot_deals.py
CHANGED
|
@@ -2,16 +2,16 @@
|
|
| 2 |
HubSpot Deals → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
# ISO-8601
|
| 12 |
-
python
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
-
python
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import re
|
|
|
|
| 2 |
HubSpot Deals → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_deals
|
| 6 |
+
hubspot_deals.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_deals.py 1754025600000
|
| 11 |
# ISO-8601
|
| 12 |
+
python hubspot_deals.py 2025-08-01T09:30:00Z
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_deals.py 2025-08-01
|
| 15 |
"""
|
| 16 |
import os
|
| 17 |
import re
|
python/hubspot_emails.py
CHANGED
|
@@ -2,18 +2,18 @@
|
|
| 2 |
HubSpot Emails → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
|
| 12 |
# ISO-8601 (Z or offset)
|
| 13 |
-
python
|
| 14 |
|
| 15 |
# Back-compat date (floors to 00:00:00Z)
|
| 16 |
-
python
|
| 17 |
"""
|
| 18 |
|
| 19 |
import os
|
|
|
|
| 2 |
HubSpot Emails → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_emails
|
| 6 |
+
hubspot_emails.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_emails.py 1754025600000
|
| 11 |
|
| 12 |
# ISO-8601 (Z or offset)
|
| 13 |
+
python hubspot_emails.py 2025-08-01T09:30:00Z
|
| 14 |
|
| 15 |
# Back-compat date (floors to 00:00:00Z)
|
| 16 |
+
python hubspot_emails.py 2025-08-01
|
| 17 |
"""
|
| 18 |
|
| 19 |
import os
|
python/hubspot_tickets.py
CHANGED
|
@@ -2,16 +2,16 @@
|
|
| 2 |
HubSpot Tickets → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
-
import
|
| 6 |
-
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
-
python
|
| 11 |
# ISO-8601
|
| 12 |
-
python
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
-
python
|
| 15 |
"""
|
| 16 |
|
| 17 |
import os
|
|
|
|
| 2 |
HubSpot Tickets → Supabase (incremental since a millisecond cursor)
|
| 3 |
|
| 4 |
Usage from orchestrator:
|
| 5 |
+
import hubspot_tickets
|
| 6 |
+
hubspot_tickets.main(since_ms=<int milliseconds since epoch UTC>)
|
| 7 |
|
| 8 |
Direct CLI:
|
| 9 |
# epoch ms
|
| 10 |
+
python hubspot_tickets.py 1754025600000
|
| 11 |
# ISO-8601
|
| 12 |
+
python hubspot_tickets.py 2025-08-01T09:30:00Z
|
| 13 |
# Back-compat date (floors to 00:00Z)
|
| 14 |
+
python hubspot_tickets.py 2025-08-01
|
| 15 |
"""
|
| 16 |
|
| 17 |
import os
|
python/load_hubspot_data.py
CHANGED
|
@@ -3,11 +3,11 @@ Unified orchestrator for HubSpot → Supabase pipelines with a timestamp cursor.
|
|
| 3 |
|
| 4 |
CLI:
|
| 5 |
# epoch ms
|
| 6 |
-
python
|
| 7 |
# ISO-8601
|
| 8 |
-
python
|
| 9 |
# Back-compat date (floors to 00:00Z)
|
| 10 |
-
python
|
| 11 |
# No arg: defaults to today@00:00Z
|
| 12 |
"""
|
| 13 |
|
|
|
|
| 3 |
|
| 4 |
CLI:
|
| 5 |
# epoch ms
|
| 6 |
+
python load_hubspot_data.py 1754025600000
|
| 7 |
# ISO-8601
|
| 8 |
+
python load_hubspot_data.py 2025-08-01T09:30:00Z
|
| 9 |
# Back-compat date (floors to 00:00Z)
|
| 10 |
+
python load_hubspot_data.py 2025-08-01
|
| 11 |
# No arg: defaults to today@00:00Z
|
| 12 |
"""
|
| 13 |
|
requirements.txt
CHANGED
|
@@ -6,4 +6,5 @@ pandas==2.2.2
|
|
| 6 |
openpyxl==3.1.5
|
| 7 |
phonenumbers
|
| 8 |
tldextract
|
| 9 |
-
rapidfuzz
|
|
|
|
|
|
| 6 |
openpyxl==3.1.5
|
| 7 |
phonenumbers
|
| 8 |
tldextract
|
| 9 |
+
rapidfuzz
|
| 10 |
+
urllib3==2.5.0
|