Skip to content

Commit abd98be

Browse files
authored
Merge pull request #13 from privacy-com/stlc/pending-main-conflict
stlc: pending main conflict (python)
2 parents 121e9f7 + 0e69a58 commit abd98be

9 files changed

Lines changed: 300 additions & 2 deletions

File tree

‎.stats.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
configured_endpoints: 223
1+
configured_endpoints: 224

‎api.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,18 @@ Methods:
690690
- <code>client.webhooks.<a href="./src/lithic/resources/webhooks.py">parse</a>(body, headers, secret) -> ParsedWebhookEvent</code>
691691
- <code>client.webhooks.<a href="./src/lithic/resources/webhooks.py">parse_unsafe</a>(body) -> ParsedWebhookEvent</code>
692692

693+
# IPRanges
694+
695+
Types:
696+
697+
```python
698+
from lithic.types import IPRangeRetrieveResponse
699+
```
700+
701+
Methods:
702+
703+
- <code title="get /v1/ip_ranges">client.ip_ranges.<a href="./src/lithic/resources/ip_ranges.py">retrieve</a>() -> <a href="./src/lithic/types/ip_range_retrieve_response.py">IPRangeRetrieveResponse</a></code>
704+
693705
# ExternalBankAccounts
694706

695707
Types:

‎scripts/mock‎

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

‎src/lithic/_client.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
disputes,
5353
payments,
5454
three_ds,
55+
ip_ranges,
5556
auth_rules,
5657
disputes_v2,
5758
transactions,
@@ -83,6 +84,7 @@
8384
from .resources.disputes import Disputes, AsyncDisputes
8485
from .resources.payments import Payments, AsyncPayments
8586
from .resources.webhooks import Webhooks, AsyncWebhooks
87+
from .resources.ip_ranges import IPRanges, AsyncIPRanges
8688
from .resources.cards.cards import Cards, AsyncCards
8789
from .resources.disputes_v2 import DisputesV2, AsyncDisputesV2
8890
from .resources.fraud.fraud import Fraud, AsyncFraud
@@ -332,6 +334,12 @@ def responder_endpoints(self) -> ResponderEndpoints:
332334

333335
return ResponderEndpoints(self)
334336

337+
@cached_property
338+
def ip_ranges(self) -> IPRanges:
339+
from .resources.ip_ranges import IPRanges
340+
341+
return IPRanges(self)
342+
335343
@cached_property
336344
def external_bank_accounts(self) -> ExternalBankAccounts:
337345
from .resources.external_bank_accounts import ExternalBankAccounts
@@ -774,6 +782,12 @@ def responder_endpoints(self) -> AsyncResponderEndpoints:
774782

775783
return AsyncResponderEndpoints(self)
776784

785+
@cached_property
786+
def ip_ranges(self) -> AsyncIPRanges:
787+
from .resources.ip_ranges import AsyncIPRanges
788+
789+
return AsyncIPRanges(self)
790+
777791
@cached_property
778792
def external_bank_accounts(self) -> AsyncExternalBankAccounts:
779793
from .resources.external_bank_accounts import AsyncExternalBankAccounts
@@ -1130,6 +1144,12 @@ def responder_endpoints(self) -> responder_endpoints.ResponderEndpointsWithRawRe
11301144

11311145
return ResponderEndpointsWithRawResponse(self._client.responder_endpoints)
11321146

1147+
@cached_property
1148+
def ip_ranges(self) -> ip_ranges.IPRangesWithRawResponse:
1149+
from .resources.ip_ranges import IPRangesWithRawResponse
1150+
1151+
return IPRangesWithRawResponse(self._client.ip_ranges)
1152+
11331153
@cached_property
11341154
def external_bank_accounts(self) -> external_bank_accounts.ExternalBankAccountsWithRawResponse:
11351155
from .resources.external_bank_accounts import ExternalBankAccountsWithRawResponse
@@ -1345,6 +1365,12 @@ def responder_endpoints(self) -> responder_endpoints.AsyncResponderEndpointsWith
13451365

