growsurf-python 1.2.1__tar.gz → 1.4.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.
Files changed (194) hide show
  1. growsurf_python-1.4.0/.release-please-manifest.json +3 -0
  2. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/CHANGELOG.md +21 -0
  3. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/PKG-INFO +5 -6
  4. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/README.md +2 -2
  5. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/api.md +16 -1
  6. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/pyproject.toml +4 -5
  7. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_base_client.py +29 -10
  8. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_version.py +1 -1
  9. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/campaign.py +848 -20
  10. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/design.py +26 -24
  11. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/options.py +14 -14
  12. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/participant.py +329 -38
  13. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/rewards.py +44 -12
  14. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/__init__.py +22 -0
  15. growsurf_python-1.4.0/src/growsurf/types/affiliate_application.py +67 -0
  16. growsurf_python-1.4.0/src/growsurf/types/affiliate_application_answer.py +24 -0
  17. growsurf_python-1.4.0/src/growsurf/types/affiliate_application_list_response.py +22 -0
  18. growsurf_python-1.4.0/src/growsurf/types/affiliate_invite.py +45 -0
  19. growsurf_python-1.4.0/src/growsurf/types/affiliate_invite_list_response.py +22 -0
  20. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/__init__.py +9 -0
  21. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/campaign.py +21 -4
  22. growsurf_python-1.4.0/src/growsurf/types/campaign/campaign_design.py +20 -0
  23. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/campaign_options.py +5 -5
  24. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant.py +27 -4
  25. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_add_params.py +8 -0
  26. growsurf_python-1.4.0/src/growsurf/types/campaign/participant_analytics_params.py +50 -0
  27. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_analytics_response.py +19 -6
  28. growsurf_python-1.4.0/src/growsurf/types/campaign/participant_get_payout_destination_response.py +50 -0
  29. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_payouts_params.py +1 -1
  30. growsurf_python-1.4.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_params.py +14 -0
  31. growsurf_python-1.4.0/src/growsurf/types/campaign/participant_request_payout_destination_confirmation_response.py +24 -0
  32. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_reward.py +1 -1
  33. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_update_params.py +9 -3
  34. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/referral_source.py +1 -1
  35. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward.py +18 -3
  36. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_create_params.py +9 -3
  37. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_tax_valuation.py +14 -5
  38. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_update_params.py +9 -3
  39. growsurf_python-1.4.0/src/growsurf/types/campaign_create_affiliate_invite_params.py +20 -0
  40. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_create_mobile_participant_token_params.py +8 -0
  41. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_create_params.py +1 -1
  42. growsurf_python-1.4.0/src/growsurf/types/campaign_list_affiliate_applications_params.py +18 -0
  43. growsurf_python-1.4.0/src/growsurf/types/campaign_list_affiliate_invites_params.py +18 -0
  44. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_payouts_params.py +1 -1
  45. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_retrieve_analytics_params.py +9 -7
  46. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_retrieve_analytics_response.py +29 -3
  47. growsurf_python-1.4.0/src/growsurf/types/campaign_review_affiliate_application_params.py +53 -0
  48. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/commission_structure.py +2 -1
  49. growsurf_python-1.4.0/src/growsurf/types/email_analytics.py +36 -0
  50. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/participant_commission_list.py +3 -0
  51. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/participant_payout_list.py +3 -1
  52. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_design.py +8 -2
  53. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_participant.py +234 -2
  54. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/test_campaign.py +774 -0
  55. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_client.py +75 -1
  56. growsurf_python-1.4.0/tests/types/test_affiliate_application.py +56 -0
  57. growsurf_python-1.4.0/tests/types/test_analytics_reward_status.py +34 -0
  58. growsurf_python-1.4.0/tests/types/test_email_analytics.py +24 -0
  59. growsurf_python-1.4.0/tests/types/test_lead_reward_events.py +62 -0
  60. growsurf_python-1.4.0/tests/types/test_participant_contract.py +22 -0
  61. growsurf_python-1.4.0/tests/types/test_payout_provider_forward_compat.py +32 -0
  62. growsurf_python-1.4.0/tests/types/test_referral_source.py +13 -0
  63. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/uv.lock +154 -475
  64. growsurf_python-1.2.1/.release-please-manifest.json +0 -3
  65. growsurf_python-1.2.1/src/growsurf/types/campaign/campaign_design.py +0 -13
  66. growsurf_python-1.2.1/src/growsurf/types/campaign/participant_analytics_params.py +0 -37
  67. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/.gitignore +0 -0
  68. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/CONTRIBUTING.md +0 -0
  69. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/LICENSE +0 -0
  70. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/SECURITY.md +0 -0
  71. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/bin/check-release-environment +0 -0
  72. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/bin/publish-pypi +0 -0
  73. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/examples/.keep +0 -0
  74. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/release-please-config.json +0 -0
  75. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/requirements-dev.lock +0 -0
  76. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/__init__.py +0 -0
  77. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_client.py +0 -0
  78. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_compat.py +0 -0
  79. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_constants.py +0 -0
  80. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_exceptions.py +0 -0
  81. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_files.py +0 -0
  82. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_models.py +0 -0
  83. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_qs.py +0 -0
  84. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_resource.py +0 -0
  85. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_response.py +0 -0
  86. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_streaming.py +0 -0
  87. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_types.py +0 -0
  88. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/__init__.py +0 -0
  89. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_compat.py +0 -0
  90. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_datetime_parse.py +0 -0
  91. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_json.py +0 -0
  92. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_logs.py +0 -0
  93. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_path.py +0 -0
  94. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_proxy.py +0 -0
  95. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_reflection.py +0 -0
  96. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_resources_proxy.py +0 -0
  97. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_streams.py +0 -0
  98. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_sync.py +0 -0
  99. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_transform.py +0 -0
  100. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_typing.py +0 -0
  101. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/_utils/_utils.py +0 -0
  102. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/lib/.keep +0 -0
  103. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/py.typed +0 -0
  104. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/__init__.py +0 -0
  105. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/account.py +0 -0
  106. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/__init__.py +0 -0
  107. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/commission.py +0 -0
  108. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/emails.py +0 -0
  109. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/installation.py +0 -0
  110. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/reward.py +0 -0
  111. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/campaign/webhooks.py +0 -0
  112. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/resources/team.py +0 -0
  113. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/account_create_params.py +0 -0
  114. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/campaign_emails.py +0 -0
  115. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/campaign_installation.py +0 -0
  116. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/campaign_reward_list_response.py +0 -0
  117. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/commission_approve_response.py +0 -0
  118. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/commission_delete_response.py +0 -0
  119. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/delete_reward_response.py +0 -0
  120. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/delete_webhook_response.py +0 -0
  121. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/email_participant_response.py +0 -0
  122. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/fraud_risk_level.py +0 -0
  123. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_activity_logs_response.py +0 -0
  124. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_bulk_delete_params.py +0 -0
  125. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_bulk_delete_response.py +0 -0
  126. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_delete_response.py +0 -0
  127. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_email_params.py +0 -0
  128. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_activity_logs_params.py +0 -0
  129. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_commissions_params.py +0 -0
  130. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_referrals_params.py +0 -0
  131. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_rewards_params.py +0 -0
  132. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_list_rewards_response.py +0 -0
  133. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_record_transaction_params.py +0 -0
  134. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_record_transaction_response.py +0 -0
  135. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_refund_transaction_params.py +0 -0
  136. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_refund_transaction_response.py +0 -0
  137. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_send_invites_params.py +0 -0
  138. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_send_invites_response.py +0 -0
  139. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_trigger_referral_params.py +0 -0
  140. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/participant_trigger_referral_response.py +0 -0
  141. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/referral_status.py +0 -0
  142. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_approve_params.py +0 -0
  143. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_approve_response.py +0 -0
  144. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_delete_response.py +0 -0
  145. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/reward_fulfill_response.py +0 -0
  146. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook.py +0 -0
  147. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_create_params.py +0 -0
  148. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_event.py +0 -0
  149. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_list_response.py +0 -0
  150. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_test_params.py +0 -0
  151. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_test_response.py +0 -0
  152. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign/webhook_update_params.py +0 -0
  153. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_create_mobile_participant_token_response.py +0 -0
  154. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_commissions_params.py +0 -0
  155. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_leaderboard_params.py +0 -0
  156. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_participants_params.py +0 -0
  157. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_referrals_params.py +0 -0
  158. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_list_response.py +0 -0
  159. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/campaign_update_params.py +0 -0
  160. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/create_account_response.py +0 -0
  161. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/participant_list.py +0 -0
  162. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/referral_list.py +0 -0
  163. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/rotate_api_key_response.py +0 -0
  164. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/team.py +0 -0
  165. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/team_update_params.py +0 -0
  166. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/src/growsurf/types/verification_email_response.py +0 -0
  167. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/__init__.py +0 -0
  168. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/__init__.py +0 -0
  169. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/__init__.py +0 -0
  170. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_commission.py +0 -0
  171. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_emails.py +0 -0
  172. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_installation.py +0 -0
  173. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_options.py +0 -0
  174. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_reward.py +0 -0
  175. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_rewards.py +0 -0
  176. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/campaign/test_webhooks.py +0 -0
  177. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/test_account.py +0 -0
  178. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/api_resources/test_team_contract.py +0 -0
  179. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/conftest.py +0 -0
  180. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/sample_file.txt +0 -0
  181. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_extract_files.py +0 -0
  182. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_files.py +0 -0
  183. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_models.py +0 -0
  184. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_qs.py +0 -0
  185. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_required_args.py +0 -0
  186. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_response.py +0 -0
  187. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_streaming.py +0 -0
  188. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_transform.py +0 -0
  189. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_utils/test_datetime_parse.py +0 -0
  190. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_utils/test_json.py +0 -0
  191. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_utils/test_path.py +0 -0
  192. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_utils/test_proxy.py +0 -0
  193. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/test_utils/test_typing.py +0 -0
  194. {growsurf_python-1.2.1 → growsurf_python-1.4.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.4.0"
3
+ }
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.0](https://github.com/growsurf/growsurf-python/compare/v1.3.0...v1.4.0) (2026-08-25)
4
+
5
+
6
+ ### Features
7
+
8
+ * **api:** add reward and commission event support ([a8b2506](https://github.com/growsurf/growsurf-python/commit/a8b25066fc91b7a144b4a718911f8f2123bdecb3))
9
+
10
+ ## [1.3.0](https://github.com/growsurf/growsurf-python/compare/v1.2.1...v1.3.0) (2026-08-23)
11
+
12
+
13
+ ### Features
14
+
15
+ * **api:** add affiliate and payout destination APIs ([29fe1c8](https://github.com/growsurf/growsurf-python/commit/29fe1c87053a539fa726898c3fd1b5ff368adf9e))
16
+ * **api:** add affiliate and payout destination APIs ([a27f73b](https://github.com/growsurf/growsurf-python/commit/a27f73b3be157f58b5f067abc08b73ef855ce2c0))
17
+ * release 1.3.0 with Python 3.10 baseline and analytics updates ([e01d6a0](https://github.com/growsurf/growsurf-python/commit/e01d6a0ae5824065c197f54210f94cea8760d524))
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **api:** align analytics reward status models ([ffe8879](https://github.com/growsurf/growsurf-python/commit/ffe8879481fbf8ea8f660135b65ace1cb9f463da))
23
+
3
24
  ## [1.2.1](https://github.com/growsurf/growsurf-python/compare/v1.2.0...v1.2.1) (2026-07-14)
4
25
 
5
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: growsurf-python
3
- Version: 1.2.1
3
+ Version: 1.4.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.9
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
  [![PyPI version](https://img.shields.io/pypi/v/growsurf-python.svg?label=pypi%20(stable)&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.9+
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.9 or higher.
394
+ Python 3.10 or higher.
396
395
 
397
396
  ## Contributing
398
397
 
@@ -3,7 +3,7 @@
3
3
  <!-- prettier-ignore -->
4
4
  [![PyPI version](https://img.shields.io/pypi/v/growsurf-python.svg?label=pypi%20(stable)&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.9+
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.9 or higher.
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.2.1"
3
+ version = "1.4.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.9"
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.9"
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 input_options.method.lower() != "get":
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.idempotency_key = self._idempotency_key()
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 remaining_retries > 0 and self._should_retry(err.response):
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 input_options.method.lower() != "get":
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.idempotency_key = self._idempotency_key()
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 remaining_retries > 0 and self._should_retry(err.response):
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,
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "growsurf"
4
- __version__ = "1.2.1" # x-release-please-version
4
+ __version__ = "1.4.0" # x-release-please-version