growsurf-python 1.2.1__tar.gz → 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- growsurf_python-1.3.0/.release-please-manifest.json +3 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/CHANGELOG.md +14 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/PKG-INFO +5 -6
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/README.md +2 -2
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/api.md +16 -1
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/pyproject.toml +4 -5
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_base_client.py +29 -10
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_version.py +1 -1
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/campaign.py +848 -20
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/design.py +26 -24
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/options.py +14 -14
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/participant.py +309 -28
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/rewards.py +16 -12
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/__init__.py +22 -0
- growsurf_python-1.3.0/src/growsurf/types/affiliate_application.py +67 -0
- growsurf_python-1.3.0/src/growsurf/types/affiliate_application_answer.py +24 -0
- growsurf_python-1.3.0/src/growsurf/types/affiliate_application_list_response.py +22 -0
- growsurf_python-1.3.0/src/growsurf/types/affiliate_invite.py +45 -0
- growsurf_python-1.3.0/src/growsurf/types/affiliate_invite_list_response.py +22 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/__init__.py +9 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign.py +14 -4
- growsurf_python-1.3.0/src/growsurf/types/campaign/campaign_design.py +20 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_options.py +5 -5
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant.py +27 -4
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_add_params.py +8 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_analytics_params.py +11 -3
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_analytics_response.py +19 -6
- growsurf_python-1.3.0/src/growsurf/types/campaign/participant_get_payout_destination_response.py +50 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +1 -1
- growsurf_python-1.3.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +14 -0
- growsurf_python-1.3.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +24 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_update_params.py +9 -3
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/referral_source.py +1 -1
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward.py +11 -3
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_create_params.py +1 -3
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_tax_valuation.py +14 -5
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_update_params.py +1 -3
- growsurf_python-1.3.0/src/growsurf/types/campaign_create_affiliate_invite_params.py +20 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +8 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_params.py +1 -1
- growsurf_python-1.3.0/src/growsurf/types/campaign_list_affiliate_applications_params.py +18 -0
- growsurf_python-1.3.0/src/growsurf/types/campaign_list_affiliate_invites_params.py +18 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_payouts_params.py +1 -1
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +9 -7
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +29 -3
- growsurf_python-1.3.0/src/growsurf/types/campaign_review_affiliate_application_params.py +53 -0
- growsurf_python-1.3.0/src/growsurf/types/email_analytics.py +36 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/participant_payout_list.py +3 -1
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_design.py +8 -2
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_participant.py +234 -2
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/test_campaign.py +774 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_client.py +75 -1
- growsurf_python-1.3.0/tests/types/test_affiliate_application.py +56 -0
- growsurf_python-1.3.0/tests/types/test_analytics_reward_status.py +34 -0
- growsurf_python-1.3.0/tests/types/test_email_analytics.py +24 -0
- growsurf_python-1.3.0/tests/types/test_participant_contract.py +22 -0
- growsurf_python-1.3.0/tests/types/test_payout_provider_forward_compat.py +32 -0
- growsurf_python-1.3.0/tests/types/test_referral_source.py +13 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/uv.lock +154 -475
- growsurf_python-1.2.1/.release-please-manifest.json +0 -3
- growsurf_python-1.2.1/src/growsurf/types/campaign/campaign_design.py +0 -13
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/.gitignore +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/CONTRIBUTING.md +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/LICENSE +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/SECURITY.md +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/bin/check-release-environment +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/bin/publish-pypi +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/examples/.keep +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/release-please-config.json +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/requirements-dev.lock +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_client.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_compat.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_constants.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_exceptions.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_files.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_models.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_qs.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_resource.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_streaming.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_types.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_compat.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_json.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_logs.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_path.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_proxy.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_reflection.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_streams.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_sync.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_transform.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_typing.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/_utils/_utils.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/lib/.keep +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/py.typed +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/account.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/commission.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/emails.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/installation.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/reward.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/resources/team.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/account_create_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_reward.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/referral_status.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_list_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/campaign_update_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/commission_structure.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/create_account_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/participant_commission_list.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/participant_list.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/referral_list.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/team.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/team_update_params.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/src/growsurf/types/verification_email_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/__init__.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_commission.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_emails.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_installation.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_options.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_reward.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_rewards.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/test_account.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/api_resources/test_team_contract.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/conftest.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/sample_file.txt +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_extract_files.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_files.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_models.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_qs.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_required_args.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_response.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_streaming.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_transform.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_utils/test_json.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_utils/test_path.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_utils/test_proxy.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/test_utils/test_typing.py +0 -0
- {growsurf_python-1.2.1 → growsurf_python-1.3.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.3.0](https://github.com/growsurf/growsurf-python/compare/v1.2.1...v1.3.0) (2026-08-23)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **api:** add affiliate and payout destination APIs ([29fe1c8](https://github.com/growsurf/growsurf-python/commit/29fe1c87053a539fa726898c3fd1b5ff368adf9e))
|
|
9
|
+
* **api:** add affiliate and payout destination APIs ([a27f73b](https://github.com/growsurf/growsurf-python/commit/a27f73b3be157f58b5f067abc08b73ef855ce2c0))
|
|
10
|
+
* release 1.3.0 with Python 3.10 baseline and analytics updates ([e01d6a0](https://github.com/growsurf/growsurf-python/commit/e01d6a0ae5824065c197f54210f94cea8760d524))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **api:** align analytics reward status models ([ffe8879](https://github.com/growsurf/growsurf-python/commit/ffe8879481fbf8ea8f660135b65ace1cb9f463da))
|
|
16
|
+
|
|
3
17
|
## [1.2.1](https://github.com/growsurf/growsurf-python/compare/v1.2.0...v1.2.1) (2026-07-14)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: growsurf-python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: The official Python library for the growsurf API
|
|
5
5
|
Project-URL: Homepage, https://github.com/growsurf/growsurf-python
|
|
6
6
|
Project-URL: Repository, https://github.com/growsurf/growsurf-python
|
|
@@ -13,7 +13,6 @@ Classifier: Operating System :: Microsoft :: Windows
|
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
14
|
Classifier: Operating System :: POSIX
|
|
15
15
|
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -21,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.14
|
|
22
21
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
22
|
Classifier: Typing :: Typed
|
|
24
|
-
Requires-Python: >=3.
|
|
23
|
+
Requires-Python: >=3.10
|
|
25
24
|
Requires-Dist: anyio<5,>=3.5.0
|
|
26
25
|
Requires-Dist: distro<2,>=1.7.0
|
|
27
26
|
Requires-Dist: httpx<1,>=0.23.0
|
|
@@ -29,7 +28,7 @@ Requires-Dist: pydantic<3,>=1.9.0
|
|
|
29
28
|
Requires-Dist: sniffio
|
|
30
29
|
Requires-Dist: typing-extensions<5,>=4.14
|
|
31
30
|
Provides-Extra: aiohttp
|
|
32
|
-
Requires-Dist: aiohttp; extra == 'aiohttp'
|
|
31
|
+
Requires-Dist: aiohttp<4,>=3.14.3; extra == 'aiohttp'
|
|
33
32
|
Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
|
|
34
33
|
Description-Content-Type: text/markdown
|
|
35
34
|
|
|
@@ -38,7 +37,7 @@ Description-Content-Type: text/markdown
|
|
|
38
37
|
<!-- prettier-ignore -->
|
|
39
38
|
[&cacheSeconds=300)](https://pypi.org/project/growsurf-python/)
|
|
40
39
|
|
|
41
|
-
The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.
|
|
40
|
+
The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.10+
|
|
42
41
|
application. The library includes type definitions for all request params and response fields,
|
|
43
42
|
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
|
|
44
43
|
|
|
@@ -392,7 +391,7 @@ print(growsurf.__version__)
|
|
|
392
391
|
|
|
393
392
|
## Requirements
|
|
394
393
|
|
|
395
|
-
Python 3.
|
|
394
|
+
Python 3.10 or higher.
|
|
396
395
|
|
|
397
396
|
## Contributing
|
|
398
397
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<!-- prettier-ignore -->
|
|
4
4
|
[&cacheSeconds=300)](https://pypi.org/project/growsurf-python/)
|
|
5
5
|
|
|
6
|
-
The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.
|
|
6
|
+
The Growsurf Python library provides convenient access to the Growsurf REST API from any Python 3.10+
|
|
7
7
|
application. The library includes type definitions for all request params and response fields,
|
|
8
8
|
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
|
|
9
9
|
|
|
@@ -357,7 +357,7 @@ print(growsurf.__version__)
|
|
|
357
357
|
|
|
358
358
|
## Requirements
|
|
359
359
|
|
|
360
|
-
Python 3.
|
|
360
|
+
Python 3.10 or higher.
|
|
361
361
|
|
|
362
362
|
## Contributing
|
|
363
363
|
|
|
@@ -39,6 +39,11 @@ Types:
|
|
|
39
39
|
```python
|
|
40
40
|
from growsurf.types import (
|
|
41
41
|
Campaign,
|
|
42
|
+
AffiliateInvite,
|
|
43
|
+
AffiliateApplication,
|
|
44
|
+
AffiliateApplicationAnswer,
|
|
45
|
+
AffiliateInviteListResponse,
|
|
46
|
+
AffiliateApplicationListResponse,
|
|
42
47
|
CommissionStructure,
|
|
43
48
|
ParticipantCommissionList,
|
|
44
49
|
ParticipantList,
|
|
@@ -64,6 +69,13 @@ Methods:
|
|
|
64
69
|
- <code title="get /campaign/{id}/payouts">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_payouts</a>(id, \*\*<a href="src/growsurf/types/campaign_list_payouts_params.py">params</a>) -> <a href="./src/growsurf/types/participant_payout_list.py">ParticipantPayoutList</a></code>
|
|
65
70
|
- <code title="get /campaign/{id}/referrals">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_referrals</a>(id, \*\*<a href="src/growsurf/types/campaign_list_referrals_params.py">params</a>) -> <a href="./src/growsurf/types/referral_list.py">ReferralList</a></code>
|
|
66
71
|
- <code title="get /campaign/{id}/analytics">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">retrieve_analytics</a>(id, \*\*<a href="src/growsurf/types/campaign_retrieve_analytics_params.py">params</a>) -> <a href="./src/growsurf/types/campaign_retrieve_analytics_response.py">CampaignRetrieveAnalyticsResponse</a></code>
|
|
72
|
+
- <code title="get /campaign/{id}/affiliate-applications">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_affiliate_applications</a>(id, \*\*<a href="src/growsurf/types/campaign_list_affiliate_applications_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_application_list_response.py">AffiliateApplicationListResponse</a></code>
|
|
73
|
+
- <code title="get /campaign/{id}/affiliate-applications/{applicationId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">retrieve_affiliate_application</a>(application_id, \*, id) -> <a href="./src/growsurf/types/affiliate_application.py">AffiliateApplication</a></code>
|
|
74
|
+
- <code title="patch /campaign/{id}/affiliate-applications/{applicationId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">review_affiliate_application</a>(application_id, \*, id, \*\*<a href="src/growsurf/types/campaign_review_affiliate_application_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_application.py">AffiliateApplication</a></code>
|
|
75
|
+
- <code title="get /campaign/{id}/affiliate-invites">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">list_affiliate_invites</a>(id, \*\*<a href="src/growsurf/types/campaign_list_affiliate_invites_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_invite_list_response.py">AffiliateInviteListResponse</a></code>
|
|
76
|
+
- <code title="post /campaign/{id}/affiliate-invites">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">create_affiliate_invite</a>(id, \*\*<a href="src/growsurf/types/campaign_create_affiliate_invite_params.py">params</a>) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
|
|
77
|
+
- <code title="delete /campaign/{id}/affiliate-invites/{inviteId}">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">revoke_affiliate_invite</a>(invite_id, \*, id) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
|
|
78
|
+
- <code title="post /campaign/{id}/affiliate-invites/{inviteId}/resend">client.campaign.<a href="./src/growsurf/resources/campaign/campaign.py">resend_affiliate_invite</a>(invite_id, \*, id) -> <a href="./src/growsurf/types/affiliate_invite.py">AffiliateInvite</a></code>
|
|
67
79
|
|
|
68
80
|
## Participant
|
|
69
81
|
|
|
@@ -71,7 +83,6 @@ Types:
|
|
|
71
83
|
|
|
72
84
|
```python
|
|
73
85
|
from growsurf.types.campaign import (
|
|
74
|
-
Create,
|
|
75
86
|
FraudRiskLevel,
|
|
76
87
|
Participant,
|
|
77
88
|
ParticipantReward,
|
|
@@ -87,6 +98,8 @@ from growsurf.types.campaign import (
|
|
|
87
98
|
ParticipantRefundTransactionResponse,
|
|
88
99
|
ParticipantSendInvitesResponse,
|
|
89
100
|
ParticipantTriggerReferralResponse,
|
|
101
|
+
ParticipantGetPayoutDestinationResponse,
|
|
102
|
+
ParticipantRequestPayoutDestinationConfirmationResponse,
|
|
90
103
|
)
|
|
91
104
|
```
|
|
92
105
|
|
|
@@ -109,6 +122,8 @@ Methods:
|
|
|
109
122
|
- <code title="post /campaign/{id}/participant/{participantIdOrEmail}/email">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">email</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_email_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/email_participant_response.py">EmailParticipantResponse</a></code>
|
|
110
123
|
- <code title="get /campaign/{id}/participant/{participantIdOrEmail}/activity-logs">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">list_activity_logs</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_list_activity_logs_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_activity_logs_response.py">ParticipantActivityLogsResponse</a></code>
|
|
111
124
|
- <code title="get /campaign/{id}/participant/{participantIdOrEmail}/analytics">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">retrieve_analytics</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_analytics_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_analytics_response.py">ParticipantAnalyticsResponse</a></code>
|
|
125
|
+
- <code title="get /campaign/{id}/participant/{participantIdOrEmail}/payout-destination">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">get_payout_destination</a>(participant_id_or_email, \*, id) -> <a href="./src/growsurf/types/campaign/participant_get_payout_destination_response.py">ParticipantGetPayoutDestinationResponse</a></code>
|
|
126
|
+
- <code title="post /campaign/{id}/participant/{participantIdOrEmail}/payout-destination/request-confirmation">client.campaign.participant.<a href="./src/growsurf/resources/campaign/participant.py">request_payout_destination_confirmation</a>(participant_id_or_email, \*, id, \*\*<a href="src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py">params</a>) -> <a href="./src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py">ParticipantRequestPayoutDestinationConfirmationResponse</a></code>
|
|
112
127
|
|
|
113
128
|
## Reward
|
|
114
129
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "growsurf-python"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.3.0"
|
|
4
4
|
description = "The official Python library for the growsurf API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -17,11 +17,10 @@ dependencies = [
|
|
|
17
17
|
"sniffio",
|
|
18
18
|
]
|
|
19
19
|
|
|
20
|
-
requires-python = ">= 3.
|
|
20
|
+
requires-python = ">= 3.10"
|
|
21
21
|
classifiers = [
|
|
22
22
|
"Typing :: Typed",
|
|
23
23
|
"Intended Audience :: Developers",
|
|
24
|
-
"Programming Language :: Python :: 3.9",
|
|
25
24
|
"Programming Language :: Python :: 3.10",
|
|
26
25
|
"Programming Language :: Python :: 3.11",
|
|
27
26
|
"Programming Language :: Python :: 3.12",
|
|
@@ -41,7 +40,7 @@ Homepage = "https://github.com/growsurf/growsurf-python"
|
|
|
41
40
|
Repository = "https://github.com/growsurf/growsurf-python"
|
|
42
41
|
|
|
43
42
|
[project.optional-dependencies]
|
|
44
|
-
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
|
|
43
|
+
aiohttp = ["aiohttp>=3.14.3,<4", "httpx_aiohttp>=0.1.9"]
|
|
45
44
|
|
|
46
45
|
[tool.uv]
|
|
47
46
|
managed = true
|
|
@@ -129,7 +128,7 @@ filterwarnings = [
|
|
|
129
128
|
# there are a couple of flags that are still disabled by
|
|
130
129
|
# default in strict mode as they are experimental and niche.
|
|
131
130
|
typeCheckingMode = "strict"
|
|
132
|
-
pythonVersion = "3.
|
|
131
|
+
pythonVersion = "3.10"
|
|
133
132
|
|
|
134
133
|
exclude = [
|
|
135
134
|
"_dev",
|
|
@@ -789,6 +789,15 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
|
|
|
789
789
|
timeout = sleep_seconds * jitter
|
|
790
790
|
return timeout if timeout >= 0 else 0
|
|
791
791
|
|
|
792
|
+
def _request_is_retry_safe(self, options: FinalRequestOptions) -> bool:
|
|
793
|
+
"""Return whether replaying the request cannot duplicate a customer-visible mutation."""
|
|
794
|
+
method = options.method.lower()
|
|
795
|
+
url = URL(str(options.url))
|
|
796
|
+
path = url.path.rstrip("/")
|
|
797
|
+
return method in {"get", "head"} or (
|
|
798
|
+
method == "post" and url.is_relative_url and path == "/api-key/rotate"
|
|
799
|
+
)
|
|
800
|
+
|
|
792
801
|
def _should_retry(self, response: httpx.Response) -> bool:
|
|
793
802
|
# Note: this is not a standard header
|
|
794
803
|
should_retry_header = response.headers.get("x-should-retry")
|
|
@@ -994,9 +1003,10 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
|
|
|
994
1003
|
# options are mutated later & we then retry, the retries are
|
|
995
1004
|
# given the original options
|
|
996
1005
|
input_options = model_copy(options)
|
|
997
|
-
if input_options.idempotency_key is None and
|
|
1006
|
+
if input_options.idempotency_key is None and self._request_is_retry_safe(input_options):
|
|
998
1007
|
# ensure the idempotency key is reused between requests
|
|
999
|
-
input_options.
|
|
1008
|
+
if input_options.method.lower() == "post":
|
|
1009
|
+
input_options.idempotency_key = self._idempotency_key()
|
|
1000
1010
|
|
|
1001
1011
|
response: httpx.Response | None = None
|
|
1002
1012
|
max_retries = input_options.get_max_retries(self.max_retries)
|
|
@@ -1030,7 +1040,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
|
|
|
1030
1040
|
except httpx.TimeoutException as err:
|
|
1031
1041
|
log.debug("Encountered httpx.TimeoutException", exc_info=True)
|
|
1032
1042
|
|
|
1033
|
-
if remaining_retries > 0:
|
|
1043
|
+
if remaining_retries > 0 and self._request_is_retry_safe(input_options):
|
|
1034
1044
|
self._sleep_for_retry(
|
|
1035
1045
|
retries_taken=retries_taken,
|
|
1036
1046
|
max_retries=max_retries,
|
|
@@ -1044,7 +1054,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
|
|
|
1044
1054
|
except Exception as err:
|
|
1045
1055
|
log.debug("Encountered Exception", exc_info=True)
|
|
1046
1056
|
|
|
1047
|
-
if remaining_retries > 0:
|
|
1057
|
+
if remaining_retries > 0 and self._request_is_retry_safe(input_options):
|
|
1048
1058
|
self._sleep_for_retry(
|
|
1049
1059
|
retries_taken=retries_taken,
|
|
1050
1060
|
max_retries=max_retries,
|
|
@@ -1070,7 +1080,11 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
|
|
|
1070
1080
|
except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
|
|
1071
1081
|
log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
|
|
1072
1082
|
|
|
1073
|
-
if
|
|
1083
|
+
if (
|
|
1084
|
+
remaining_retries > 0
|
|
1085
|
+
and self._request_is_retry_safe(input_options)
|
|
1086
|
+
and self._should_retry(err.response)
|
|
1087
|
+
):
|
|
1074
1088
|
err.response.close()
|
|
1075
1089
|
self._sleep_for_retry(
|
|
1076
1090
|
retries_taken=retries_taken,
|
|
@@ -1579,9 +1593,10 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
|
|
|
1579
1593
|
# options are mutated later & we then retry, the retries are
|
|
1580
1594
|
# given the original options
|
|
1581
1595
|
input_options = model_copy(options)
|
|
1582
|
-
if input_options.idempotency_key is None and
|
|
1596
|
+
if input_options.idempotency_key is None and self._request_is_retry_safe(input_options):
|
|
1583
1597
|
# ensure the idempotency key is reused between requests
|
|
1584
|
-
input_options.
|
|
1598
|
+
if input_options.method.lower() == "post":
|
|
1599
|
+
input_options.idempotency_key = self._idempotency_key()
|
|
1585
1600
|
|
|
1586
1601
|
response: httpx.Response | None = None
|
|
1587
1602
|
max_retries = input_options.get_max_retries(self.max_retries)
|
|
@@ -1614,7 +1629,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
|
|
|
1614
1629
|
except httpx.TimeoutException as err:
|
|
1615
1630
|
log.debug("Encountered httpx.TimeoutException", exc_info=True)
|
|
1616
1631
|
|
|
1617
|
-
if remaining_retries > 0:
|
|
1632
|
+
if remaining_retries > 0 and self._request_is_retry_safe(input_options):
|
|
1618
1633
|
await self._sleep_for_retry(
|
|
1619
1634
|
retries_taken=retries_taken,
|
|
1620
1635
|
max_retries=max_retries,
|
|
@@ -1628,7 +1643,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
|
|
|
1628
1643
|
except Exception as err:
|
|
1629
1644
|
log.debug("Encountered Exception", exc_info=True)
|
|
1630
1645
|
|
|
1631
|
-
if remaining_retries > 0:
|
|
1646
|
+
if remaining_retries > 0 and self._request_is_retry_safe(input_options):
|
|
1632
1647
|
await self._sleep_for_retry(
|
|
1633
1648
|
retries_taken=retries_taken,
|
|
1634
1649
|
max_retries=max_retries,
|
|
@@ -1654,7 +1669,11 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
|
|
|
1654
1669
|
except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
|
|
1655
1670
|
log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
|
|
1656
1671
|
|
|
1657
|
-
if
|
|
1672
|
+
if (
|
|
1673
|
+
remaining_retries > 0
|
|
1674
|
+
and self._request_is_retry_safe(input_options)
|
|
1675
|
+
and self._should_retry(err.response)
|
|
1676
|
+
):
|
|
1658
1677
|
await err.response.aclose()
|
|
1659
1678
|
await self._sleep_for_retry(
|
|
1660
1679
|
retries_taken=retries_taken,
|