13461366
return AsyncResponderEndpointsWithRawResponse(self._client.responder_endpoints)
13471367

1368+
@cached_property
1369+
def ip_ranges(self) -> ip_ranges.AsyncIPRangesWithRawResponse:
1370+
from .resources.ip_ranges import AsyncIPRangesWithRawResponse
1371+
1372+
return AsyncIPRangesWithRawResponse(self._client.ip_ranges)
1373+
13481374
@cached_property
13491375
def external_bank_accounts(self) -> external_bank_accounts.AsyncExternalBankAccountsWithRawResponse:
13501376
from .resources.external_bank_accounts import AsyncExternalBankAccountsWithRawResponse
@@ -1560,6 +1586,12 @@ def responder_endpoints(self) -> responder_endpoints.ResponderEndpointsWithStrea
15601586

15611587
return ResponderEndpointsWithStreamingResponse(self._client.responder_endpoints)
15621588

1589+
@cached_property
1590+
def ip_ranges(self) -> ip_ranges.IPRangesWithStreamingResponse:
1591+
from .resources.ip_ranges import IPRangesWithStreamingResponse
1592+
1593+
return IPRangesWithStreamingResponse(self._client.ip_ranges)
1594+
15631595
@cached_property
15641596
def external_bank_accounts(self) -> external_bank_accounts.ExternalBankAccountsWithStreamingResponse:
15651597
from .resources.external_bank_accounts import ExternalBankAccountsWithStreamingResponse
@@ -1775,6 +1807,12 @@ def responder_endpoints(self) -> responder_endpoints.AsyncResponderEndpointsWith
17751807

17761808
return AsyncResponderEndpointsWithStreamingResponse(self._client.responder_endpoints)
17771809

1810+
@cached_property
1811+
def ip_ranges(self) -> ip_ranges.AsyncIPRangesWithStreamingResponse:
1812+
from .resources.ip_ranges import AsyncIPRangesWithStreamingResponse
1813+
1814+
return AsyncIPRangesWithStreamingResponse(self._client.ip_ranges)
1815+
17781816
@cached_property
17791817
def external_bank_accounts(self) -> external_bank_accounts.AsyncExternalBankAccountsWithStreamingResponse:
17801818
from .resources.external_bank_accounts import AsyncExternalBankAccountsWithStreamingResponse

