eazy-sdk-core 0.2.0a8__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 (216) hide show
  1. eazy_sdk_core-0.2.0a8/.gitignore +79 -0
  2. eazy_sdk_core-0.2.0a8/LICENSE +21 -0
  3. eazy_sdk_core-0.2.0a8/PKG-INFO +244 -0
  4. eazy_sdk_core-0.2.0a8/README.md +169 -0
  5. eazy_sdk_core-0.2.0a8/eazy_sdk/__init__.py +99 -0
  6. eazy_sdk_core-0.2.0a8/eazy_sdk/api.py +1469 -0
  7. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/__init__.py +51 -0
  8. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/cookies.py +94 -0
  9. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/core.py +402 -0
  10. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/lifecycle.py +34 -0
  11. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/session.py +445 -0
  12. eazy_sdk_core-0.2.0a8/eazy_sdk/auth/session_runtime.py +659 -0
  13. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/__init__.py +45 -0
  14. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/_decisions.py +401 -0
  15. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/_shared.py +158 -0
  16. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/async_client.py +104 -0
  17. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/attempts.py +258 -0
  18. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/base.py +27 -0
  19. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/config.py +184 -0
  20. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/executor.py +2624 -0
  21. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/sync_client.py +104 -0
  22. eazy_sdk_core-0.2.0a8/eazy_sdk/clients/zapros_client.py +378 -0
  23. eazy_sdk_core-0.2.0a8/eazy_sdk/codecs/__init__.py +21 -0
  24. eazy_sdk_core-0.2.0a8/eazy_sdk/codecs/core.py +88 -0
  25. eazy_sdk_core-0.2.0a8/eazy_sdk/codegen/__init__.py +160 -0
  26. eazy_sdk_core-0.2.0a8/eazy_sdk/compile/__init__.py +26 -0
  27. eazy_sdk_core-0.2.0a8/eazy_sdk/compile/http_compiler.py +1276 -0
  28. eazy_sdk_core-0.2.0a8/eazy_sdk/compile/http_operation.py +105 -0
  29. eazy_sdk_core-0.2.0a8/eazy_sdk/compile/input.py +541 -0
  30. eazy_sdk_core-0.2.0a8/eazy_sdk/core/__init__.py +137 -0
  31. eazy_sdk_core-0.2.0a8/eazy_sdk/core/errors.py +100 -0
  32. eazy_sdk_core-0.2.0a8/eazy_sdk/core/http.py +17 -0
  33. eazy_sdk_core-0.2.0a8/eazy_sdk/core/http_plan.py +208 -0
  34. eazy_sdk_core-0.2.0a8/eazy_sdk/core/kernel.py +533 -0
  35. eazy_sdk_core-0.2.0a8/eazy_sdk/crypto/__init__.py +139 -0
  36. eazy_sdk_core-0.2.0a8/eazy_sdk/crypto/_compiler.py +404 -0
  37. eazy_sdk_core-0.2.0a8/eazy_sdk/crypto/_http.py +276 -0
  38. eazy_sdk_core-0.2.0a8/eazy_sdk/crypto/_inputs.py +59 -0
  39. eazy_sdk_core-0.2.0a8/eazy_sdk/crypto/core.py +1012 -0
  40. eazy_sdk_core-0.2.0a8/eazy_sdk/dependencies/__init__.py +444 -0
  41. eazy_sdk_core-0.2.0a8/eazy_sdk/driver.py +83 -0
  42. eazy_sdk_core-0.2.0a8/eazy_sdk/exceptions.py +91 -0
  43. eazy_sdk_core-0.2.0a8/eazy_sdk/ext/__init__.py +59 -0
  44. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/__init__.py +70 -0
  45. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/curl_cffi.py +229 -0
  46. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/httpx.py +171 -0
  47. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/profile.py +145 -0
  48. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/requests.py +119 -0
  49. eazy_sdk_core-0.2.0a8/eazy_sdk/handlers/zapros.py +177 -0
  50. eazy_sdk_core-0.2.0a8/eazy_sdk/identity.py +97 -0
  51. eazy_sdk_core-0.2.0a8/eazy_sdk/logging.py +14 -0
  52. eazy_sdk_core-0.2.0a8/eazy_sdk/middleware.py +183 -0
  53. eazy_sdk_core-0.2.0a8/eazy_sdk/models/__init__.py +29 -0
  54. eazy_sdk_core-0.2.0a8/eazy_sdk/models/adapters.py +1070 -0
  55. eazy_sdk_core-0.2.0a8/eazy_sdk/models/documents.py +49 -0
  56. eazy_sdk_core-0.2.0a8/eazy_sdk/operation.py +214 -0
  57. eazy_sdk_core-0.2.0a8/eazy_sdk/pagination.py +366 -0
  58. eazy_sdk_core-0.2.0a8/eazy_sdk/policies.py +100 -0
  59. eazy_sdk_core-0.2.0a8/eazy_sdk/preparation.py +133 -0
  60. eazy_sdk_core-0.2.0a8/eazy_sdk/protection/__init__.py +56 -0
  61. eazy_sdk_core-0.2.0a8/eazy_sdk/protection/advanced.py +1148 -0
  62. eazy_sdk_core-0.2.0a8/eazy_sdk/protection/guard.py +202 -0
  63. eazy_sdk_core-0.2.0a8/eazy_sdk/protocols/__init__.py +40 -0
  64. eazy_sdk_core-0.2.0a8/eazy_sdk/protocols/core.py +98 -0
  65. eazy_sdk_core-0.2.0a8/eazy_sdk/protocols/jsonrpc.py +216 -0
  66. eazy_sdk_core-0.2.0a8/eazy_sdk/protocols/operation.py +105 -0
  67. eazy_sdk_core-0.2.0a8/eazy_sdk/py.typed +0 -0
  68. eazy_sdk_core-0.2.0a8/eazy_sdk/pydantic_integration/__init__.py +0 -0
  69. eazy_sdk_core-0.2.0a8/eazy_sdk/pydantic_integration/errors.py +14 -0
  70. eazy_sdk_core-0.2.0a8/eazy_sdk/pydantic_integration/parsers.py +18 -0
  71. eazy_sdk_core-0.2.0a8/eazy_sdk/ratelimit_runtime.py +28 -0
  72. eazy_sdk_core-0.2.0a8/eazy_sdk/redaction.py +80 -0
  73. eazy_sdk_core-0.2.0a8/eazy_sdk/request/__init__.py +112 -0
  74. eazy_sdk_core-0.2.0a8/eazy_sdk/request/descriptors.py +156 -0
  75. eazy_sdk_core-0.2.0a8/eazy_sdk/request/logical.py +67 -0
  76. eazy_sdk_core-0.2.0a8/eazy_sdk/request/markers.py +37 -0
  77. eazy_sdk_core-0.2.0a8/eazy_sdk/request/params.py +428 -0
  78. eazy_sdk_core-0.2.0a8/eazy_sdk/request/pipeline.py +61 -0
  79. eazy_sdk_core-0.2.0a8/eazy_sdk/request/prepared.py +1117 -0
  80. eazy_sdk_core-0.2.0a8/eazy_sdk/request/short.py +27 -0
  81. eazy_sdk_core-0.2.0a8/eazy_sdk/request/signatures.py +776 -0
  82. eazy_sdk_core-0.2.0a8/eazy_sdk/request/wire.py +236 -0
  83. eazy_sdk_core-0.2.0a8/eazy_sdk/response/__init__.py +62 -0
  84. eazy_sdk_core-0.2.0a8/eazy_sdk/response/_mapping.py +471 -0
  85. eazy_sdk_core-0.2.0a8/eazy_sdk/response/cases.py +965 -0
  86. eazy_sdk_core-0.2.0a8/eazy_sdk/response/headers.py +148 -0
  87. eazy_sdk_core-0.2.0a8/eazy_sdk/response/markers.py +255 -0
  88. eazy_sdk_core-0.2.0a8/eazy_sdk/response/match.py +206 -0
  89. eazy_sdk_core-0.2.0a8/eazy_sdk/response/normalized.py +82 -0
  90. eazy_sdk_core-0.2.0a8/eazy_sdk/response/short.py +16 -0
  91. eazy_sdk_core-0.2.0a8/eazy_sdk/root.py +400 -0
  92. eazy_sdk_core-0.2.0a8/eazy_sdk/sentinels.py +30 -0
  93. eazy_sdk_core-0.2.0a8/eazy_sdk/serialization.py +141 -0
  94. eazy_sdk_core-0.2.0a8/eazy_sdk/testing/__init__.py +152 -0
  95. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/__init__.py +186 -0
  96. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_clearance.py +223 -0
  97. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_connection.py +557 -0
  98. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_crypto.py +185 -0
  99. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_decisions.py +260 -0
  100. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_messages.py +126 -0
  101. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_outbound.py +696 -0
  102. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_reconnect.py +213 -0
  103. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/_state.py +635 -0
  104. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/api.py +364 -0
  105. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/auth.py +94 -0
  106. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/codecs.py +51 -0
  107. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/composition.py +39 -0
  108. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/errors.py +106 -0
  109. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/frames.py +71 -0
  110. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/graphql.py +174 -0
  111. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/middleware.py +192 -0
  112. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/operation.py +212 -0
  113. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/policies.py +116 -0
  114. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/protection.py +352 -0
  115. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/protocols.py +236 -0
  116. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/runtime.py +140 -0
  117. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/schemas.py +146 -0
  118. eazy_sdk_core-0.2.0a8/eazy_sdk/websocket/subscriptions.py +229 -0
  119. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/__init__.py +88 -0
  120. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/http.py +36 -0
  121. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/py.typed +0 -0
  122. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/registration.py +1021 -0
  123. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/__init__.py +123 -0
  124. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/entities.py +304 -0
  125. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/exceptions.py +61 -0
  126. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/memory.py +305 -0
  127. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/observers.py +73 -0
  128. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/repository.py +75 -0
  129. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/__init__.py +23 -0
  130. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/accounts.py +105 -0
  131. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/base.py +44 -0
  132. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/history.py +67 -0
  133. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/links.py +64 -0
  134. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/pool.py +170 -0
  135. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/restrictions.py +97 -0
  136. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/sessions.py +66 -0
  137. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/verifications.py +79 -0
  138. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/services/workspace.py +54 -0
  139. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/session_bridge.py +43 -0
  140. eazy_sdk_core-0.2.0a8/plugins/accounts/eazy_sdk_accounts/storage/storage.py +129 -0
  141. eazy_sdk_core-0.2.0a8/plugins/adaptix/eazy_sdk_adaptix/__init__.py +119 -0
  142. eazy_sdk_core-0.2.0a8/plugins/adaptix/eazy_sdk_adaptix/py.typed +0 -0
  143. eazy_sdk_core-0.2.0a8/plugins/asyncapi/eazy_sdk_asyncapi/__init__.py +23 -0
  144. eazy_sdk_core-0.2.0a8/plugins/asyncapi/eazy_sdk_asyncapi/cli.py +52 -0
  145. eazy_sdk_core-0.2.0a8/plugins/asyncapi/eazy_sdk_asyncapi/generator.py +470 -0
  146. eazy_sdk_core-0.2.0a8/plugins/asyncapi/eazy_sdk_asyncapi/ir.py +664 -0
  147. eazy_sdk_core-0.2.0a8/plugins/asyncapi/eazy_sdk_asyncapi/py.typed +0 -0
  148. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/__init__.py +231 -0
  149. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/api.py +223 -0
  150. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/client.py +258 -0
  151. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/conditions.py +272 -0
  152. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/content.py +143 -0
  153. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/driver.py +105 -0
  154. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/errors.py +29 -0
  155. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/failures.py +103 -0
  156. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/fetch.py +118 -0
  157. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/__init__.py +13 -0
  158. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/_page_fetch.py +78 -0
  159. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/_response_buffer.py +60 -0
  160. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/capture.py +35 -0
  161. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/playwright.py +478 -0
  162. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/handlers/pydoll.py +675 -0
  163. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/integrations/__init__.py +1 -0
  164. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/integrations/accounts.py +273 -0
  165. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/integrations/eazy_sdk.py +73 -0
  166. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/integrations/handler.py +198 -0
  167. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/interceptors.py +73 -0
  168. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/locators.py +443 -0
  169. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/login.py +265 -0
  170. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/navigation.py +135 -0
  171. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/network.py +255 -0
  172. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/operations.py +424 -0
  173. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/outcomes.py +246 -0
  174. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/profile.py +87 -0
  175. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/py.typed +0 -0
  176. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/rich_text.py +93 -0
  177. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/session.py +242 -0
  178. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/spec.py +149 -0
  179. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/state.py +124 -0
  180. eazy_sdk_core-0.2.0a8/plugins/browser/eazy_sdk_browser/testing.py +414 -0
  181. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/__init__.py +33 -0
  182. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/exceptions.py +20 -0
  183. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/extract_plan.py +136 -0
  184. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/forms.py +30 -0
  185. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/html_inspector.py +180 -0
  186. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/html_scanner.py +86 -0
  187. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/py.typed +0 -0
  188. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/schema.py +346 -0
  189. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/urls.py +39 -0
  190. eazy_sdk_core-0.2.0a8/plugins/html/eazy_sdk_html/visible_text.py +103 -0
  191. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/__init__.py +41 -0
  192. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/cli.py +70 -0
  193. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/compatibility.py +220 -0
  194. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/generator.py +1600 -0
  195. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/ir.py +1905 -0
  196. eazy_sdk_core-0.2.0a8/plugins/openapi/eazy_sdk_openapi/py.typed +1 -0
  197. eazy_sdk_core-0.2.0a8/plugins/presets/eazy_sdk_presets/__init__.py +36 -0
  198. eazy_sdk_core-0.2.0a8/plugins/presets/eazy_sdk_presets/cloudflare.py +296 -0
  199. eazy_sdk_core-0.2.0a8/plugins/presets/eazy_sdk_presets/core.py +218 -0
  200. eazy_sdk_core-0.2.0a8/plugins/presets/eazy_sdk_presets/py.typed +1 -0
  201. eazy_sdk_core-0.2.0a8/plugins/presets/eazy_sdk_presets/recaptcha.py +331 -0
  202. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/__init__.py +76 -0
  203. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/adapter.py +343 -0
  204. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/cli.py +77 -0
  205. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/codecs.py +114 -0
  206. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/factory.py +359 -0
  207. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/migration.py +406 -0
  208. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/models.py +181 -0
  209. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/py.typed +0 -0
  210. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/registration.py +648 -0
  211. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/schema.py +48 -0
  212. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/session_store.py +185 -0
  213. eazy_sdk_core-0.2.0a8/plugins/sqlmodel/eazy_sdk_sqlmodel/tables.py +87 -0
  214. eazy_sdk_core-0.2.0a8/plugins/xml/eazy_sdk_xml/__init__.py +162 -0
  215. eazy_sdk_core-0.2.0a8/plugins/xml/eazy_sdk_xml/py.typed +1 -0
  216. eazy_sdk_core-0.2.0a8/pyproject.toml +441 -0
