Skip to content

Commit ebfdcc4

Browse files
klaviyo-sdkklaviyo-sdksanfordj
authored
v11.0.0 (#60)
* version 11.0.0 * update changelog and readme --------- Co-authored-by: klaviyo-sdk <klaviyo-sdk@klaviyo.com> Co-authored-by: Jess Sanford <jess.sanford@klaviyo.com>
1 parent 8dfd382 commit ebfdcc4

547 files changed

Lines changed: 62336 additions & 2080 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitkeep

Whitespace-only changes.

CHANGELOG.md

Lines changed: 81 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,85 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
NOTE: For more granular API-specific changes, please see our [API Changelog](https://developers.klaviyo.com/en/docs/changelog_)
99

10+
## [11.0.0] Typed SDK - revision 2024-07-15
11+
12+
### Added
13+
- Typed Responses (Breaking change)
14+
- By default, all API methods will return a type representing the response payload instead of dictionary, as was the case in previous versions of this SDK. Using the typed response, you can access fields of a response using dot notation, like so:
15+
```python
16+
from klaviyo_api import KlaviyoAPI
17+
18+
client = KlaviyoAPI(
19+
api_key,
20+
max_delay=0,
21+
max_retries=0
22+
)
23+
24+
profiles = client.Profiles.get_profiles()
25+
profile_id = profiles.data[0].id
26+
profile = client.Profiles.get_profile(profile_id)
27+
profile_id = profile.data.id
28+
profile_email = profile.data.attributes.email
29+
30+
print(type(profile).__name__) # prints GetProfileResponseCompoundDocument
31+
```
32+
The class used in this example is found [here](src/openapi_client/models/get_profile_response_collection_compound_document.py).
33+
34+
This is a breaking change, as response objects will now require dot notation to access their fields versus the subscriptable access method used for dictionaries, i.e. `profile.data.id` vs `profile['data']['id']`. We have provided a [backwards compatibility strategy](#backwards-compatibility) to smooth the transition from dictionary responses to typed responses.
35+
36+
#### Backwards Compatibility
37+
To maintain backwards compatibility with previous versions of this SDK, we have added an `options` argument that allows you to continue using dictionaries as response values. There are two ways to use this `options` argument:
38+
```python
39+
from klaviyo_api import KlaviyoAPI
40+
from openapi_client.api_arg_options import USE_DICTIONARY_FOR_RESPONSE_DATA
41+
42+
client = KlaviyoAPI(
43+
api_key,
44+
max_delay=0,
45+
max_retries=0
46+
)
47+
48+
49+
# 1: Passing options to an individual API method
50+
profiles = client.Profiles.get_profiles(options= {
51+
USE_DICTIONARY_FOR_RESPONSE_DATA: True
52+
})
53+
profile_id = profiles["data"][0]['id']
54+
profile_email = profiles["data"][0]['attributes']['email']
55+
56+
# 2: Passing options to API Client
57+
dictionary_client = KlaviyoAPI(
58+
api_key,
59+
max_delay=0,
60+
max_retries=0,
61+
options={USE_DICTIONARY_FOR_RESPONSE_DATA : True}
62+
)
63+
profiles_ = dictionary_client.Profiles.get_profiles()
64+
profile_0_id = profiles_["data"][0]['id']
65+
66+
profile_0 = dictionary_client.Profiles.get_profile(id=profile_0_id)
67+
profile_0_email = profile_0["data"]['attributes']['email']
68+
```
69+
The first way will only return a dictionary for that specific `get_profiles` call. The second makes it so that all API methods called using `dictionary_client` will return dictionaries as responses.
70+
71+
- Some API methods still return response data that is not fully typed. See the [Untyped Response Data for Specific APIs](README.md#untyped-response-data-for-specific-apis) in the README for more details.
72+
- Filter Builder - A new class to help construct filter query parameters.
73+
```python
74+
old_date = datetime.datetime(2023, 8, 15, 12, 30, 0, 0, tzinfo=datetime.timezone.utc)
75+
f = FilterBuilder()
76+
f.any("email", ["sarah.mason@klaviyo-demo.com", "sm@klaviyo-demo.com"])
77+
f.greater_than("created", old_date)
78+
79+
# f.build() returns 'any(email,["sarah.mason@klaviyo-demo.com","sm@klaviyo-demo.com"]),greater-than(created,2023-08-15T12:30:00+00:00)'
80+
profile_response = client.Profiles.get_profiles(filter=f.build())
81+
82+
# You can also chain FilterBuilder methods
83+
f = FilterBuilder()
84+
filters = f.any("email", ["sarah.mason@klaviyo-demo.com", "sm@klaviyo-demo.com"]).greater_than("created", date).build()
85+
assert filters == "any(email,['sarah.mason@klaviyo-demo.com','sm@klaviyo-demo.com']),greater-than(created,2023-08-15T12:30:00+00:00)"
86+
```
87+
88+
1089
## [10.0.0] - revision 2024-07-15
1190

1291
### Added
@@ -20,63 +99,7 @@ NOTE: For more granular API-specific changes, please see our [API Changelog](htt
2099
- `klaviyo.Profiles.subscribe()`
21100
- added `historical_import` flag for importing historically consented profiles can now be optionally supplied in the payload for the Subscribe Profiles endpoint.
22101
- When using this flag, a consented_at date must be provided and must be in the past.
23-
24-
## [9.0.0] - revision 2024-06-15
25-
26-
### Added
27-
- Segments Api
28-
- New create segment endpoint `SegmentsApi.createSegment()`.
29-
- New delete segment endpoint `SegementsApi.deleteSegment()`.
30-
- Updated exisiting segments endpoints to include the segment definition
31-
- For more information, see our [Segments API overview](https://developers.klaviyo.com/en/reference/segments_api_overview).
32-
33-
- Flows Api
34-
- New delete flows endpoint `FlowsApi.deleteFlow()`
35-
36-
## [8.0.1] - revision 2024-05-15
37-
38-
### Added
39-
40-
- Fixes issue where `filter` query params for any API call were being duplicated on request send. See issue: https://github.com/klaviyo/klaviyo-api-python/issues/51
41-
42-
## [8.0.0] - revision 2024-05-15
43-
44-
### Added
45-
46-
- Bulk Create Events API with
47-
- We have added support for creating events in bulk via the EventsApi.bulkCreateEvents method
48-
- Create multiple events for new and existing profiles and/or update profile properties in a single API call. For more information, see our [Events API overview](https://developers.klaviyo.com/en/reference/events_api_overview).
49-
50-
### Changed
51-
52-
- Accounts API
53-
- `Accounts.get_account` and `Accounts.get_accounts` have been updated to return the account's locale, e.g. `"en-US"`.
54-
55-
- **Breaking**
56-
- Subscribe API Synchronous Validation Improved
57-
- To provide better feedback for handling SMS subscriptions, we’ve added improved validation behavior to ProfilesApi.subscribeProfiles method. In prior revisions, such requests may appear as 202s but will fail to update SMS consent. To handle this issue, 400 validation errors are returned for the following cases
58-
1. If a profile is subscribed to SMS marketing and [age-gating is enabled](https://help.klaviyo.com/hc/en-us/articles/4408311712667) but age_gated_date_of_birth is not provided, or the DOB does not meet the region's requirements.
59-
2. If the account does not have a sending number in the phone number’s region.
60-
3. If the phone number is in a region not supported by Klaviyo.
61-
4. If consented_at is set and the list or global setting is double opt-in.
62-
- Pydantic V2
63-
- This SDK now uses Pydantic V2. This may cause some compatibility issues if your source code depends on Pydantic V1.
64-
- Renamed Fields in SDK
65-
- As of the 2024-05-15 release, some models fields are named differently than they appear in API documentation. These fields are
66-
- `datetime`: renamed to `datetime_`
67-
- `date`: renamed to `date_`
68-
69-
This is to manage compatibility with Pydantic v2. An example of this can be seen in [StaticScheduleOptions](src/openapi_client/models/static_schedule_options.py).
70-
71-
```python
72-
class StaticScheduleOptions(BaseModel):
73-
"""
74-
StaticScheduleOptions
75-
""" # noqa: E501
76-
datetime_: datetime = Field(description="The time to send at", alias="datetime")
77-
78-
schedule_options = StaticScheduleOptions(datetime_=datetime.datetime.strptime("2024-05-19T00:00:00+00:00", "%Y-%m-%dT%H:%M:%S%z")
79-
print(schedule_options.datetime_)
102+
80103

81104
## [7.0.0] - revision 2024-02-15
82105

@@ -351,4 +374,4 @@ For EmailMarketing:
351374
- client name: `Client``KlaviyoAPI`
352375
- Client variable name in readme examples: `client``klaviyo`
353376
- Some functions have changed name
354-
- New resources and endpoints: see [API Changelog](https://developers.klaviyo.com/en/docs/changelog_) for full details
377+
- New resources and endpoints: see [API Changelog](https://developers.klaviyo.com/en/docs/changelog_) for full details

README.md

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Klaviyo Python SDK
22

3-
- SDK version: 10.0.0
3+
- SDK version: 11.0.0
44
- API revision: 2024-07-15
55

66
## Table of Contents
@@ -44,6 +44,10 @@
4444
* [Parameters & Arguments](#parameters--arguments)
4545
* [Namespace](#namespace)
4646
* [Renamed Fields](#renamed-fields)
47+
* [Filter Builder](#filter-builder)
48+
* [Typed Responses](#typed-responses)
49+
* [Backwards Compatibility](#backwards-compatibility)
50+
* [Untyped Response Data for Specific APIs](#untyped-response-data-for-specific-apis)
4751
<!-- TOC -->
4852

4953
## Helpful Resources
@@ -3918,4 +3922,116 @@ class StaticScheduleOptions(BaseModel):
39183922
```python
39193923
schedule_options = StaticScheduleOptions(datetime_=datetime.datetime.strptime("2024-05-19T00:00:00+00:00", "%Y-%m-%dT%H:%M:%S%z")
39203924
print(schedule_options.datetime_)
3921-
```
3925+
```
3926+
3927+
## Filter Builder
3928+
Use this class to help construct filter query parameters.
3929+
```python
3930+
old_date = datetime.datetime(2023, 8, 15, 12, 30, 0, 0, tzinfo=datetime.timezone.utc)
3931+
3932+
f = FilterBuilder()
3933+
f.any("email", ["sarah.mason@klaviyo-demo.com", "sm@klaviyo-demo.com"])
3934+
f.greater_than("created", old_date)
3935+
3936+
# f.build() returns 'any(email,["sarah.mason@klaviyo-demo.com","sm@klaviyo-demo.com"]),greater-than(created,2023-08-15T12:30:00+00:00)'
3937+
profile_response = client.Profiles.get_profiles(filter=f.build())
3938+
3939+
# You can also chain FilterBuilder methods
3940+
f = FilterBuilder()
3941+
filters = f.any("email", ["sarah.mason@klaviyo-demo.com", "sm@klaviyo-demo.com"]).greater_than("created", date).build()
3942+
assert filters == "any(email,['sarah.mason@klaviyo-demo.com','sm@klaviyo-demo.com']),greater-than(created,2023-08-15T12:30:00+00:00)"
3943+
```
3944+
3945+
## Typed Responses
3946+
By default, all API methods will return a type representing the response payload instead of dictionary, as was the case in previous versions of this SDK. Using the typed response, you can access fields of a response using dot notation, like so:
3947+
```python
3948+
from klaviyo_api import KlaviyoAPI
3949+
3950+
client = KlaviyoAPI(
3951+
api_key,
3952+
max_delay=0,
3953+
max_retries=0
3954+
)
3955+
3956+
profiles = client.Profiles.get_profiles()
3957+
profile_id = profiles.data[0].id
3958+
profile = client.Profiles.get_profile(profile_id)
3959+
profile_id = profile.data.id
3960+
profile_email = profile.data.attributes.email
3961+
3962+
print(type(profile).__name__) # prints GetProfileResponseCompoundDocument
3963+
```
3964+
The class used in this example is found [here](src/openapi_client/models/get_profile_response_collection_compound_document.py).
3965+
3966+
This is a breaking change, as response objects will now require dot notation to access their fields versus the subscriptable access method used for dictionaries, i.e. `profile.data.id` vs `profile['data']['id']`. We have provided a [backwards compatibility strategy](#backwards-compatibility) to smooth the transition from dictionary responses to typed responses.
3967+
3968+
### Backwards Compatibility
3969+
To maintain backwards compatibility with previous versions of this SDK, we have added an `options` argument that allows you to continue using dictionaries as response values. There are two ways to use this `options` argument:
3970+
```python
3971+
from klaviyo_api import KlaviyoAPI
3972+
from openapi_client.api_arg_options import USE_DICTIONARY_FOR_RESPONSE_DATA
3973+
3974+
client = KlaviyoAPI(
3975+
api_key,
3976+
max_delay=0,
3977+
max_retries=0
3978+
)
3979+
3980+
# 1: Passing options to an individual API method
3981+
profiles = client.Profiles.get_profiles(options= {
3982+
USE_DICTIONARY_FOR_RESPONSE_DATA: True
3983+
})
3984+
profile_id = profiles["data"][0]['id']
3985+
profile_email = profiles["data"][0]['attributes']['email']
3986+
3987+
# 2: Passing options to API Client
3988+
dictionary_client = KlaviyoAPI(
3989+
api_key,
3990+
max_delay=0,
3991+
max_retries=0,
3992+
options={USE_DICTIONARY_FOR_RESPONSE_DATA : True}
3993+
)
3994+
profiles_ = dictionary_client.Profiles.get_profiles()
3995+
profile_0_id = profiles_["data"][0]['id']
3996+
3997+
profile_0 = dictionary_client.Profiles.get_profile(id=profile_0_id)
3998+
profile_0_email = profile_0["data"]['attributes']['email']
3999+
```
4000+
The first way will only return a dictionary for that specific `get_profiles` call. The second makes it so that all API methods called using `dictionary_client` will return dictionaries as responses.
4001+
4002+
## Untyped Response Data for Specific APIs
4003+
Select APIs do not yet have fully typed responses. Please use our API docs to inspect the schema of the response data for the following APIs.
4004+
- **Segments** - The subproperty `conditions` is not yet typed in responses for the following APIs:
4005+
- [Create Segment](https://developers.klaviyo.com/en/reference/create_segment)
4006+
- [Update Segment](https://developers.klaviyo.com/en/reference/update_segment)
4007+
- [Get Segment](https://developers.klaviyo.com/en/reference/get_segment)
4008+
- [Get Segments](https://developers.klaviyo.com/en/reference/get_segments)
4009+
- The `included` property is not typed in responses for the following APIs:
4010+
- [Get Event](https://developers.klaviyo.com/en/reference/get_event)
4011+
- [Get Events](https://developers.klaviyo.com/en/reference/get_events)
4012+
- [Get Profile](https://developers.klaviyo.com/en/reference/get_profile)
4013+
- [Get Profiles](https://developers.klaviyo.com/en/reference/get_profiles)
4014+
- [Get Flow](https://developers.klaviyo.com/en/reference/get_flow)
4015+
- [Get Flows](https://developers.klaviyo.com/en/reference/get_flows)
4016+
- [Get Flow Message](https://developers.klaviyo.com/en/reference/get_flow_message)
4017+
- [Get Campaign](https://developers.klaviyo.com/en/reference/get_campaign)
4018+
- [Get Campaigns](https://developers.klaviyo.com/en/reference/get_campaigns)
4019+
- The `tracking_options` subproperty is not typed in responses for the following APIs:
4020+
- [Get Flow Action](https://developers.klaviyo.com/en/reference/get_flow_action)
4021+
- [Get Flow Actions](https://developers.klaviyo.com/en/reference/get_flow_flow_actions)
4022+
- [Create Campaign](https://developers.klaviyo.com/en/reference/create_campaign)
4023+
- [Update Campaign](https://developers.klaviyo.com/en/reference/update_campaign)
4024+
- [Get Campaign](https://developers.klaviyo.com/en/reference/get_campaign)
4025+
- [Get Campaigns](https://developers.klaviyo.com/en/reference/get_campaigns)
4026+
- The `send_options` subproperty is not typed in responses for the following APIs:
4027+
- [Create Campaign](https://developers.klaviyo.com/en/reference/create_campaign)
4028+
- [Update Campaign](https://developers.klaviyo.com/en/reference/update_campaign)
4029+
- [Get Campaign](https://developers.klaviyo.com/en/reference/get_campaign)
4030+
- [Get Campaigns](https://developers.klaviyo.com/en/reference/get_campaigns)
4031+
- [Get Campaign Message](https://developers.klaviyo.com/en/reference/get_campaign_message_campaign)
4032+
- [Get Campaign Messages](https://developers.klaviyo.com/en/reference/get_campaign_campaign_messages)
4033+
- The `content` subproperty is not typed in responses for the following APIs:
4034+
- [Get Flow Message](https://developers.klaviyo.com/en/reference/get_flow_message)
4035+
- [Get Flow Action Messages](https://developers.klaviyo.com/en/reference/get_flow_action_messages)
4036+
- [Get Campaign Message](https://developers.klaviyo.com/en/reference/get_campaign_message_campaign)
4037+
- [Get Campaign Messages](https://developers.klaviyo.com/en/reference/get_campaign_campaign_messages)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "openapi_client"
3-
version = "10.0.0"
3+
version = "11.0.0"
44
description = "Klaviyo API"
55
authors = ["Klaviyo Developer Experience Team <developers@klaviyo.com>"]
66
license = "License"

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = klaviyo-api
3-
version = 10.0.0
3+
version = 11.0.0
44
author = Klaviyo Developers
55
author_email = developers@klaviyo.com
66
description = Klaviyo Python SDK

0 commit comments

Comments
 (0)