‎src/lithic/resources/__init__.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@
8181
AsyncThreeDSWithStreamingResponse,
8282
)
8383
from .webhooks import Webhooks, AsyncWebhooks
84+
from .ip_ranges import (
85+
IPRanges,
86+
AsyncIPRanges,
87+
IPRangesWithRawResponse,
88+
AsyncIPRangesWithRawResponse,
89+
IPRangesWithStreamingResponse,
90+
AsyncIPRangesWithStreamingResponse,
91+
)
8492
from .auth_rules import (
8593
AuthRules,
8694
AsyncAuthRules,
@@ -377,6 +385,12 @@
377385
"AsyncResponderEndpointsWithRawResponse",
378386
"ResponderEndpointsWithStreamingResponse",
379387
"AsyncResponderEndpointsWithStreamingResponse",
388+
"IPRanges",
389+
"AsyncIPRanges",
390+
"IPRangesWithRawResponse",
391+
"AsyncIPRangesWithRawResponse",
392+
"IPRangesWithStreamingResponse",
393+
"AsyncIPRangesWithStreamingResponse",
380394
"ExternalBankAccounts",
381395
"AsyncExternalBankAccounts",
382396
"ExternalBankAccountsWithRawResponse",

‎src/lithic/resources/ip_ranges.py‎

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
import httpx
6+
7+
from .. import _legacy_response
8+
from .._types import Body, Query, Headers, NotGiven, not_given
9+
from .._compat import cached_property
10+
from .._resource import SyncAPIResource, AsyncAPIResource
11+
from .._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper
12+
from .._base_client import make_request_options
13+
from ..types.ip_range_retrieve_response import IPRangeRetrieveResponse
14+
15+
__all__ = ["IPRanges", "AsyncIPRanges"]
16+
17+
18+
class IPRanges(SyncAPIResource):
19+
@cached_property
20+
def with_raw_response(self) -> IPRangesWithRawResponse:
21+
"""
22+
This property can be used as a prefix for any HTTP method call to return
23+
the raw response object instead of the parsed content.
24+
25+
For more information, see https://www.github.com/lithic-com/lithic-python#accessing-raw-response-data-eg-headers
26+
"""
27+
return IPRangesWithRawResponse(self)
28+
29+
@cached_property
30+
def with_streaming_response(self) -> IPRangesWithStreamingResponse:
31+
"""
32+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
33+
34+
For more information, see https://www.github.com/lithic-com/lithic-python#with_streaming_response
35+
"""
36+
return IPRangesWithStreamingResponse(self)
37+
38+
def retrieve(
39+
self,
40+
*,
41+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
42+
# The extra values given here take precedence over values defined on the client or passed to this method.
43+
extra_headers: Headers | None = None,
44+
extra_query: Query | None = None,
45+
extra_body: Body | None = None,
46+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
47+
) -> IPRangeRetrieveResponse:
48+
"""
49+
Returns the IP addresses Lithic sends responder requests from (Auth Stream
50+
Access, 3DS decisioning, and tokenization decisioning), so you can allowlist
51+
them in your firewall. Each environment returns its own set of addresses. Lithic
52+
announces new addresses at least 30 days before sending traffic from them. Event
53+
webhooks are not sent from these addresses
54+
"""
55+
return self._get(
56+
"/v1/ip_ranges",
57+
options=make_request_options(
58+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
59+
),
60+
cast_to=IPRangeRetrieveResponse,
61+
)
62+
63+
64+
class AsyncIPRanges(AsyncAPIResource):
65+
@cached_property
66+
def with_raw_response(self) -> AsyncIPRangesWithRawResponse:
67+
"""
68+
This property can be used as a prefix for any HTTP method call to return
69+
the raw response object instead of the parsed content.
70+
71+
For more information, see https://www.github.com/lithic-com/lithic-python#accessing-raw-response-data-eg-headers
72+
"""
73+
return AsyncIPRangesWithRawResponse(self)
74+
75+
@cached_property
76+
def with_streaming_response(self) -> AsyncIPRangesWithStreamingResponse:
77+
"""
78+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
79+
80+
For more information, see https://www.github.com/lithic-com/lithic-python#with_streaming_response
81+
"""
82+
return AsyncIPRangesWithStreamingResponse(self)
83+
84+
async def retrieve(
85+
self,
86+
*,
87+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
88+
# The extra values given here take precedence over values defined on the client or passed to this method.
89+
extra_headers: Headers | None = None,
90+
extra_query: Query | None = None,
91+
extra_body: Body | None = None,
92+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
93+
) -> IPRangeRetrieveResponse:
94+
"""
95+
Returns the IP addresses Lithic sends responder requests from (Auth Stream
96+
Access, 3DS decisioning, and tokenization decisioning), so you can allowlist
97+
them in your firewall. Each environment returns its own set of addresses. Lithic
98+
announces new addresses at least 30 days before sending traffic from them. Event
99+
webhooks are not sent from these addresses
100+
"""
101+
return await self._get(
102+
"/v1/ip_ranges",
103+
options=make_request_options(
104+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
105+
),
106+
cast_to=IPRangeRetrieveResponse,
107+
)
108+
109+
110+
class IPRangesWithRawResponse:
111+
def __init__(self, ip_ranges: IPRanges) -> None:
112+
self._ip_ranges = ip_ranges
113+
114+
self.retrieve = _legacy_response.to_raw_response_wrapper(
115+
ip_ranges.retrieve,
116+
)
117+
118+
119+
class AsyncIPRangesWithRawResponse:
120+
def __init__(self, ip_ranges: AsyncIPRanges) -> None:
121+
self._ip_ranges = ip_ranges
122+
123+
self.retrieve = _legacy_response.async_to_raw_response_wrapper(
124+
ip_ranges.retrieve,
125+
)
126+
127+
128+
class IPRangesWithStreamingResponse:
129+
def __init__(self, ip_ranges: IPRanges) -> None:
130+
self._ip_ranges = ip_ranges
131+
132+
self.retrieve = to_streamed_response_wrapper(
133+
ip_ranges.retrieve,
134+
)
135+
136+
137+
class AsyncIPRangesWithStreamingResponse:
138+
def __init__(self, ip_ranges: AsyncIPRanges) -> None:
139+
self._ip_ranges = ip_ranges
140+
141+
self.retrieve = async_to_streamed_response_wrapper(
142+
ip_ranges.retrieve,
143+
)

‎src/lithic/types/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
from .card_updated_webhook_event import CardUpdatedWebhookEvent as CardUpdatedWebhookEvent
124124
from .embed_viewed_webhook_event import EmbedViewedWebhookEvent as EmbedViewedWebhookEvent
125125
from .event_list_attempts_params import EventListAttemptsParams as EventListAttemptsParams
126+
from .ip_range_retrieve_response import IPRangeRetrieveResponse as IPRangeRetrieveResponse
126127
from .settlement_summary_details import SettlementSummaryDetails as SettlementSummaryDetails
127128
from .transfer_limit_list_params import TransferLimitListParams as TransferLimitListParams
128129
from .book_transfer_create_params import BookTransferCreateParams as BookTransferCreateParams
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import List
4+
from datetime import datetime
5+
6+
from .._models import BaseModel
7+
8+
__all__ = ["IPRangeRetrieveResponse"]
9+
10+
11+
class IPRangeRetrieveResponse(BaseModel):
12+
responders: List[str]
13+
"""IP ranges that responder requests are sent from, in CIDR notation"""
14+
15+
updated: datetime
16+
"""Date and time the IP ranges were last changed"""
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
import os
6+
from typing import Any, cast
7+
8+
import pytest
9+
10+
from lithic import Lithic, AsyncLithic
11+
from tests.utils import assert_matches_type
12+
from lithic.types import IPRangeRetrieveResponse
13+
14+
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
15+
16+
17+
class TestIPRanges:
18+
parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
19+
20+
@parametrize
21+
def test_method_retrieve(self, client: Lithic) -> None:
22+
ip_range = client.ip_ranges.retrieve()
23+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
24+
25+
@parametrize
26+
def test_raw_response_retrieve(self, client: Lithic) -> None:
27+
response = client.ip_ranges.with_raw_response.retrieve()
28+
29+
assert response.is_closed is True
30+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
31+
ip_range = response.parse()
32+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
33+
34+
@parametrize
35+
def test_streaming_response_retrieve(self, client: Lithic) -> None:
36+
with client.ip_ranges.with_streaming_response.retrieve() as response:
37+
assert not response.is_closed
38+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
39+
40+
ip_range = response.parse()
41+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
42+
43+
assert cast(Any, response.is_closed) is True
44+
45+
46+
class TestAsyncIPRanges:
47+
parametrize = pytest.mark.parametrize(
48+
"async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
49+
)
50+
51+
@parametrize
52+
async def test_method_retrieve(self, async_client: AsyncLithic) -> None:
53+
ip_range = await async_client.ip_ranges.retrieve()
54+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
55+
56+
@parametrize
57+
async def test_raw_response_retrieve(self, async_client: AsyncLithic) -> None:
58+
response = await async_client.ip_ranges.with_raw_response.retrieve()
59+
60+
assert response.is_closed is True
61+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
62+
ip_range = response.parse()
63+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
64+
65+
@parametrize
66+
async def test_streaming_response_retrieve(self, async_client: AsyncLithic) -> None:
67+
async with async_client.ip_ranges.with_streaming_response.retrieve() as response:
68+
assert not response.is_closed
69+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
70+
71+
ip_range = await response.parse()
72+
assert_matches_type(IPRangeRetrieveResponse, ip_range, path=["response"])
73+
74+
assert cast(Any, response.is_closed) is True

0 commit comments

Comments
 (0)