ctrader-api-client 0.4.2__tar.gz → 0.4.3__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 (92) hide show
  1. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/PKG-INFO +1 -1
  2. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/pyproject.toml +1 -1
  3. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/auth/manager.py +9 -9
  4. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/client.py +7 -7
  5. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/connection/heartbeat.py +3 -3
  6. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/connection/protocol.py +1 -1
  7. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/connection/transport.py +1 -1
  8. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/events/router.py +2 -2
  9. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/uv.lock +1 -1
  10. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/.claude/settings.local.json +0 -0
  11. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/.github/workflows/docs.yml +0 -0
  12. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/.gitignore +0 -0
  13. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/.pre-commit-config.yaml +0 -0
  14. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/.python-version +0 -0
  15. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/Justfile +0 -0
  16. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/LICENSE +0 -0
  17. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/README.md +0 -0
  18. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/accounts.md +0 -0
  19. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/client.md +0 -0
  20. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/enums.md +0 -0
  21. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/events.md +0 -0
  22. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/market-data.md +0 -0
  23. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/models.md +0 -0
  24. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/symbols.md +0 -0
  25. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/api/trading.md +0 -0
  26. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/getting-started.md +0 -0
  27. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/docs/index.md +0 -0
  28. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/mkdocs.yml +0 -0
  29. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/SOURCE +0 -0
  30. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/VERSION +0 -0
  31. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/update.sh +0 -0
  32. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/vendor/OpenApiCommonMessages.proto +0 -0
  33. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/vendor/OpenApiCommonModelMessages.proto +0 -0
  34. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/vendor/OpenApiMessages.proto +0 -0
  35. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/protos/vendor/OpenApiModelMessages.proto +0 -0
  36. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/scripts/fix_proto_imports.py +0 -0
  37. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/__init__.py +0 -0
  38. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/__init__.py +0 -0
  39. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/messages.py +0 -0
  40. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/proto/OpenApiCommonMessages.py +0 -0
  41. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/proto/OpenApiCommonModelMessages.py +0 -0
  42. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/proto/OpenApiMessages.py +0 -0
  43. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/proto/OpenApiModelMessages.py +0 -0
  44. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/proto/__init__.py +0 -0
  45. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/_internal/serialization.py +0 -0
  46. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/api/__init__.py +0 -0
  47. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/api/accounts.py +0 -0
  48. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/api/market_data.py +0 -0
  49. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/api/symbols.py +0 -0
  50. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/api/trading.py +0 -0
  51. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/auth/__init__.py +0 -0
  52. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/auth/credentials.py +0 -0
  53. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/config.py +0 -0
  54. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/connection/__init__.py +0 -0
  55. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/enums.py +0 -0
  56. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/events/__init__.py +0 -0
  57. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/events/emitter.py +0 -0
  58. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/events/types.py +0 -0
  59. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/exceptions.py +0 -0
  60. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/__init__.py +0 -0
  61. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/_base.py +0 -0
  62. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/account.py +0 -0
  63. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/deal.py +0 -0
  64. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/market_data.py +0 -0
  65. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/order.py +0 -0
  66. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/position.py +0 -0
  67. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/requests.py +0 -0
  68. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/models/symbol.py +0 -0
  69. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/src/ctrader_api_client/py.typed +0 -0
  70. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/_internal/test_messages.py +0 -0
  71. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/_internal/test_serialization.py +0 -0
  72. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/api/conftest.py +0 -0
  73. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/api/test_accounts.py +0 -0
  74. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/api/test_market_data_api.py +0 -0
  75. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/api/test_symbols.py +0 -0
  76. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/api/test_trading.py +0 -0
  77. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/auth/test_credentials.py +0 -0
  78. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/auth/test_manager.py +0 -0
  79. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/connection/test_heartbeat.py +0 -0
  80. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/connection/test_protocol.py +0 -0
  81. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/connection/test_transport.py +0 -0
  82. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/events/test_emitter.py +0 -0
  83. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/events/test_router.py +0 -0
  84. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/events/test_types.py +0 -0
  85. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_account.py +0 -0
  86. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_deal.py +0 -0
  87. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_market_data.py +0 -0
  88. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_order.py +0 -0
  89. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_position.py +0 -0
  90. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_requests.py +0 -0
  91. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/models/test_symbol.py +0 -0
  92. {ctrader_api_client-0.4.2 → ctrader_api_client-0.4.3}/tests/unit/test_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ctrader-api-client
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: API Client to interact with the cTrader Open API spec
5
5
  Author-email: Elio <elioachukri@pm.me>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ctrader-api-client"
3
- version = "0.4.2"
3
+ version = "0.4.3"
4
4
  description = "API Client to interact with the cTrader Open API spec"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -159,7 +159,7 @@ class AuthManager:
159
159
  APIError: If authentication fails.
160
160
  CTraderConnectionTimeoutError: If request times out.
161
161
  """
162
- logger.info("Authenticating application")
162
+ logger.debug("Authenticating application")
163
163
 
164
164
  request = ProtoOAApplicationAuthReq(
165
165
  client_id=self._client_id,
@@ -175,7 +175,7 @@ class AuthManager:
175
175
  )
176
176
 
177
177
  self._app_authenticated = True
178
- logger.info("Application authenticated successfully")
178
+ logger.debug("Application authenticated successfully")
179
179
  return response
180
180
 
181
181
  async def authenticate_account(
@@ -200,9 +200,9 @@ class AuthManager:
200
200
  CTraderConnectionTimeoutError: If request times out.
201
201
  """
202
202
  if reauth:
203
- logger.info("Re-authenticating account %d", credentials.account_id)
203
+ logger.debug("Re-authenticating account %d", credentials.account_id)
204
204
  else:
205
- logger.info("Authenticating account %d", credentials.account_id)
205
+ logger.debug("Authenticating account %d", credentials.account_id)
206
206
 
207
207
  request = ProtoOAAccountAuthReq(
208
208
  ctid_trader_account_id=credentials.account_id,
@@ -219,7 +219,7 @@ class AuthManager:
219
219
 
220
220
  # Store credentials for refresh monitoring
221
221
  self._accounts[credentials.account_id] = credentials
222
- logger.info("Account %d authenticated successfully", credentials.account_id)
222
+ logger.debug("Account %d authenticated successfully", credentials.account_id)
223
223
 
224
224
  # Notify callback
225
225
  if self._on_account_ready is not None:
@@ -339,7 +339,7 @@ class AuthManager:
339
339
  APIError: If authentication fails.
340
340
  CTraderConnectionTimeoutError: If request times out.
341
341
  """
342
- logger.info("Authenticating by trader login %d", trader_login)
342
+ logger.debug("Authenticating by trader login %d", trader_login)
343
343
 
344
344
  # Resolve trader_login to account_id
345
345
  account_id = await self.resolve_account_id(access_token, trader_login, timeout=timeout)
@@ -368,7 +368,7 @@ class AuthManager:
368
368
  """
369
369
  if account_id in self._accounts:
370
370
  del self._accounts[account_id]
371
- logger.info("Account %d removed from auth manager", account_id)
371
+ logger.debug("Account %d removed from auth manager", account_id)
372
372
  return True
373
373
  return False
374
374
 
@@ -417,7 +417,7 @@ class AuthManager:
417
417
  continue
418
418
 
419
419
  if credentials.expires_soon(self._refresh_buffer):
420
- logger.info(
420
+ logger.debug(
421
421
  "Token for account %d expires soon (%.0fs remaining), refreshing",
422
422
  account_id,
423
423
  credentials.time_until_expiry(),
@@ -481,7 +481,7 @@ class AuthManager:
481
481
  )
482
482
  self._accounts[account_id] = new_credentials
483
483
 
484
- logger.info(
484
+ logger.debug(
485
485
  "Token refreshed for account %d, new expiry in %ds",
486
486
  account_id,
487
487
  response.expires_in,
@@ -257,7 +257,7 @@ class CTraderClient:
257
257
  if self._connected:
258
258
  return
259
259
 
260
- logger.info("Connecting to %s:%d", self._config.host, self._config.port)
260
+ logger.debug("Connecting to %s:%d", self._config.host, self._config.port)
261
261
 
262
262
  await self._transport.connect()
263
263
  await self._protocol.start()
@@ -266,7 +266,7 @@ class CTraderClient:
266
266
  self._router.start()
267
267
 
268
268
  self._connected = True
269
- logger.info("Connected successfully")
269
+ logger.info("Connected to cTrader server at %s:%d", self._config.host, self._config.port)
270
270
 
271
271
  async def close(self) -> None:
272
272
  """Close the connection and clean up resources.
@@ -277,7 +277,7 @@ class CTraderClient:
277
277
  if not self._connected:
278
278
  return
279
279
 
280
- logger.info("Closing connection")
280
+ logger.debug("Closing connection")
281
281
 
282
282
  self._router.stop()
283
283
  await self._auth.stop()
@@ -286,7 +286,7 @@ class CTraderClient:
286
286
  await self._transport.close()
287
287
 
288
288
  self._connected = False
289
- logger.info("Connection closed")
289
+ logger.debug("Connection closed")
290
290
 
291
291
  async def _emit_ready_event(self, account_id: int, is_reconnect: bool, is_reauth: bool) -> None:
292
292
  """Emit ReadyEvent when an account is authenticated.
@@ -313,7 +313,7 @@ class CTraderClient:
313
313
  the app and all previously authenticated accounts, then emits
314
314
  a ReconnectedEvent so users can restore subscriptions.
315
315
  """
316
- logger.info("Connection restored, re-authenticating...")
316
+ logger.debug("Connection restored, re-authenticating...")
317
317
 
318
318
  # Restart heartbeat monitoring
319
319
  await self._heartbeat.restart()
@@ -325,7 +325,7 @@ class CTraderClient:
325
325
  try:
326
326
  await self._auth.authenticate_app()
327
327
  app_auth_restored = True
328
- logger.info("App re-authenticated successfully")
328
+ logger.debug("App re-authenticated successfully")
329
329
  except Exception as e:
330
330
  logger.error("Failed to re-authenticate app after reconnect: %s", e)
331
331
  app_auth_restored = False
@@ -344,7 +344,7 @@ class CTraderClient:
344
344
  try:
345
345
  await self._auth.authenticate_account(credentials, reconnect=True)
346
346
  restored.append(account_id)
347
- logger.info("Re-authenticated account %d", account_id)
347
+ logger.debug("Re-authenticated account %d", account_id)
348
348
  except Exception as e:
349
349
  logger.error("Failed to re-authenticate account %d: %s", account_id, e)
350
350
  failed.append((account_id, str(e)))
@@ -56,7 +56,7 @@ class HeartbeatManager:
56
56
  self._task_group = anyio.create_task_group()
57
57
  await self._task_group.__aenter__()
58
58
  self._task_group.start_soon(self._heartbeat_loop)
59
- logger.info("Heartbeat monitor started (interval=%.1fs, timeout=%.1fs)", self._interval, self._timeout)
59
+ logger.debug("Heartbeat monitor started (interval=%.1fs, timeout=%.1fs)", self._interval, self._timeout)
60
60
 
61
61
  async def stop(self) -> None:
62
62
  """Stop heartbeat monitoring.
@@ -67,7 +67,7 @@ class HeartbeatManager:
67
67
  self._task_scope.cancel()
68
68
 
69
69
  if self._task_group is not None:
70
- logger.info("Heartbeat monitor stopped")
70
+ logger.debug("Heartbeat monitor stopped")
71
71
  self._task_group.cancel_scope.cancel()
72
72
  try:
73
73
  await self._task_group.__aexit__(None, None, None)
@@ -87,7 +87,7 @@ class HeartbeatManager:
87
87
  self._last_received = time.monotonic()
88
88
  if self._task_group is not None:
89
89
  self._task_group.start_soon(self._heartbeat_loop)
90
- logger.info("Heartbeat monitor restarted")
90
+ logger.debug("Heartbeat monitor restarted")
91
91
 
92
92
  async def _record_activity(self, _message: betterproto.Message) -> None:
93
93
  """Reset the inactivity timer on any received server message."""
@@ -358,7 +358,7 @@ class Protocol:
358
358
  reraise=True,
359
359
  ):
360
360
  with attempt:
361
- logger.info(
361
+ logger.debug(
362
362
  "Reconnection attempt %d/%d",
363
363
  attempt.retry_state.attempt_number,
364
364
  self._reconnect_attempts,
@@ -83,7 +83,7 @@ class Transport:
83
83
  raise CTraderConnectionFailedError(self._host, self._port, e) from e
84
84
 
85
85
  if self._ssl:
86
- logger.info("Connected to %s:%d with SSL", self._host, self._port)
86
+ logger.debug("Connected to %s:%d with SSL", self._host, self._port)
87
87
  else:
88
88
  logger.warning("Connected to %s:%d without SSL (plaintext)", self._host, self._port)
89
89
 
@@ -136,7 +136,7 @@ class EventRouter:
136
136
  )
137
137
 
138
138
  self._started = True
139
- logger.info("Event router started")
139
+ logger.debug("Event router started")
140
140
 
141
141
  def stop(self) -> None:
142
142
  """Idempotent. Unregister all proto event handlers."""
@@ -172,7 +172,7 @@ class EventRouter:
172
172
  )
173
173
 
174
174
  self._started = False
175
- logger.info("Event router stopped")
175
+ logger.debug("Event router stopped")
176
176
 
177
177
  # -------------------------------------------------------------------------
178
178
  # Proto to Event Converters
@@ -201,7 +201,7 @@ wheels = [
201
201
 
202
202
  [[package]]
203
203
  name = "ctrader-api-client"
204
- version = "0.4.2"
204
+ version = "0.4.3"
205
205
  source = { editable = "." }
206
206
  dependencies = [
207
207
  { name = "anyio" },