Skip to content

Commit 249005a

Browse files
authored
Merge pull request #55 from mailerlite/bugfix/issue-30/missing-endpoint
Bugfix/issue 30/missing endpoint
2 parents 2e7352a + b1a84cd commit 249005a

9 files changed

+205
-181
lines changed

Diff for: mailerlite/sdk/segments.py

+37-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,42 @@ def list(self, **kwargs):
3232

3333
return self.api_client.request("GET", self.base_api_url, query_params).json()
3434

35+
def get(self, segment_id, **kwargs):
36+
"""
37+
Get a segment
38+
39+
Returns information about a segment.
40+
Ref: https://developers.mailerlite.com/docs/segments.html#get-subscribers-belonging-to-a-segment
41+
42+
:param segment_id: int Segment ID
43+
:param **kwargs: dict You can pass additional arguments - after, limit or filter by status
44+
:raises: :class: `TypeError` : Got an unknown argument
45+
:raises: :class: `TypeError` : `segment_id` type is not valid
46+
:return: JSON array
47+
:rtype: dict
48+
"""
49+
50+
if not isinstance(segment_id, int):
51+
raise TypeError(
52+
f"`segment_id` type is not valid. Expected `int`, got {type(segment_id)}."
53+
)
54+
55+
if not isinstance(segment_id, int):
56+
raise TypeError("Segment ID are not valid.")
57+
58+
available_params = ["filter", "limit", "after"]
59+
60+
params = locals()
61+
query_params = {}
62+
for key, val in params["kwargs"].items():
63+
if key not in available_params:
64+
raise TypeError("Got an unknown argument '%s'" % key)
65+
query_params[key] = val
66+
67+
return self.api_client.request(
68+
"GET", f"{self.base_api_url}/{segment_id}", query_params
69+
).json()
70+
3571
def get_subscribers(self, segment_id, **kwargs):
3672
"""
3773
Get subscribers belonging to a segment
@@ -65,7 +101,7 @@ def get_subscribers(self, segment_id, **kwargs):
65101
query_params[key] = val
66102

67103
return self.api_client.request(
68-
"GET", f"{self.base_api_url}/{segment_id}", query_params
104+
"GET", f"{self.base_api_url}/{segment_id}/subscribers", query_params
69105
).json()
70106

71107
def update(self, segment_id, name):

Diff for: pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
authors = ["MailerLite <[email protected]>"]
33
description = "The official MailerLite Python SDK"
44
name = "mailerlite"
5-
version = "0.1.7"
5+
version = "0.1.8"
66

77
[tool.poetry.dependencies]
88
python = "^3.7"

Diff for: setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from setuptools import find_packages, setup
22

3-
__version__ = "0.1.7"
3+
__version__ = "0.1.8"
44

55

66
def _read_long_description():

Diff for: tests/segments_test.py

+33-19
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import string
44

55
import mailerlite as MailerLite
6-
import mailerlite.sdk.segments as Segments
76
import pytest
87
import vcr
98
from dotenv import load_dotenv
@@ -68,21 +67,36 @@ def test_given_incorrect_segment_id_when_calling_get_subscribers_list_then_type_
6867
self.client.segments.get_subscribers("1234")
6968

7069
@vcr.use_cassette(
71-
"tests/vcr_cassettes/segments-get-subscribers.yml",
70+
"tests/vcr_cassettes/segments-get.yml",
7271
filter_headers=["Authorization"],
7372
)
74-
def test_given_valid_segment_id_when_calling_get_subscribers_list_of_subscribers_in_segment_is_returned(
73+
def test_given_valid_segment_id_when_calling_get_segment_is_returned(
7574
self, segment_keys
7675
):
7776
if pytest.entity_id and pytest.entity_id == 0:
7877
pytest.skip("segment_id is not set")
7978

80-
response = self.client.segments.get_subscribers(pytest.entity_id)
79+
response = self.client.segments.get(pytest.entity_id)
8180

8281
assert isinstance(response, dict)
8382
assert isinstance(response["data"], dict)
8483
assert set(segment_keys).issubset(response["data"].keys())
8584

85+
@vcr.use_cassette(
86+
"tests/vcr_cassettes/segments-get-subscribers.yml",
87+
filter_headers=["Authorization"],
88+
)
89+
def test_given_valid_segment_id_when_calling_get_subscribers_list_of_subscribers_in_segment_is_returned(
90+
self, subscriber_keys
91+
):
92+
if pytest.entity_id and pytest.entity_id == 0:
93+
pytest.skip("segment_id is not set")
94+
95+
response = self.client.segments.get_subscribers(pytest.entity_id)
96+
97+
assert isinstance(response, dict)
98+
assert set(subscriber_keys).issubset(response["data"][0].keys())
99+
86100
def test_given_incorrect_segment_id_when_calling_update_then_type_error_is_returned(
87101
self,
88102
):
@@ -100,12 +114,12 @@ def test_given_invalid_name_when_calling_update_then_segment_update_will_fail(se
100114
"tests/vcr_cassettes/segments-update.yml", filter_headers=["Authorization"]
101115
)
102116
def test_given_valid_name_and_segment_id_when_calling_update_then_segment_is_updated(
103-
self, segment_keys
117+
self,
104118
):
105119
if pytest.entity_id and pytest.entity_id == 0:
106120
pytest.skip("segment_id is not set")
107121

108-
name = "New Test Segment Name"
122+
name = "New Name"
109123
response = self.client.segments.update(pytest.entity_id, name)
110124

111125
assert response is True
@@ -121,20 +135,20 @@ def test_given_incorrect_segment_id_when_calling_delete_then_type_error_is_retur
121135
with pytest.raises(TypeError):
122136
self.client.segments.delete("1234")
123137

124-
@vcr.use_cassette(
125-
"tests/vcr_cassettes/segments-delete.yml", filter_headers=["Authorization"]
126-
)
127-
def test_given_valid_segment_id_when_calling_id_then_segment_is_removed(
128-
self, segment_keys
129-
):
130-
if pytest.entity_id and pytest.entity_id == 0:
131-
pytest.skip("segment_id is not set")
138+
# @vcr.use_cassette(
139+
# "tests/vcr_cassettes/segments-delete.yml", filter_headers=["Authorization"]
140+
# )
141+
# def test_given_valid_segment_id_when_calling_id_then_segment_is_removed(
142+
# self, segment_keys
143+
# ):
144+
# if pytest.entity_id and pytest.entity_id == 0:
145+
# pytest.skip("segment_id is not set")
132146

133-
response = self.client.segments.delete(pytest.entity_id)
147+
# response = self.client.segments.delete(pytest.entity_id)
134148

135-
assert response is True
149+
# assert response is True
136150

137-
segment_id = 123123
138-
response = self.client.segments.delete(segment_id)
151+
# segment_id = 123123
152+
# response = self.client.segments.delete(segment_id)
139153

140-
assert response is False
154+
# assert response is False

Diff for: tests/vcr_cassettes/segments-delete.yml

-100
This file was deleted.

Diff for: tests/vcr_cassettes/segments-get-subscribers.yml

+25-14
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,27 @@ interactions:
1313
User-Agent:
1414
- MailerLite-Python-SDK-Client
1515
method: GET
16-
uri: https://connect.mailerlite.com/api/segments/75123062193784148
16+
uri: https://connect.mailerlite.com/api/segments/139794711363717070/subscribers
1717
response:
1818
body:
1919
string: !!binary |
20-
H4sIAAAAAAAAA1zMwQqCUBCF4VeRA+2ucGfUtHmHVrWXi04i6VV0NiG+exgtou35P86GNliAbOhb
21-
CMqCOPNnpktWVjnlFRxiGBWC6yu562rJTbtRo8HBJgsDhBymWWO9BNPj6DFMwT7zaksfOwjI+xN2
22-
h2bom+c/9D/wyxYNpm19VLBnTolTpoRKoUKyHPv+BgAA//8DAJtH/Jq4AAAA
20+
H4sIAAAAAAAAA+xVXWvbMBT9K+XC3txG8kccC8Y22lE61oZ1pStdilFkJVFjS0IfpW3Ifx+OG8cJ
21+
3VrG9jDYm871PZbuOT7WAgrqKJDvCxAFEMBRlmYY4wGOsz5OozSCAHhFRQkExB2V9P3MMD4/MBYC
22+
sI46b4EAZU7c8bqivGG87q20Mq6ucOmAoACU5tLmTPknzErB5t1C3ZAb6vjm8QYKndOiMNxaINKX
23+
ZQDWjy0zYsyLnDogEKIw3sfhPor3cEjCPokyCMDLnb6GzAyn7gWmLl5qmQheFhbIAiSt+PrdJbUu
24+
7xaYqjSVDxvopTMbKFy71jMlW1qtbgsec5HrBiwDmBrlte3YhtJ+jPsoCRMcI5QhBMHTmeDYeE1D
25+
CJ5MWgseNdasYbxjULzlxwImpaqFwPWxjJDT1aboDSyfMbJrXctEHWbD27Jmw/aSKTkRptqqjpWX
26+
bKty6+W8u+mOo1FtF072cELiiCQxLG/qkeoWITtfgtJOyFy02m4pmmQ4DZMBzgYrv9sgTJV5ZQ4q
27+
Kj0t2xyEOzKHv84BRr+ZhO3pY/z6JDzH/FkSMEliEg+eSQIcGT8VeydTZeB/Iv7pRNwEUAo5X5k7
28+
Eca67n+utcnwu/Va8vt6x5lz2pJRb9RjSkrO3EGdHm5K4fgBU9WoR7UY9SyfVlw6O+qt7p44xTjq
29+
RylOUYpGvVYPY98xb6wyb/nDJ319eNI/vfgQnd1+uT+7mN+fPZ7g4dHHZHh0mnw+/DRhx5key/PH
30+
y+NseH01Q1+vzsvx1akYyvOH4ttlVotd8friW4CmbvYXjgsBaG5yTaccSIIaWfJmBiDwR6ZodG9f
31+
urJr+QMAAP//AwABmgHp0wcAAA==
2332
headers:
24-
Access-Control-Allow-Origin:
25-
- '*'
2633
CF-Cache-Status:
2734
- DYNAMIC
2835
CF-RAY:
29-
- 77d282043acb789d-VIE
36+
- 8ecc2c3c2af6e290-BEG
3037
Cache-Control:
3138
- no-cache, private
3239
Connection:
@@ -36,19 +43,23 @@ interactions:
3643
Content-Type:
3744
- application/json
3845
Date:
39-
- Wed, 21 Dec 2022 17:58:47 GMT
46+
- Wed, 04 Dec 2024 13:34:14 GMT
4047
Server:
4148
- cloudflare
42-
Strict-Transport-Security:
43-
- max-age=15724800; includeSubDomains
4449
Transfer-Encoding:
4550
- chunked
46-
X-Locale:
51+
access-control-allow-origin:
52+
- '*'
53+
alt-svc:
54+
- h3=":443"; ma=86400
55+
strict-transport-security:
56+
- max-age=31536000; includeSubDomains
57+
x-locale:
4758
- en
48-
X-RateLimit-Limit:
59+
x-ratelimit-limit:
4960
- '120'
50-
X-RateLimit-Remaining:
51-
- '119'
61+
x-ratelimit-remaining:
62+
- '117'
5263
status:
5364
code: 200
5465
message: OK

Diff for: tests/vcr_cassettes/segments-get.yml

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- application/json
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
Content-Type:
12+
- application/json
13+
User-Agent:
14+
- MailerLite-Python-SDK-Client
15+
method: GET
16+
uri: https://connect.mailerlite.com/api/segments/139794711363717070
17+
response:
18+
body:
19+
string: !!binary |
20+
H4sIAAAAAAAAA1zMMQqDQBBG4avID+lWmNndZMnU6VJ6AFl0IhJdg5lOvHsQUoTU7+Nt6LNlyIax
21+
h4DDNV1jYg6XkDhRIjiUPCsEze1eNTrMWgwOtlieIN5heWlp12x6XB7Tkg3CDm9bxzIcT6ITdodu
22+
GrvnP6Qf+GWrZtO+PSo8+VizrylWHMQHiWfs+wcAAP//AwB/Dyb5tQAAAA==
23+
headers:
24+
CF-Cache-Status:
25+
- DYNAMIC
26+
CF-RAY:
27+
- 8ecc2c3a9cf8e290-BEG
28+
Cache-Control:
29+
- no-cache, private
30+
Connection:
31+
- keep-alive
32+
Content-Encoding:
33+
- gzip
34+
Content-Type:
35+
- application/json
36+
Date:
37+
- Wed, 04 Dec 2024 13:34:14 GMT
38+
Server:
39+
- cloudflare
40+
Transfer-Encoding:
41+
- chunked
42+
access-control-allow-origin:
43+
- '*'
44+
alt-svc:
45+
- h3=":443"; ma=86400
46+
strict-transport-security:
47+
- max-age=31536000; includeSubDomains
48+
x-locale:
49+
- en
50+
x-ratelimit-limit:
51+
- '120'
52+
x-ratelimit-remaining:
53+
- '118'
54+
status:
55+
code: 200
56+
message: OK
57+
version: 1

0 commit comments

Comments
 (0)