@@ -0,0 +1,79 @@
1
+ # Operating systems and editors
2
+ .DS_Store
3
+ Thumbs.db
4
+ Desktop.ini
5
+ .idea/
6
+ .vscode/
7
+ *.swp
8
+ *.swo
9
+ *~
10
+
11
+ # Python bytecode and tool caches
12
+ __pycache__/
13
+ *.py[cod]
14
+ *$py.class
15
+ .cache/
16
+ .hypothesis/
17
+ .mypy_cache/
18
+ .pytest_cache/
19
+ .ruff_cache/
20
+ .tox/
21
+ .nox/
22
+ .coverage
23
+ .coverage.*
24
+ coverage.xml
25
+ htmlcov/
26
+
27
+ # Virtual environments and local configuration
28
+ .venv/
29
+ venv/
30
+ env/
31
+ .env
32
+ .env.*
33
+ !.env.example
34
+
35
+ # Python build artifacts
36
+ build/
37
+ dist/
38
+ wheels/
39
+ *.egg-info/
40
+ .eggs/
41
+ *.whl
42
+
43
+ # JavaScript and documentation builds
44
+ node_modules/
45
+ .astro/
46
+
47
+ # Eazy SDK-generated and temporary artifacts
48
+ .test-tmp/
49
+ .tmp/
50
+ .uv-cache/
51
+ .phase*-build/
52
+ .phase*-venv*/
53
+ generated-preview/
54
+ mutants/
55
+
56
+ # Local data and logs
57
+ *.db
58
+ *.db-journal
59
+ *.sqlite
60
+ *.sqlite3
61
+ *.log
62
+
63
+ # Local secrets and credentials
64
+ *.key
65
+ *.pem
66
+ *.p12
67
+ *.pfx
68
+
69
+ # Notebook checkpoints
70
+ .ipynb_checkpoints/
71
+ /experiments/
72
+
73
+ # Local AI-assisted development notes and instructions
74
+ *.md
75
+ !plugins/*/README.md
76
+ # ДокумСнтация ΠΏΠ»Π°Π³ΠΈΠ½Π° β€” Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Π°, Π° Π½Π΅ локальная Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°.
77
+ !plugins/*/docs/*.md
78
+ /.claude/
79
+ /docs/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eazy SDK contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,244 @@
1
+ Metadata-Version: 2.5
2
+ Name: eazy-sdk-core
3
+ Version: 0.2.0a8
4
+ Summary: Transport-independent runtime for typed HTTP and async WebSocket SDKs.
5
+ Project-URL: Homepage, https://github.com/0cherednoq/eazy-sdk
6
+ Project-URL: Documentation, https://0cherednoq.github.io/eazy-sdk/
7
+ Project-URL: Repository, https://github.com/0cherednoq/eazy-sdk
8
+ Project-URL: Changelog, https://github.com/0cherednoq/eazy-sdk/blob/master/CHANGELOG.md
9
+ Project-URL: Issues, https://github.com/0cherednoq/eazy-sdk/issues
10
+ Author: Eazy SDK contributors
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: asyncapi,http,openapi,sdk,typed,websocket
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: >=3.13
21
+ Requires-Dist: zapros==0.16.0
22
+ Provides-Extra: accounts
23
+ Provides-Extra: adaptix
24
+ Requires-Dist: adaptix>=3.0.0b12; extra == 'adaptix'
25
+ Provides-Extra: all
26
+ Requires-Dist: aiosqlite>=0.20; extra == 'all'
27
+ Requires-Dist: curl-cffi>=0.7; extra == 'all'
28
+ Requires-Dist: httpx>=0.27; extra == 'all'
29
+ Requires-Dist: msgspec>=0.21.1; extra == 'all'
30
+ Requires-Dist: parsel>=1.11; extra == 'all'
31
+ Requires-Dist: pydantic>=2; extra == 'all'
32
+ Requires-Dist: requests>=2.31; extra == 'all'
33
+ Requires-Dist: sqlalchemy[asyncio]>=2; extra == 'all'
34
+ Requires-Dist: sqlmodel>=0.0.22; extra == 'all'
35
+ Requires-Dist: zapros[websocket]==0.16.0; extra == 'all'
36
+ Provides-Extra: asyncapi
37
+ Provides-Extra: browser
38
+ Provides-Extra: camoufox
39
+ Requires-Dist: camoufox>=0.4; extra == 'camoufox'
40
+ Provides-Extra: curl-cffi
41
+ Requires-Dist: curl-cffi>=0.7; extra == 'curl-cffi'
42
+ Provides-Extra: html
43
+ Requires-Dist: parsel>=1.11; extra == 'html'
44
+ Provides-Extra: httpx
45
+ Requires-Dist: httpx>=0.27; extra == 'httpx'
46
+ Provides-Extra: msgspec
47
+ Requires-Dist: msgspec>=0.21.1; extra == 'msgspec'
48
+ Provides-Extra: openapi
49
+ Requires-Dist: datamodel-code-generator<1,>=0.26; extra == 'openapi'
50
+ Requires-Dist: pydantic[email]>=2; extra == 'openapi'
51
+ Provides-Extra: playwright
52
+ Requires-Dist: playwright>=1.55; extra == 'playwright'
53
+ Provides-Extra: presets
54
+ Provides-Extra: pydantic
55
+ Requires-Dist: pydantic>=2; extra == 'pydantic'
56
+ Provides-Extra: pydoll
57
+ Requires-Dist: pydoll-python<4,>=3; extra == 'pydoll'
58
+ Provides-Extra: requests
59
+ Requires-Dist: requests>=2.31; extra == 'requests'
60
+ Provides-Extra: selectolax
61
+ Requires-Dist: selectolax>=0.3; extra == 'selectolax'
62
+ Provides-Extra: selenium
63
+ Requires-Dist: selenium>=4.25; extra == 'selenium'
64
+ Provides-Extra: sqlmodel
65
+ Requires-Dist: aiosqlite>=0.20; extra == 'sqlmodel'
66
+ Requires-Dist: pydantic>=2; extra == 'sqlmodel'
67
+ Requires-Dist: sqlalchemy[asyncio]>=2; extra == 'sqlmodel'
68
+ Requires-Dist: sqlmodel>=0.0.22; extra == 'sqlmodel'
69
+ Provides-Extra: websocket
70
+ Requires-Dist: zapros[websocket]==0.16.0; extra == 'websocket'
71
+ Provides-Extra: xml
72
+ Provides-Extra: yaml
73
+ Requires-Dist: pyyaml>=6; extra == 'yaml'
74
+ Description-Content-Type: text/markdown
75
+
76
+ # Eazy SDK
77
+
78
+ [![CI](https://github.com/0cherednoq/eazy-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/0cherednoq/eazy-sdk/actions/workflows/ci.yml)
79
+ [![Documentation](https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg)](https://0cherednoq.github.io/eazy-sdk/)
80
+ [![PyPI](https://img.shields.io/pypi/v/eazy-sdk-core.svg?include_prereleases&cacheSeconds=300)](https://pypi.org/project/eazy-sdk-core/)
81
+ [![Python](https://img.shields.io/pypi/pyversions/eazy-sdk-core.svg?cacheSeconds=300)](https://pypi.org/project/eazy-sdk-core/)
82
+
83
+ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Python, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΈΡˆΡƒΡ‚ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ SDK ΠΊ Ρ‡ΡƒΠΆΠΈΠΌ HTTP API, WebSocket ΠΈ сайтам.
84
+ Запрос ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ классом, ΠΎΡ‚Π²Π΅Ρ‚ разбираСтся Π² модСль, Π° Π²Ρ…ΠΎΠ΄, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии, подпись,
85
+ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹ ΠΈ пагинация ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ рядом с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π°.
86
+
87
+ > Бтатус: alpha, вСрсия `0.2.0a8`. ΠΠ»ΡŒΡ„Π°-вСрсии ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π±Π΅Π· ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ…
88
+ > псСвдонимов, список Π·Π°ΠΌΠ΅Π½ Π²Π΅Π΄Ρ‘Ρ‚ страница
89
+ > [Β«ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡΒ»](https://0cherednoq.github.io/eazy-sdk/reference/migration/). ДокумСнтация собираСтся Π²
90
+ > сайт ΠΈΠ· [docs-site/](https://github.com/0cherednoq/eazy-sdk/tree/master/docs-site) ΠΈ публикуСтся Π½Π°
91
+ > [GitHub Pages](https://0cherednoq.github.io/eazy-sdk/).
92
+
93
+ ## Π§Ρ‚ΠΎ это Π΄Π°Ρ‘Ρ‚
94
+
95
+ * ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ описана ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·: поля класса Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΡƒΡ‚ΡŒ, query, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Π΅Π»ΠΎ, Π° Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
96
+ Π²ΠΈΠ΄Π΅Π½ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ ΠΈ Ρ‚Π°ΠΉΠΏΡ‡Π΅ΠΊΠ΅Ρ€Ρƒ.
97
+ * Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· HTTPX, Requests, curl_cffi ΠΈΠ»ΠΈ свой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. ΠŸΠ°ΠΊΠ΅Ρ‚ Π±Π΅Π·
98
+ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π½Π΅ ставит Π½ΠΈ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
99
+ * ΠžΡ‚Π²Π΅Ρ‚Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π² Pydantic, msgspec, dataclass ΠΈΠ»ΠΈ Adaptix. Ошибка API Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° с
100
+ ΠΊΠΎΠ΄ΠΎΠΌ 200 становится Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ.
101
+ * Π’Ρ…ΠΎΠ΄, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии ΠΏΠΎ сроку ΠΈ ΠΏΠΎ ΠΎΡ‚ΠΊΠ°Π·Ρƒ, подпись HMAC, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π΅Π»Π°, ΠΊΠ°ΠΏΡ‡Π° ΠΈ
102
+ пагинация ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΈ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅.
103
+ * Π’ΠΎΡ‚ ΠΆΠ΅ SDK ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€: ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ страницы Π½Π° Playwright ΠΈΠ»ΠΈ Pydoll ΠΈ сСссия
104
+ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Ρƒ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.
105
+ * Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ SDK ΠΈΠ· OpenAPI 3.0-3.2 ΠΈ AsyncAPI 3.0.
106
+
107
+ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ: SDK ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΡ… Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ.
108
+
109
+ ## Установка
110
+
111
+ НуТСн Python 3.13 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅.
112
+
113
+ ```bash
114
+ pip install --pre "eazy-sdk-core[httpx,pydantic]"
115
+ ```
116
+
117
+ На PyPI ΠΏΠ°ΠΊΠ΅Ρ‚ называСтся `eazy-sdk-core`, Π° импортируСтся ΠΊΠ°ΠΊ `eazy_sdk`. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ `eazysdk` Π½Π° PyPI
118
+ ΠΊ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚. Π€Π»Π°Π³ `--pre` Π½ΡƒΠΆΠ΅Π½, ΠΏΠΎΠΊΠ° выходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Π»ΡŒΡ„Π°-вСрсии. Π’Π΅ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Ρ‹ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ
119
+ [Ρ€Π΅Π»ΠΈΠ·Ρƒ GitHub](https://github.com/0cherednoq/eazy-sdk/releases).
120
+
121
+ Всё поставляСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ. ДополнСния ставят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΏΠΎ
122
+ Π·Π°Π΄Π°Ρ‡Π΅: `httpx`, `requests`, `curl-cffi`, `websocket`, `pydantic`, `msgspec`, `adaptix`, `html`,
123
+ `xml`, `openapi`, `asyncapi`, `accounts`, `sqlmodel`, `browser`, `playwright`, `pydoll`,
124
+ `presets`. Полная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π΅ΡΡ‚ΡŒ Π½Π° страницС
125
+ [«Установка»](https://0cherednoq.github.io/eazy-sdk/start/installation/).
126
+
127
+ ## Быстрый старт
128
+
129
+ Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ письмо с ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ сайта `mail.example`. Π‘Π°ΠΉΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅
130
+ процСссС, поэтому для знакомства Ρ…Π²Π°Ρ‚ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ сСти Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.
131
+
132
+ ```python
133
+ # quickstart.py
134
+ from dataclasses import dataclass
135
+
136
+ import httpx
137
+ from pydantic import BaseModel
138
+
139
+ from eazy_sdk import Client, Http, HttpOperation, Path, SyncApi, op
140
+ from eazy_sdk.handlers.httpx import HttpxHandler
141
+
142
+
143
+ class Message(BaseModel):
144
+ id: int
145
+ sender: str
146
+ subject: str
147
+
148
+
149
+ @dataclass(frozen=True, slots=True, kw_only=True)
150
+ class GetMessage(HttpOperation[Message]):
151
+ __http__ = Http.get("/messages/{message_id}") # ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΏΡƒΡ‚ΡŒ
152
+
153
+ message_id: Path[int] # ΠΏΠΎΠ»Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΡƒΡ‚ΡŒ
154
+
155
+
156
+ class MailApi(SyncApi):
157
+ message = op(GetMessage) # опСрация становится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π°
158
+
159
+
160
+ def mail_site(request: httpx.Request) -> httpx.Response:
161
+ # ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ сайт Π² этом ΠΆΠ΅ процСссС; Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ запрос ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠ΅Ρ‚ΡŒ
162
+ return httpx.Response(
163
+ 200,
164
+ json={"id": 42, "sender": "ada@mail.example", "subject": "ΠŸΠ»Π°Π½Ρ‹ Π½Π° пятницу"},
165
+ )
166
+
167
+
168
+ raw = httpx.Client(transport=httpx.MockTransport(mail_site))
169
+
170
+ with Client(
171
+ base_url="https://mail.example",
172
+ handler=HttpxHandler(raw, owns_client=True),
173
+ ) as client:
174
+ message = MailApi(client).message(message_id=42)
175
+ response = MailApi(client).message.with_response(message_id=42)
176
+
177
+ print(f"{message.sender}: {message.subject}")
178
+ print(response.status_code)
179
+
180
+ # ada@mail.example: ΠŸΠ»Π°Π½Ρ‹ Π½Π° пятницу
181
+ # 200
182
+ ```
183
+
184
+ Π§Ρ‚ΠΎ здСсь ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ:
185
+
186
+ 1. `GetMessage` описал запрос ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. `__http__` Π·Π°Π΄Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΏΡƒΡ‚ΡŒ, ΠΏΠΎΠ»Π΅ `message_id`
187
+ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΠ»ΠΎΡΡŒ Π² ΠΏΡƒΡ‚ΡŒ, Π° `HttpOperation[Message]` Π½Π°Π·Π²Π°Π» Ρ‚ΠΈΠΏ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°.
188
+ 2. `op(GetMessage)` ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅. Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° `message` совпадаСт с
189
+ конструктором класса, поэтому Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ подсказываСт `message_id`.
190
+ 3. ΠšΠ»ΠΈΠ΅Π½Ρ‚ доставил Π±Π°ΠΉΡ‚Ρ‹ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π» JSON Π² `Message`. Π ΠΎΡƒΡ‚Π΅Ρ€ ΠΎ транспортС Π½Π΅ Π·Π½Π°Π΅Ρ‚: Π²
191
+ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ вмСсто Π΄Π²ΡƒΡ… строк с `raw` достаточно `Client.httpx(base_url=...)`.
192
+ 4. `.with_response()` Π²Π΅Ρ€Π½ΡƒΠ» Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вмСстС со статусом ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
193
+
194
+ ## Π”Π°Π»ΡŒΡˆΠ΅
195
+
196
+ | Π—Π°Π΄Π°Ρ‡Π° | Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° |
197
+ |---|---|
198
+ | Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ролях: опСрация, Ρ€ΠΎΡƒΡ‚Π΅Ρ€, ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ€Π΅Π½ΡŒ, `Identity` | [ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ понятия](https://0cherednoq.github.io/eazy-sdk/start/concepts/) |
199
+ | ΠŸΡ€ΠΎΠΉΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½ SDK ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΎΡ‚ Π²Ρ…ΠΎΠ΄Π° Π΄ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ письма, ΠΏΠΎ HTTP ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ | [Π Π°Π·Π±ΠΎΡ€ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅](https://0cherednoq.github.io/eazy-sdk/tutorial/) |
200
+ | ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Π΅Π»ΠΎ запроса | [Запросы](https://0cherednoq.github.io/eazy-sdk/guide/requests/) |
201
+ | Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ API | [ΠžΡ‚Π²Π΅Ρ‚Ρ‹](https://0cherednoq.github.io/eazy-sdk/guide/responses/) |
202
+ | Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡, Ρ‚ΠΎΠΊΠ΅Π½, cookie, Π²Ρ…ΠΎΠ΄ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии | [Авторизация](https://0cherednoq.github.io/eazy-sdk/guide/auth/) |
203
+ | ΠžΠ±ΠΎΠΉΡ‚ΠΈ список страницами, ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ запрос | [ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ](https://0cherednoq.github.io/eazy-sdk/guide/pagination/), [подпись](https://0cherednoq.github.io/eazy-sdk/guide/signing/), [ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://0cherednoq.github.io/eazy-sdk/guide/encryption/) |
204
+ | Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ | [Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ](https://0cherednoq.github.io/eazy-sdk/integrations/) |
205
+ | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ SDK Π±Π΅Π· сСти | [ВСстированиС SDK](https://0cherednoq.github.io/eazy-sdk/guide/testing/) |
206
+ | ΠŸΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ устроСн ΠΏΡƒΡ‚ΡŒ запроса Π²Π½ΡƒΡ‚Ρ€ΠΈ | [АрхитСктура](https://0cherednoq.github.io/eazy-sdk/architecture/) |
207
+ | Найти Ρ‚ΠΎΡ‡Π½ΡƒΡŽ сигнатуру | [Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API](https://0cherednoq.github.io/eazy-sdk/reference/api/) |
208
+
209
+ ЗапускаСмыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎ всСм страницам Π»Π΅ΠΆΠ°Ρ‚ Π² [examples/](https://github.com/0cherednoq/eazy-sdk/blob/master/examples/README.md).
210
+
211
+ ## Для ИИ-ассистСнтов
212
+
213
+ Π‘Π°ΠΉΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ Π΄Π²Π° тСкстовых Ρ„Π°ΠΉΠ»Π°, собранных ΠΈΠ· Ρ‚Π΅Ρ… ΠΆΠ΅ страниц:
214
+
215
+ * [llms.txt](https://0cherednoq.github.io/eazy-sdk/llms.txt) содСрТит ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
216
+ ΠΈ ссылки Π½Π° страницы. Он ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ссылки: Π² контСкст
217
+ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ страницы.
218
+ * [llms-full.txt](https://0cherednoq.github.io/eazy-sdk/llms-full.txt) содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ тСкст
219
+ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ. Он ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для локального поиска ΠΈ для инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ
220
+ ссылкам Π½Π΅ Ρ…ΠΎΠ΄ΠΈΡ‚.
221
+
222
+ Оба Ρ„Π°ΠΉΠ»Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ сайта, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ копию Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅
223
+ Π½ΡƒΠΆΠ½ΠΎ.
224
+
225
+ ## Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
226
+
227
+ НуТСн [uv](https://docs.astral.sh/uv/). Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹ΠΌ тСстам Π½ΡƒΠΆΠ΅Π½ Chromium.
228
+
229
+ ```bash
230
+ uv sync --all-extras # ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ всС инструмСнты
231
+ uv run playwright install chromium # Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ для тСстов ΠΏΠ»Π°Π³ΠΈΠ½Π°
232
+ uv run pytest -q # тСсты
233
+ uv run mypy # Ρ‚ΠΈΠΏΡ‹
234
+ uv run ruff check # Π»ΠΈΠ½Ρ‚Π΅Ρ€
235
+ uv run python scripts/docs_freshness.py check # страницы Π½Π΅ отстали ΠΎΡ‚ ΠΊΠΎΠ΄Π°
236
+ ```
237
+
238
+ ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚Ρ‹ описан Π² [CONTRIBUTING.md](https://github.com/0cherednoq/eazy-sdk/blob/master/CONTRIBUTING.md), ΠΎΠ± уязвимостях ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΏΠΎ
239
+ [SECURITY.md](https://github.com/0cherednoq/eazy-sdk/blob/master/SECURITY.md). План Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π»Π΅ΠΆΠΈΡ‚ Π²
240
+ [docs/implementation/](https://github.com/0cherednoq/eazy-sdk/blob/master/docs/implementation/README.md).
241
+
242
+ ## ЛицСнзия
243
+
244
+ [MIT](https://github.com/0cherednoq/eazy-sdk/blob/master/LICENSE)
@@ -0,0 +1,169 @@
1
+ # Eazy SDK
2
+
3
+ [![CI](https://github.com/0cherednoq/eazy-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/0cherednoq/eazy-sdk/actions/workflows/ci.yml)
4
+ [![Documentation](https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg)](https://0cherednoq.github.io/eazy-sdk/)
5
+ [![PyPI](https://img.shields.io/pypi/v/eazy-sdk-core.svg?include_prereleases&cacheSeconds=300)](https://pypi.org/project/eazy-sdk-core/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/eazy-sdk-core.svg?cacheSeconds=300)](https://pypi.org/project/eazy-sdk-core/)
7
+
8
+ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Python, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΈΡˆΡƒΡ‚ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ SDK ΠΊ Ρ‡ΡƒΠΆΠΈΠΌ HTTP API, WebSocket ΠΈ сайтам.
9
+ Запрос ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ классом, ΠΎΡ‚Π²Π΅Ρ‚ разбираСтся Π² модСль, Π° Π²Ρ…ΠΎΠ΄, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии, подпись,
10
+ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹ ΠΈ пагинация ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ рядом с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π°.
11
+
12
+ > Бтатус: alpha, вСрсия `0.2.0a8`. ΠΠ»ΡŒΡ„Π°-вСрсии ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π±Π΅Π· ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ…
13
+ > псСвдонимов, список Π·Π°ΠΌΠ΅Π½ Π²Π΅Π΄Ρ‘Ρ‚ страница
14
+ > [Β«ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡΒ»](https://0cherednoq.github.io/eazy-sdk/reference/migration/). ДокумСнтация собираСтся Π²
15
+ > сайт ΠΈΠ· [docs-site/](https://github.com/0cherednoq/eazy-sdk/tree/master/docs-site) ΠΈ публикуСтся Π½Π°
16
+ > [GitHub Pages](https://0cherednoq.github.io/eazy-sdk/).
17
+
18
+ ## Π§Ρ‚ΠΎ это Π΄Π°Ρ‘Ρ‚
19
+
20
+ * ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ описана ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·: поля класса Π·Π°Π΄Π°ΡŽΡ‚ ΠΏΡƒΡ‚ΡŒ, query, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Π΅Π»ΠΎ, Π° Ρ‚ΠΈΠΏ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
21
+ Π²ΠΈΠ΄Π΅Π½ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ ΠΈ Ρ‚Π°ΠΉΠΏΡ‡Π΅ΠΊΠ΅Ρ€Ρƒ.
22
+ * Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· HTTPX, Requests, curl_cffi ΠΈΠ»ΠΈ свой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. ΠŸΠ°ΠΊΠ΅Ρ‚ Π±Π΅Π·
23
+ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ Π½Π΅ ставит Π½ΠΈ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
24
+ * ΠžΡ‚Π²Π΅Ρ‚Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π² Pydantic, msgspec, dataclass ΠΈΠ»ΠΈ Adaptix. Ошибка API Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° с
25
+ ΠΊΠΎΠ΄ΠΎΠΌ 200 становится Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ.
26
+ * Π’Ρ…ΠΎΠ΄, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии ΠΏΠΎ сроку ΠΈ ΠΏΠΎ ΠΎΡ‚ΠΊΠ°Π·Ρƒ, подпись HMAC, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π΅Π»Π°, ΠΊΠ°ΠΏΡ‡Π° ΠΈ
27
+ пагинация ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΈ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅.
28
+ * Π’ΠΎΡ‚ ΠΆΠ΅ SDK ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€: ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ страницы Π½Π° Playwright ΠΈΠ»ΠΈ Pydoll ΠΈ сСссия
29
+ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Ρƒ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.
30
+ * Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ SDK ΠΈΠ· OpenAPI 3.0-3.2 ΠΈ AsyncAPI 3.0.
31
+
32
+ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ: SDK ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΡ… Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ.
33
+
34
+ ## Установка
35
+
36
+ НуТСн Python 3.13 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅.
37
+
38
+ ```bash
39
+ pip install --pre "eazy-sdk-core[httpx,pydantic]"
40
+ ```
41
+
42
+ На PyPI ΠΏΠ°ΠΊΠ΅Ρ‚ называСтся `eazy-sdk-core`, Π° импортируСтся ΠΊΠ°ΠΊ `eazy_sdk`. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ `eazysdk` Π½Π° PyPI
43
+ ΠΊ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚. Π€Π»Π°Π³ `--pre` Π½ΡƒΠΆΠ΅Π½, ΠΏΠΎΠΊΠ° выходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Π»ΡŒΡ„Π°-вСрсии. Π’Π΅ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Ρ‹ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ
44
+ [Ρ€Π΅Π»ΠΈΠ·Ρƒ GitHub](https://github.com/0cherednoq/eazy-sdk/releases).
45
+
46
+ Всё поставляСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ. ДополнСния ставят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ ΠΏΠΎ
47
+ Π·Π°Π΄Π°Ρ‡Π΅: `httpx`, `requests`, `curl-cffi`, `websocket`, `pydantic`, `msgspec`, `adaptix`, `html`,
48
+ `xml`, `openapi`, `asyncapi`, `accounts`, `sqlmodel`, `browser`, `playwright`, `pydoll`,
49
+ `presets`. Полная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π΅ΡΡ‚ΡŒ Π½Π° страницС
50
+ [«Установка»](https://0cherednoq.github.io/eazy-sdk/start/installation/).
51
+
52
+ ## Быстрый старт
53
+
54
+ Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ письмо с ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ сайта `mail.example`. Π‘Π°ΠΉΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅
55
+ процСссС, поэтому для знакомства Ρ…Π²Π°Ρ‚ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ сСти Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.
56
+
57
+ ```python
58
+ # quickstart.py
59
+ from dataclasses import dataclass
60
+
61
+ import httpx
62
+ from pydantic import BaseModel
63
+
64
+ from eazy_sdk import Client, Http, HttpOperation, Path, SyncApi, op
65
+ from eazy_sdk.handlers.httpx import HttpxHandler
66
+
67
+
68
+ class Message(BaseModel):
69
+ id: int
70
+ sender: str
71
+ subject: str
72
+
73
+
74
+ @dataclass(frozen=True, slots=True, kw_only=True)
75
+ class GetMessage(HttpOperation[Message]):
76
+ __http__ = Http.get("/messages/{message_id}") # ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΏΡƒΡ‚ΡŒ
77
+
78
+ message_id: Path[int] # ΠΏΠΎΠ»Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΡƒΡ‚ΡŒ
79
+
80
+
81
+ class MailApi(SyncApi):
82
+ message = op(GetMessage) # опСрация становится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π°
83
+
84
+
85
+ def mail_site(request: httpx.Request) -> httpx.Response:
86
+ # ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ сайт Π² этом ΠΆΠ΅ процСссС; Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ запрос ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠ΅Ρ‚ΡŒ
87
+ return httpx.Response(
88
+ 200,
89
+ json={"id": 42, "sender": "ada@mail.example", "subject": "ΠŸΠ»Π°Π½Ρ‹ Π½Π° пятницу"},
90
+ )
91
+
92
+
93
+ raw = httpx.Client(transport=httpx.MockTransport(mail_site))
94
+
95
+ with Client(
96
+ base_url="https://mail.example",
97
+ handler=HttpxHandler(raw, owns_client=True),
98
+ ) as client:
99
+ message = MailApi(client).message(message_id=42)
100
+ response = MailApi(client).message.with_response(message_id=42)
101
+
102
+ print(f"{message.sender}: {message.subject}")
103
+ print(response.status_code)
104
+
105
+ # ada@mail.example: ΠŸΠ»Π°Π½Ρ‹ Π½Π° пятницу
106
+ # 200
107
+ ```
108
+
109
+ Π§Ρ‚ΠΎ здСсь ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ:
110
+
111
+ 1. `GetMessage` описал запрос ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. `__http__` Π·Π°Π΄Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΏΡƒΡ‚ΡŒ, ΠΏΠΎΠ»Π΅ `message_id`
112
+ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΠ»ΠΎΡΡŒ Π² ΠΏΡƒΡ‚ΡŒ, Π° `HttpOperation[Message]` Π½Π°Π·Π²Π°Π» Ρ‚ΠΈΠΏ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°.
113
+ 2. `op(GetMessage)` ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅. Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° `message` совпадаСт с
114
+ конструктором класса, поэтому Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ подсказываСт `message_id`.
115
+ 3. ΠšΠ»ΠΈΠ΅Π½Ρ‚ доставил Π±Π°ΠΉΡ‚Ρ‹ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π» JSON Π² `Message`. Π ΠΎΡƒΡ‚Π΅Ρ€ ΠΎ транспортС Π½Π΅ Π·Π½Π°Π΅Ρ‚: Π²
116
+ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ вмСсто Π΄Π²ΡƒΡ… строк с `raw` достаточно `Client.httpx(base_url=...)`.
117
+ 4. `.with_response()` Π²Π΅Ρ€Π½ΡƒΠ» Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вмСстС со статусом ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
118
+
119
+ ## Π”Π°Π»ΡŒΡˆΠ΅
120
+
121
+ | Π—Π°Π΄Π°Ρ‡Π° | Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° |
122
+ |---|---|
123
+ | Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ролях: опСрация, Ρ€ΠΎΡƒΡ‚Π΅Ρ€, ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ€Π΅Π½ΡŒ, `Identity` | [ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ понятия](https://0cherednoq.github.io/eazy-sdk/start/concepts/) |
124
+ | ΠŸΡ€ΠΎΠΉΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½ SDK ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΎΡ‚ Π²Ρ…ΠΎΠ΄Π° Π΄ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ письма, ΠΏΠΎ HTTP ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ | [Π Π°Π·Π±ΠΎΡ€ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅](https://0cherednoq.github.io/eazy-sdk/tutorial/) |
125
+ | ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Π΅Π»ΠΎ запроса | [Запросы](https://0cherednoq.github.io/eazy-sdk/guide/requests/) |
126
+ | Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ API | [ΠžΡ‚Π²Π΅Ρ‚Ρ‹](https://0cherednoq.github.io/eazy-sdk/guide/responses/) |
127
+ | Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡, Ρ‚ΠΎΠΊΠ΅Π½, cookie, Π²Ρ…ΠΎΠ΄ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сСссии | [Авторизация](https://0cherednoq.github.io/eazy-sdk/guide/auth/) |
128
+ | ΠžΠ±ΠΎΠΉΡ‚ΠΈ список страницами, ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ запрос | [ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ](https://0cherednoq.github.io/eazy-sdk/guide/pagination/), [подпись](https://0cherednoq.github.io/eazy-sdk/guide/signing/), [ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://0cherednoq.github.io/eazy-sdk/guide/encryption/) |
129
+ | Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ HTTP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ | [Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ](https://0cherednoq.github.io/eazy-sdk/integrations/) |
130
+ | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ SDK Π±Π΅Π· сСти | [ВСстированиС SDK](https://0cherednoq.github.io/eazy-sdk/guide/testing/) |
131
+ | ΠŸΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ устроСн ΠΏΡƒΡ‚ΡŒ запроса Π²Π½ΡƒΡ‚Ρ€ΠΈ | [АрхитСктура](https://0cherednoq.github.io/eazy-sdk/architecture/) |
132
+ | Найти Ρ‚ΠΎΡ‡Π½ΡƒΡŽ сигнатуру | [Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API](https://0cherednoq.github.io/eazy-sdk/reference/api/) |
133
+
134
+ ЗапускаСмыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎ всСм страницам Π»Π΅ΠΆΠ°Ρ‚ Π² [examples/](https://github.com/0cherednoq/eazy-sdk/blob/master/examples/README.md).
135
+
136
+ ## Для ИИ-ассистСнтов
137
+
138
+ Π‘Π°ΠΉΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ Π΄Π²Π° тСкстовых Ρ„Π°ΠΉΠ»Π°, собранных ΠΈΠ· Ρ‚Π΅Ρ… ΠΆΠ΅ страниц:
139
+
140
+ * [llms.txt](https://0cherednoq.github.io/eazy-sdk/llms.txt) содСрТит ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
141
+ ΠΈ ссылки Π½Π° страницы. Он ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ссылки: Π² контСкст
142
+ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ страницы.
143
+ * [llms-full.txt](https://0cherednoq.github.io/eazy-sdk/llms-full.txt) содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ тСкст
144
+ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ. Он ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для локального поиска ΠΈ для инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ
145
+ ссылкам Π½Π΅ Ρ…ΠΎΠ΄ΠΈΡ‚.
146
+
147
+ Оба Ρ„Π°ΠΉΠ»Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ сайта, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ копию Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅
148
+ Π½ΡƒΠΆΠ½ΠΎ.
149
+
150
+ ## Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
151
+
152
+ НуТСн [uv](https://docs.astral.sh/uv/). Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹ΠΌ тСстам Π½ΡƒΠΆΠ΅Π½ Chromium.
153
+
154
+ ```bash
155
+ uv sync --all-extras # ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ всС инструмСнты
156
+ uv run playwright install chromium # Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ для тСстов ΠΏΠ»Π°Π³ΠΈΠ½Π°
157
+ uv run pytest -q # тСсты
158
+ uv run mypy # Ρ‚ΠΈΠΏΡ‹
159
+ uv run ruff check # Π»ΠΈΠ½Ρ‚Π΅Ρ€
160
+ uv run python scripts/docs_freshness.py check # страницы Π½Π΅ отстали ΠΎΡ‚ ΠΊΠΎΠ΄Π°
161
+ ```
162
+
163
+ ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚Ρ‹ описан Π² [CONTRIBUTING.md](https://github.com/0cherednoq/eazy-sdk/blob/master/CONTRIBUTING.md), ΠΎΠ± уязвимостях ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΏΠΎ
164
+ [SECURITY.md](https://github.com/0cherednoq/eazy-sdk/blob/master/SECURITY.md). План Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π»Π΅ΠΆΠΈΡ‚ Π²
165
+ [docs/implementation/](https://github.com/0cherednoq/eazy-sdk/blob/master/docs/implementation/README.md).
166
+
167
+ ## ЛицСнзия
168
+
169
+ [MIT](https://github.com/0cherednoq/eazy-sdk/blob/master/LICENSE)
@@ -0,0 +1,99 @@
1
+ """Eazy SDK: declare an API, compose it into an SDK, hand it a client.
2
+
3
+ What lives here is what an SDK author needs in the first hour: the declaration surface, the
4
+ composition surface, the request markers and the response contract. Everything else stays
5
+ importable from the module that owns it β€” ``eazy_sdk.models``, ``eazy_sdk.codecs``,
6
+ ``eazy_sdk.crypto``, ``eazy_sdk.protection.advanced``, ``eazy_sdk.core.errors`` β€” because a
7
+ second name in the root is duplication, not convenience.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ from eazy_sdk.api import AsyncApi, SyncApi, api, api_group, op
15
+ from eazy_sdk.clients import ClientConfig, Hooks, Resilience, RetryPolicy, Security
16
+ from eazy_sdk.dependencies import Inject
17
+ from eazy_sdk.handlers import HandlerProfile, TransportError
18
+ from eazy_sdk.identity import Identity
19
+ from eazy_sdk.operation import Http, HttpOperation
20
+ from eazy_sdk.preparation import PreparedCall, PrepareOptions
21
+ from eazy_sdk.request import (
22
+ Body,
23
+ BodyProjection,
24
+ Cookie,
25
+ FormBody,
26
+ Header,
27
+ JsonBody,
28
+ JsonField,
29
+ Path,
30
+ Query,
31
+ )
32
+ from eazy_sdk.response import (
33
+ Html,
34
+ Json,
35
+ ResponseEnvelope,
36
+ UnexpectedResponseError,
37
+ )
38
+ from eazy_sdk.root import AsyncRoot, Binding, SyncRoot, bind
39
+ from eazy_sdk.sentinels import UNSET, Omittable
40
+ from eazy_sdk.serialization import Serialization
41
+
42
+ __version__ = "0.2.0a8"
43
+
44
+ if TYPE_CHECKING:
45
+ from eazy_sdk.clients import AsyncClient, Client
46
+
47
+
48
+ def __getattr__(name: str) -> Any:
49
+ if name not in {"AsyncClient", "Client"}:
50
+ raise AttributeError(name)
51
+ from eazy_sdk.clients import AsyncClient, Client
52
+
53
+ value = AsyncClient if name == "AsyncClient" else Client
54
+ globals()[name] = value
55
+ return value
56
+
57
+
58
+ __all__ = [
59
+ "UNSET",
60
+ "AsyncApi",
61
+ "AsyncClient",
62
+ "AsyncRoot",
63
+ "Binding",
64
+ "Body",
65
+ "BodyProjection",
66
+ "Client",
67
+ "ClientConfig",
68
+ "Cookie",
69
+ "FormBody",
70
+ "HandlerProfile",
71
+ "Header",
72
+ "Hooks",
73
+ "Html",
74
+ "Http",
75
+ "HttpOperation",
76
+ "Identity",
77
+ "Inject",
78
+ "Json",
79
+ "JsonBody",
80
+ "JsonField",
81
+ "Omittable",
82
+ "Path",
83
+ "PrepareOptions",
84
+ "PreparedCall",
85
+ "Query",
86
+ "Resilience",
87
+ "ResponseEnvelope",
88
+ "RetryPolicy",
89
+ "Security",
90
+ "Serialization",
91
+ "SyncApi",
92
+ "SyncRoot",
93
+ "TransportError",
94
+ "UnexpectedResponseError",
95
+ "api",
96
+ "api_group",
97
+ "bind",
98
+ "op",
99
+ ]