marqetive-lib 0.1.13__tar.gz → 0.1.14__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 (39) hide show
  1. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/PKG-INFO +1 -1
  2. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/pyproject.toml +1 -1
  3. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/oauth.py +41 -6
  4. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/README.md +0 -0
  5. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/__init__.py +0 -0
  6. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/core/__init__.py +0 -0
  7. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/core/base.py +0 -0
  8. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/core/client.py +0 -0
  9. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/core/exceptions.py +0 -0
  10. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/core/models.py +0 -0
  11. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/factory.py +0 -0
  12. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/__init__.py +0 -0
  13. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/instagram/__init__.py +0 -0
  14. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/instagram/client.py +0 -0
  15. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/instagram/exceptions.py +0 -0
  16. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/instagram/media.py +0 -0
  17. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/instagram/models.py +0 -0
  18. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/linkedin/__init__.py +0 -0
  19. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/linkedin/client.py +0 -0
  20. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/linkedin/exceptions.py +0 -0
  21. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/linkedin/media.py +0 -0
  22. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/linkedin/models.py +0 -0
  23. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/tiktok/__init__.py +0 -0
  24. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/tiktok/client.py +0 -0
  25. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/tiktok/exceptions.py +0 -0
  26. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/tiktok/media.py +0 -0
  27. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/tiktok/models.py +0 -0
  28. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/twitter/__init__.py +0 -0
  29. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/twitter/client.py +0 -0
  30. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/twitter/exceptions.py +0 -0
  31. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/twitter/media.py +0 -0
  32. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/platforms/twitter/models.py +0 -0
  33. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/py.typed +0 -0
  34. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/__init__.py +0 -0
  35. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/file_handlers.py +0 -0
  36. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/helpers.py +0 -0
  37. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/media.py +0 -0
  38. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/retry.py +0 -0
  39. {marqetive_lib-0.1.13 → marqetive_lib-0.1.14}/src/marqetive/utils/token_validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marqetive-lib
3
- Version: 0.1.13
3
+ Version: 0.1.14
4
4
  Summary: Modern Python utilities for web APIs
5
5
  Keywords: api,utilities,web,http,marqetive
6
6
  Requires-Python: >=3.12
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "marqetive-lib"
7
- version = "0.1.13"
7
+ version = "0.1.14"
8
8
  description = "Modern Python utilities for web APIs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -120,6 +120,9 @@ async def refresh_twitter_token(
120
120
  ) -> AuthCredentials:
121
121
  """Refresh Twitter OAuth2 access token.
122
122
 
123
+ Twitter requires HTTP Basic Authentication with client credentials
124
+ in the Authorization header, not in the request body.
125
+
123
126
  Args:
124
127
  credentials: Current credentials with refresh token.
125
128
  client_id: Twitter OAuth client ID.
@@ -144,6 +147,8 @@ async def refresh_twitter_token(
144
147
  ... os.getenv("TWITTER_CLIENT_SECRET")
145
148
  ... )
146
149
  """
150
+ import base64
151
+
147
152
  if not credentials.refresh_token:
148
153
  raise PlatformAuthError(
149
154
  "No refresh token available",
@@ -152,12 +157,42 @@ async def refresh_twitter_token(
152
157
 
153
158
  token_url = "https://api.x.com/2/oauth2/token"
154
159
 
155
- token_data = await refresh_oauth2_token(
156
- refresh_token=credentials.refresh_token,
157
- client_id=client_id,
158
- client_secret=client_secret,
159
- token_url=token_url,
160
- )
160
+ # Twitter requires Basic Auth header for confidential clients
161
+ basic_auth = base64.b64encode(f"{client_id}:{client_secret}".encode()).decode()
162
+
163
+ params = {
164
+ "grant_type": "refresh_token",
165
+ "refresh_token": credentials.refresh_token,
166
+ }
167
+
168
+ try:
169
+ async with httpx.AsyncClient() as client:
170
+ response = await client.post(
171
+ token_url,
172
+ data=params,
173
+ headers={
174
+ "Content-Type": "application/x-www-form-urlencoded",
175
+ "Authorization": f"Basic {basic_auth}",
176
+ },
177
+ timeout=30.0,
178
+ )
179
+ response.raise_for_status()
180
+ token_data = response.json()
181
+
182
+ except httpx.HTTPStatusError as e:
183
+ logger.error(f"HTTP error refreshing Twitter token: {e.response.status_code}")
184
+ raise PlatformAuthError(
185
+ f"Failed to refresh token: {_sanitize_response_text(e.response.text)}",
186
+ platform="twitter",
187
+ status_code=e.response.status_code,
188
+ ) from e
189
+
190
+ except httpx.HTTPError as e:
191
+ logger.error(f"Network error refreshing Twitter token: {e}")
192
+ raise PlatformAuthError(
193
+ f"Network error refreshing token: {e}",
194
+ platform="twitter",
195
+ ) from e
161
196
 
162
197
  # Update credentials
163
198
  credentials.access_token = token_data["access_token"]
File without changes