From 71a42c0f2604c81f87fb0ee82a13017d6d758008 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:59:49 +0000 Subject: [PATCH 1/6] chore(internal): update .stats.yml (#719) --- .github/workflows/ci.yml | 22 ++++++++++++++++++++++ .stats.yml | 1 + 2 files changed, 23 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f439a74..cd52be2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,6 +31,28 @@ jobs: - name: Run lints run: ./scripts/lint + test: + name: test + runs-on: ubuntu-latest + if: github.repository == 'lithic-com/lithic-python' + + steps: + - uses: actions/checkout@v4 + + - name: Install Rye + run: | + curl -sSf https://rye.astral.sh/get | bash + echo "$HOME/.rye/shims" >> $GITHUB_PATH + env: + RYE_VERSION: '0.44.0' + RYE_INSTALL_OPTION: '--yes' + + - name: Bootstrap + run: ./scripts/bootstrap + + - name: Run tests + run: ./scripts/test + examples: name: examples runs-on: ubuntu-latest diff --git a/.stats.yml b/.stats.yml index 8b01dc8a..57832cad 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1,2 @@ configured_endpoints: 155 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic-ef8c4db34befe33c31ef773a61c836fc13976f75c056768cec6d1333d02a76ac.yml From 8ec09902524a403201f81eae3e5b549afbe34a29 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 14:35:58 +0000 Subject: [PATCH 2/6] chore(api): new attribute targets for Auth Rules and new Financial Account State schema (#721) - Adds new attribute targets to Conditional Block Parameters: PIN_ENTERED, PIN_STATUS, WALLET_TYPE, CARD_TRANSACTION_COUNT_15M - Adds Financial Account State details to Account Standing schema --- .stats.yml | 2 +- src/lithic/types/auth_rules/auth_rule_condition.py | 9 +++++++++ .../types/auth_rules/auth_rule_condition_param.py | 9 +++++++++ .../types/auth_rules/conditional_attribute.py | 4 ++++ src/lithic/types/financial_accounts/loan_tape.py | 14 ++++++++++++++ src/lithic/types/financial_accounts/statement.py | 14 ++++++++++++++ 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 57832cad..ee5829c5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ configured_endpoints: 155 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic-ef8c4db34befe33c31ef773a61c836fc13976f75c056768cec6d1333d02a76ac.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic-fe97f820471b725722897539252e7444af7490c5a444a2e9304f5e6eec5513f3.yml diff --git a/src/lithic/types/auth_rules/auth_rule_condition.py b/src/lithic/types/auth_rules/auth_rule_condition.py index 15cc6bfe..7de1a850 100644 --- a/src/lithic/types/auth_rules/auth_rule_condition.py +++ b/src/lithic/types/auth_rules/auth_rule_condition.py @@ -42,6 +42,8 @@ class AuthRuleCondition(BaseModel): lowest risk and 999 representing the highest risk. For Visa transactions, where the raw score has a range of 0-99, Lithic will normalize the score by multiplying the raw score by 10x. + - `CARD_TRANSACTION_COUNT_15M`: The number of transactions on the card in the + trailing 15 minutes before the authorization. - `CARD_TRANSACTION_COUNT_1H`: The number of transactions on the card in the trailing hour up and until the authorization. - `CARD_TRANSACTION_COUNT_24H`: The number of transactions on the card in the @@ -49,6 +51,13 @@ class AuthRuleCondition(BaseModel): - `CARD_STATE`: The current state of the card associated with the transaction. Valid values are `CLOSED`, `OPEN`, `PAUSED`, `PENDING_ACTIVATION`, `PENDING_FULFILLMENT`. + - `PIN_ENTERED`: Indicates whether a PIN was entered during the transaction. + Valid values are `TRUE`, `FALSE`. + - `PIN_STATUS`: The current state of card's PIN. Valid values are `NOT_SET`, + `OK`, `BLOCKED`. + - `WALLET_TYPE`: For transactions using a digital wallet token, indicates the + source of the token. Valid values are `APPLE_PAY`, `GOOGLE_PAY`, + `SAMSUNG_PAY`, `MASTERPASS`, `MERCHANT`, `OTHER`, `NONE`. """ operation: Optional[ diff --git a/src/lithic/types/auth_rules/auth_rule_condition_param.py b/src/lithic/types/auth_rules/auth_rule_condition_param.py index 5e0a3c14..960d4e71 100644 --- a/src/lithic/types/auth_rules/auth_rule_condition_param.py +++ b/src/lithic/types/auth_rules/auth_rule_condition_param.py @@ -43,6 +43,8 @@ class AuthRuleConditionParam(TypedDict, total=False): lowest risk and 999 representing the highest risk. For Visa transactions, where the raw score has a range of 0-99, Lithic will normalize the score by multiplying the raw score by 10x. + - `CARD_TRANSACTION_COUNT_15M`: The number of transactions on the card in the + trailing 15 minutes before the authorization. - `CARD_TRANSACTION_COUNT_1H`: The number of transactions on the card in the trailing hour up and until the authorization. - `CARD_TRANSACTION_COUNT_24H`: The number of transactions on the card in the @@ -50,6 +52,13 @@ class AuthRuleConditionParam(TypedDict, total=False): - `CARD_STATE`: The current state of the card associated with the transaction. Valid values are `CLOSED`, `OPEN`, `PAUSED`, `PENDING_ACTIVATION`, `PENDING_FULFILLMENT`. + - `PIN_ENTERED`: Indicates whether a PIN was entered during the transaction. + Valid values are `TRUE`, `FALSE`. + - `PIN_STATUS`: The current state of card's PIN. Valid values are `NOT_SET`, + `OK`, `BLOCKED`. + - `WALLET_TYPE`: For transactions using a digital wallet token, indicates the + source of the token. Valid values are `APPLE_PAY`, `GOOGLE_PAY`, + `SAMSUNG_PAY`, `MASTERPASS`, `MERCHANT`, `OTHER`, `NONE`. """ operation: Literal["IS_ONE_OF", "IS_NOT_ONE_OF", "MATCHES", "DOES_NOT_MATCH", "IS_GREATER_THAN", "IS_LESS_THAN"] diff --git a/src/lithic/types/auth_rules/conditional_attribute.py b/src/lithic/types/auth_rules/conditional_attribute.py index 6264e74f..626ff59a 100644 --- a/src/lithic/types/auth_rules/conditional_attribute.py +++ b/src/lithic/types/auth_rules/conditional_attribute.py @@ -14,7 +14,11 @@ "PAN_ENTRY_MODE", "TRANSACTION_AMOUNT", "RISK_SCORE", + "CARD_TRANSACTION_COUNT_15M", "CARD_TRANSACTION_COUNT_1H", "CARD_TRANSACTION_COUNT_24H", "CARD_STATE", + "PIN_ENTERED", + "PIN_STATUS", + "WALLET_TYPE", ] diff --git a/src/lithic/types/financial_accounts/loan_tape.py b/src/lithic/types/financial_accounts/loan_tape.py index 0b06ffad..dc923b83 100644 --- a/src/lithic/types/financial_accounts/loan_tape.py +++ b/src/lithic/types/financial_accounts/loan_tape.py @@ -9,6 +9,7 @@ __all__ = [ "LoanTape", "AccountStanding", + "AccountStandingFinancialAccountState", "Balances", "BalancesDue", "BalancesNextStatementDue", @@ -27,6 +28,16 @@ ] +class AccountStandingFinancialAccountState(BaseModel): + status: Literal["OPEN", "CLOSED", "SUSPENDED", "PENDING"] + """Status of the financial account""" + + status_change_reason: Optional[ + Literal["CHARGED_OFF_DELINQUENT", "CHARGED_OFF_FRAUD", "END_USER_REQUEST", "BANK_REQUEST", "DELINQUENT"] + ] = None + """Reason for the financial account status change""" + + class AccountStanding(BaseModel): consecutive_full_payments_made: int """Number of consecutive full payments made""" @@ -40,6 +51,9 @@ class AccountStanding(BaseModel): days_past_due: int """Number of days past due""" + financial_account_state: AccountStandingFinancialAccountState + """Information about the financial account state""" + has_grace: bool """Whether the account currently has grace or not""" diff --git a/src/lithic/types/financial_accounts/statement.py b/src/lithic/types/financial_accounts/statement.py index a377f7f1..624b41e4 100644 --- a/src/lithic/types/financial_accounts/statement.py +++ b/src/lithic/types/financial_accounts/statement.py @@ -9,6 +9,7 @@ __all__ = [ "Statement", "AccountStanding", + "AccountStandingFinancialAccountState", "AmountDue", "PeriodTotals", "YtdTotals", @@ -19,6 +20,16 @@ ] +class AccountStandingFinancialAccountState(BaseModel): + status: Literal["OPEN", "CLOSED", "SUSPENDED", "PENDING"] + """Status of the financial account""" + + status_change_reason: Optional[ + Literal["CHARGED_OFF_DELINQUENT", "CHARGED_OFF_FRAUD", "END_USER_REQUEST", "BANK_REQUEST", "DELINQUENT"] + ] = None + """Reason for the financial account status change""" + + class AccountStanding(BaseModel): consecutive_full_payments_made: int """Number of consecutive full payments made""" @@ -32,6 +43,9 @@ class AccountStanding(BaseModel): days_past_due: int """Number of days past due""" + financial_account_state: AccountStandingFinancialAccountState + """Information about the financial account state""" + has_grace: bool """Whether the account currently has grace or not""" From 5542c7833c2594651ae07a734d26ee3b80d865c7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:41:43 +0000 Subject: [PATCH 3/6] chore: fix typos (#722) --- src/lithic/_models.py | 2 +- src/lithic/_utils/_transform.py | 2 +- .../events/test_subscriptions.py | 72 +++++++++---------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/lithic/_models.py b/src/lithic/_models.py index b51a1bf5..34935716 100644 --- a/src/lithic/_models.py +++ b/src/lithic/_models.py @@ -681,7 +681,7 @@ def set_pydantic_config(typ: Any, config: pydantic.ConfigDict) -> None: setattr(typ, "__pydantic_config__", config) # noqa: B010 -# our use of subclasssing here causes weirdness for type checkers, +# our use of subclassing here causes weirdness for type checkers, # so we just pretend that we don't subclass if TYPE_CHECKING: GenericModel = BaseModel diff --git a/src/lithic/_utils/_transform.py b/src/lithic/_utils/_transform.py index 18afd9d8..7ac2e17f 100644 --- a/src/lithic/_utils/_transform.py +++ b/src/lithic/_utils/_transform.py @@ -126,7 +126,7 @@ def _get_annotated_type(type_: type) -> type | None: def _maybe_transform_key(key: str, type_: type) -> str: """Transform the given `data` based on the annotations provided in `type_`. - Note: this function only looks at `Annotated` types that contain `PropertInfo` metadata. + Note: this function only looks at `Annotated` types that contain `PropertyInfo` metadata. """ annotated_type = _get_annotated_type(type_) if annotated_type is None: diff --git a/tests/api_resources/events/test_subscriptions.py b/tests/api_resources/events/test_subscriptions.py index 4e9a5c2d..307bc14d 100644 --- a/tests/api_resources/events/test_subscriptions.py +++ b/tests/api_resources/events/test_subscriptions.py @@ -192,7 +192,7 @@ def test_streaming_response_list(self, client: Lithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_delete(self, client: Lithic) -> None: subscription = client.events.subscriptions.delete( @@ -200,7 +200,7 @@ def test_method_delete(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_raw_response_delete(self, client: Lithic) -> None: response = client.events.subscriptions.with_raw_response.delete( @@ -212,7 +212,7 @@ def test_raw_response_delete(self, client: Lithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_streaming_response_delete(self, client: Lithic) -> None: with client.events.subscriptions.with_streaming_response.delete( @@ -226,7 +226,7 @@ def test_streaming_response_delete(self, client: Lithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_path_params_delete(self, client: Lithic) -> None: with pytest.raises( @@ -289,7 +289,7 @@ def test_path_params_list_attempts(self, client: Lithic) -> None: event_subscription_token="", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_recover(self, client: Lithic) -> None: subscription = client.events.subscriptions.recover( @@ -297,7 +297,7 @@ def test_method_recover(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_recover_with_all_params(self, client: Lithic) -> None: subscription = client.events.subscriptions.recover( @@ -307,7 +307,7 @@ def test_method_recover_with_all_params(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_raw_response_recover(self, client: Lithic) -> None: response = client.events.subscriptions.with_raw_response.recover( @@ -319,7 +319,7 @@ def test_raw_response_recover(self, client: Lithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_streaming_response_recover(self, client: Lithic) -> None: with client.events.subscriptions.with_streaming_response.recover( @@ -333,7 +333,7 @@ def test_streaming_response_recover(self, client: Lithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_path_params_recover(self, client: Lithic) -> None: with pytest.raises( @@ -343,7 +343,7 @@ def test_path_params_recover(self, client: Lithic) -> None: event_subscription_token="", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_replay_missing(self, client: Lithic) -> None: subscription = client.events.subscriptions.replay_missing( @@ -351,7 +351,7 @@ def test_method_replay_missing(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_replay_missing_with_all_params(self, client: Lithic) -> None: subscription = client.events.subscriptions.replay_missing( @@ -361,7 +361,7 @@ def test_method_replay_missing_with_all_params(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_raw_response_replay_missing(self, client: Lithic) -> None: response = client.events.subscriptions.with_raw_response.replay_missing( @@ -373,7 +373,7 @@ def test_raw_response_replay_missing(self, client: Lithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_streaming_response_replay_missing(self, client: Lithic) -> None: with client.events.subscriptions.with_streaming_response.replay_missing( @@ -387,7 +387,7 @@ def test_streaming_response_replay_missing(self, client: Lithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_path_params_replay_missing(self, client: Lithic) -> None: with pytest.raises( @@ -437,7 +437,7 @@ def test_path_params_retrieve_secret(self, client: Lithic) -> None: "", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_method_rotate_secret(self, client: Lithic) -> None: subscription = client.events.subscriptions.rotate_secret( @@ -445,7 +445,7 @@ def test_method_rotate_secret(self, client: Lithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_raw_response_rotate_secret(self, client: Lithic) -> None: response = client.events.subscriptions.with_raw_response.rotate_secret( @@ -457,7 +457,7 @@ def test_raw_response_rotate_secret(self, client: Lithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_streaming_response_rotate_secret(self, client: Lithic) -> None: with client.events.subscriptions.with_streaming_response.rotate_secret( @@ -471,7 +471,7 @@ def test_streaming_response_rotate_secret(self, client: Lithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize def test_path_params_rotate_secret(self, client: Lithic) -> None: with pytest.raises( @@ -703,7 +703,7 @@ async def test_streaming_response_list(self, async_client: AsyncLithic) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_delete(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.delete( @@ -711,7 +711,7 @@ async def test_method_delete(self, async_client: AsyncLithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_raw_response_delete(self, async_client: AsyncLithic) -> None: response = await async_client.events.subscriptions.with_raw_response.delete( @@ -723,7 +723,7 @@ async def test_raw_response_delete(self, async_client: AsyncLithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_streaming_response_delete(self, async_client: AsyncLithic) -> None: async with async_client.events.subscriptions.with_streaming_response.delete( @@ -737,7 +737,7 @@ async def test_streaming_response_delete(self, async_client: AsyncLithic) -> Non assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_path_params_delete(self, async_client: AsyncLithic) -> None: with pytest.raises( @@ -800,7 +800,7 @@ async def test_path_params_list_attempts(self, async_client: AsyncLithic) -> Non event_subscription_token="", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_recover(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.recover( @@ -808,7 +808,7 @@ async def test_method_recover(self, async_client: AsyncLithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_recover_with_all_params(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.recover( @@ -818,7 +818,7 @@ async def test_method_recover_with_all_params(self, async_client: AsyncLithic) - ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_raw_response_recover(self, async_client: AsyncLithic) -> None: response = await async_client.events.subscriptions.with_raw_response.recover( @@ -830,7 +830,7 @@ async def test_raw_response_recover(self, async_client: AsyncLithic) -> None: subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_streaming_response_recover(self, async_client: AsyncLithic) -> None: async with async_client.events.subscriptions.with_streaming_response.recover( @@ -844,7 +844,7 @@ async def test_streaming_response_recover(self, async_client: AsyncLithic) -> No assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_path_params_recover(self, async_client: AsyncLithic) -> None: with pytest.raises( @@ -854,7 +854,7 @@ async def test_path_params_recover(self, async_client: AsyncLithic) -> None: event_subscription_token="", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_replay_missing(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.replay_missing( @@ -862,7 +862,7 @@ async def test_method_replay_missing(self, async_client: AsyncLithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_replay_missing_with_all_params(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.replay_missing( @@ -872,7 +872,7 @@ async def test_method_replay_missing_with_all_params(self, async_client: AsyncLi ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_raw_response_replay_missing(self, async_client: AsyncLithic) -> None: response = await async_client.events.subscriptions.with_raw_response.replay_missing( @@ -884,7 +884,7 @@ async def test_raw_response_replay_missing(self, async_client: AsyncLithic) -> N subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_streaming_response_replay_missing(self, async_client: AsyncLithic) -> None: async with async_client.events.subscriptions.with_streaming_response.replay_missing( @@ -898,7 +898,7 @@ async def test_streaming_response_replay_missing(self, async_client: AsyncLithic assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_path_params_replay_missing(self, async_client: AsyncLithic) -> None: with pytest.raises( @@ -948,7 +948,7 @@ async def test_path_params_retrieve_secret(self, async_client: AsyncLithic) -> N "", ) - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_method_rotate_secret(self, async_client: AsyncLithic) -> None: subscription = await async_client.events.subscriptions.rotate_secret( @@ -956,7 +956,7 @@ async def test_method_rotate_secret(self, async_client: AsyncLithic) -> None: ) assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_raw_response_rotate_secret(self, async_client: AsyncLithic) -> None: response = await async_client.events.subscriptions.with_raw_response.rotate_secret( @@ -968,7 +968,7 @@ async def test_raw_response_rotate_secret(self, async_client: AsyncLithic) -> No subscription = response.parse() assert subscription is None - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_streaming_response_rotate_secret(self, async_client: AsyncLithic) -> None: async with async_client.events.subscriptions.with_streaming_response.rotate_secret( @@ -982,7 +982,7 @@ async def test_streaming_response_rotate_secret(self, async_client: AsyncLithic) assert cast(Any, response.is_closed) is True - @pytest.mark.skip(reason="Prism Mock server doesnt want Accept header, but server requires it.") + @pytest.mark.skip(reason="Prism Mock server doesn't want Accept header, but server requires it.") @parametrize async def test_path_params_rotate_secret(self, async_client: AsyncLithic) -> None: with pytest.raises( From 8fa502151127f8b9a5f5d9ad915c6f99f48cbeb9 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:27:34 +0000 Subject: [PATCH 4/6] fix(types): add missing total=False (#723) --- .stats.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.stats.yml b/.stats.yml index ee5829c5..b29af9f5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,4 @@ configured_endpoints: 155 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic-fe97f820471b725722897539252e7444af7490c5a444a2e9304f5e6eec5513f3.yml +openapi_spec_hash: 7e6a5737901cef39499bf749a17d9939 +config_hash: 3d06d32938417ca039b0caa91d2dc8b6 From b7f9419ca0c5bc3f2d066078156440b5dc81ce3d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:54:40 +0000 Subject: [PATCH 5/6] chore(internal): codegen related update (#724) --- .github/workflows/ci.yml | 2 -- .stats.yml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd52be2a..bbbef9f9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ jobs: lint: name: lint runs-on: ubuntu-latest - if: github.repository == 'lithic-com/lithic-python' steps: - uses: actions/checkout@v4 @@ -34,7 +33,6 @@ jobs: test: name: test runs-on: ubuntu-latest - if: github.repository == 'lithic-com/lithic-python' steps: - uses: actions/checkout@v4 diff --git a/.stats.yml b/.stats.yml index b29af9f5..d199040a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 155 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic-fe97f820471b725722897539252e7444af7490c5a444a2e9304f5e6eec5513f3.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic%2Flithic-fe97f820471b725722897539252e7444af7490c5a444a2e9304f5e6eec5513f3.yml openapi_spec_hash: 7e6a5737901cef39499bf749a17d9939 config_hash: 3d06d32938417ca039b0caa91d2dc8b6 From 922bb146c185a01b899d27916229311738fc8316 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:55:05 +0000 Subject: [PATCH 6/6] release: 0.87.1 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ pyproject.toml | 2 +- src/lithic/_version.py | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index ae449647..6da9dbc7 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.87.0" + ".": "0.87.1" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index abc88383..5cd3e9ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.87.1 (2025-03-27) + +Full Changelog: [v0.87.0...v0.87.1](https://github.com/lithic-com/lithic-python/compare/v0.87.0...v0.87.1) + +### Bug Fixes + +* **types:** add missing total=False ([#723](https://github.com/lithic-com/lithic-python/issues/723)) ([8fa5021](https://github.com/lithic-com/lithic-python/commit/8fa502151127f8b9a5f5d9ad915c6f99f48cbeb9)) + + +### Chores + +* **api:** new attribute targets for Auth Rules and new Financial Account State schema ([#721](https://github.com/lithic-com/lithic-python/issues/721)) ([8ec0990](https://github.com/lithic-com/lithic-python/commit/8ec09902524a403201f81eae3e5b549afbe34a29)) +* fix typos ([#722](https://github.com/lithic-com/lithic-python/issues/722)) ([5542c78](https://github.com/lithic-com/lithic-python/commit/5542c7833c2594651ae07a734d26ee3b80d865c7)) +* **internal:** codegen related update ([#724](https://github.com/lithic-com/lithic-python/issues/724)) ([b7f9419](https://github.com/lithic-com/lithic-python/commit/b7f9419ca0c5bc3f2d066078156440b5dc81ce3d)) +* **internal:** update .stats.yml ([#719](https://github.com/lithic-com/lithic-python/issues/719)) ([71a42c0](https://github.com/lithic-com/lithic-python/commit/71a42c0f2604c81f87fb0ee82a13017d6d758008)) + ## 0.87.0 (2025-03-18) Full Changelog: [v0.86.2...v0.87.0](https://github.com/lithic-com/lithic-python/compare/v0.86.2...v0.87.0) diff --git a/pyproject.toml b/pyproject.toml index 4d419520..c10c0da4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lithic" -version = "0.87.0" +version = "0.87.1" description = "The official Python library for the lithic API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/lithic/_version.py b/src/lithic/_version.py index 6322682d..0ccb5cae 100644 --- a/src/lithic/_version.py +++ b/src/lithic/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "lithic" -__version__ = "0.87.0" # x-release-please-version +__version__ = "0.87.1" # x-release-please-version