funora 0.0.1.dev2__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 (391) hide show
  1. funora-0.0.1.dev2/.gitattributes +3 -0
  2. funora-0.0.1.dev2/.github/dependabot.yml +13 -0
  3. funora-0.0.1.dev2/.github/workflows/ci.yml +204 -0
  4. funora-0.0.1.dev2/.github/workflows/release.yml +75 -0
  5. funora-0.0.1.dev2/.gitignore +189 -0
  6. funora-0.0.1.dev2/DISCLAIMER.md +157 -0
  7. funora-0.0.1.dev2/LICENSE +201 -0
  8. funora-0.0.1.dev2/PKG-INFO +294 -0
  9. funora-0.0.1.dev2/README.en.md +245 -0
  10. funora-0.0.1.dev2/README.md +262 -0
  11. funora-0.0.1.dev2/docs/architecture.md +893 -0
  12. funora-0.0.1.dev2/docs/completeness.md +148 -0
  13. funora-0.0.1.dev2/docs/guide/account.md +245 -0
  14. funora-0.0.1.dev2/docs/guide/async.md +85 -0
  15. funora-0.0.1.dev2/docs/guide/bot.md +488 -0
  16. funora-0.0.1.dev2/docs/guide/budget.md +166 -0
  17. funora-0.0.1.dev2/docs/guide/catalog.md +70 -0
  18. funora-0.0.1.dev2/docs/guide/chats.md +264 -0
  19. funora-0.0.1.dev2/docs/guide/errors.md +97 -0
  20. funora-0.0.1.dev2/docs/guide/events.md +203 -0
  21. funora-0.0.1.dev2/docs/guide/first-run.md +110 -0
  22. funora-0.0.1.dev2/docs/guide/install.md +92 -0
  23. funora-0.0.1.dev2/docs/guide/lots.md +549 -0
  24. funora-0.0.1.dev2/docs/guide/market.md +394 -0
  25. funora-0.0.1.dev2/docs/guide/observed.md +118 -0
  26. funora-0.0.1.dev2/docs/guide/orders.md +325 -0
  27. funora-0.0.1.dev2/docs/guide/pages.md +111 -0
  28. funora-0.0.1.dev2/docs/guide/secret.md +121 -0
  29. funora-0.0.1.dev2/docs/guide/sending.md +197 -0
  30. funora-0.0.1.dev2/docs/index.md +77 -0
  31. funora-0.0.1.dev2/docs/limits.md +342 -0
  32. funora-0.0.1.dev2/docs/observation-plan.md +575 -0
  33. funora-0.0.1.dev2/docs/observations.md +561 -0
  34. funora-0.0.1.dev2/docs/observing.md +259 -0
  35. funora-0.0.1.dev2/docs/pre-alpha.md +80 -0
  36. funora-0.0.1.dev2/docs/protocol-questions.md +203 -0
  37. funora-0.0.1.dev2/docs/validation.md +723 -0
  38. funora-0.0.1.dev2/mkdocs.yml +121 -0
  39. funora-0.0.1.dev2/pyproject.toml +86 -0
  40. funora-0.0.1.dev2/src/funora/__init__.py +265 -0
  41. funora-0.0.1.dev2/src/funora/_account.py +661 -0
  42. funora-0.0.1.dev2/src/funora/_aclient.py +1484 -0
  43. funora-0.0.1.dev2/src/funora/_budget.py +579 -0
  44. funora-0.0.1.dev2/src/funora/_calc.py +182 -0
  45. funora-0.0.1.dev2/src/funora/_canonical.py +235 -0
  46. funora-0.0.1.dev2/src/funora/_catalog.py +473 -0
  47. funora-0.0.1.dev2/src/funora/_chat_history.py +367 -0
  48. funora-0.0.1.dev2/src/funora/_chats.py +392 -0
  49. funora-0.0.1.dev2/src/funora/_chips.py +403 -0
  50. funora-0.0.1.dev2/src/funora/_classify.py +466 -0
  51. funora-0.0.1.dev2/src/funora/_client.py +1490 -0
  52. funora-0.0.1.dev2/src/funora/_currency_switch.py +130 -0
  53. funora-0.0.1.dev2/src/funora/_cursor.py +120 -0
  54. funora-0.0.1.dev2/src/funora/_delivered.py +233 -0
  55. funora-0.0.1.dev2/src/funora/_diff.py +752 -0
  56. funora-0.0.1.dev2/src/funora/_engine.py +4795 -0
  57. funora-0.0.1.dev2/src/funora/_extract.py +124 -0
  58. funora-0.0.1.dev2/src/funora/_field_schema.py +112 -0
  59. funora-0.0.1.dev2/src/funora/_fileio.py +58 -0
  60. funora-0.0.1.dev2/src/funora/_gate.py +69 -0
  61. funora-0.0.1.dev2/src/funora/_hops.py +101 -0
  62. funora-0.0.1.dev2/src/funora/_host.py +120 -0
  63. funora-0.0.1.dev2/src/funora/_identity.py +284 -0
  64. funora-0.0.1.dev2/src/funora/_json.py +31 -0
  65. funora-0.0.1.dev2/src/funora/_listen.py +312 -0
  66. funora-0.0.1.dev2/src/funora/_lot_form.py +331 -0
  67. funora-0.0.1.dev2/src/funora/_market.py +406 -0
  68. funora-0.0.1.dev2/src/funora/_matching.py +147 -0
  69. funora-0.0.1.dev2/src/funora/_money.py +279 -0
  70. funora-0.0.1.dev2/src/funora/_monitoring.py +396 -0
  71. funora-0.0.1.dev2/src/funora/_observed.py +237 -0
  72. funora-0.0.1.dev2/src/funora/_order.py +552 -0
  73. funora-0.0.1.dev2/src/funora/_order_details.py +281 -0
  74. funora-0.0.1.dev2/src/funora/_orders.py +807 -0
  75. funora-0.0.1.dev2/src/funora/_outbound.py +453 -0
  76. funora-0.0.1.dev2/src/funora/_own_lots.py +301 -0
  77. funora-0.0.1.dev2/src/funora/_poll.py +410 -0
  78. funora-0.0.1.dev2/src/funora/_price_audit.py +281 -0
  79. funora-0.0.1.dev2/src/funora/_proxies.py +232 -0
  80. funora-0.0.1.dev2/src/funora/_raise.py +150 -0
  81. funora-0.0.1.dev2/src/funora/_refund.py +102 -0
  82. funora-0.0.1.dev2/src/funora/_result.py +157 -0
  83. funora-0.0.1.dev2/src/funora/_retry.py +213 -0
  84. funora-0.0.1.dev2/src/funora/_review_write.py +138 -0
  85. funora-0.0.1.dev2/src/funora/_reviews.py +584 -0
  86. funora-0.0.1.dev2/src/funora/_runner.py +651 -0
  87. funora-0.0.1.dev2/src/funora/_secret.py +385 -0
  88. funora-0.0.1.dev2/src/funora/_showcase.py +362 -0
  89. funora-0.0.1.dev2/src/funora/_signals.py +375 -0
  90. funora-0.0.1.dev2/src/funora/_skeleton.py +752 -0
  91. funora-0.0.1.dev2/src/funora/_snapshot.py +276 -0
  92. funora-0.0.1.dev2/src/funora/_state.py +279 -0
  93. funora-0.0.1.dev2/src/funora/_stock.py +32 -0
  94. funora-0.0.1.dev2/src/funora/_thread.py +574 -0
  95. funora-0.0.1.dev2/src/funora/_transport.py +1023 -0
  96. funora-0.0.1.dev2/src/funora/_updates.py +292 -0
  97. funora-0.0.1.dev2/src/funora/_verdicts.py +91 -0
  98. funora-0.0.1.dev2/src/funora/_viewing.py +143 -0
  99. funora-0.0.1.dev2/src/funora/_watch.py +825 -0
  100. funora-0.0.1.dev2/src/funora/_watch_state.py +237 -0
  101. funora-0.0.1.dev2/src/funora/_whoami.py +546 -0
  102. funora-0.0.1.dev2/src/funora/bot/__init__.py +52 -0
  103. funora-0.0.1.dev2/src/funora/bot/_delivery.py +341 -0
  104. funora-0.0.1.dev2/src/funora/bot/_outbox.py +261 -0
  105. funora-0.0.1.dev2/src/funora/bot/_runtime.py +447 -0
  106. funora-0.0.1.dev2/src/funora/bot/_spool.py +534 -0
  107. funora-0.0.1.dev2/src/funora/budget.py +311 -0
  108. funora-0.0.1.dev2/src/funora/capabilities.py +297 -0
  109. funora-0.0.1.dev2/src/funora/conformance.py +758 -0
  110. funora-0.0.1.dev2/src/funora/contract.py +73 -0
  111. funora-0.0.1.dev2/src/funora/errors.py +996 -0
  112. funora-0.0.1.dev2/src/funora/events.py +189 -0
  113. funora-0.0.1.dev2/src/funora/extraction.py +420 -0
  114. funora-0.0.1.dev2/src/funora/observe.py +560 -0
  115. funora-0.0.1.dev2/src/funora/operations.py +671 -0
  116. funora-0.0.1.dev2/src/funora/py.typed +0 -0
  117. funora-0.0.1.dev2/src/funora/reconciliation.py +51 -0
  118. funora-0.0.1.dev2/src/funora/response_classes.py +155 -0
  119. funora-0.0.1.dev2/src/funora/retry.py +238 -0
  120. funora-0.0.1.dev2/src/funora/send_outcome.py +78 -0
  121. funora-0.0.1.dev2/src/funora/skeleton_format.py +77 -0
  122. funora-0.0.1.dev2/tests/_consent_probe.py +69 -0
  123. funora-0.0.1.dev2/tests/_schema_check.py +329 -0
  124. funora-0.0.1.dev2/tests/conftest.py +56 -0
  125. funora-0.0.1.dev2/tests/fixtures/completeness.json +385 -0
  126. funora-0.0.1.dev2/tests/fixtures/network/README.md +36 -0
  127. funora-0.0.1.dev2/tests/fixtures/network/network.lot-save-form.json +94 -0
  128. funora-0.0.1.dev2/tests/fixtures/network/network.promote.json +45 -0
  129. funora-0.0.1.dev2/tests/fixtures/pages/README.md +134 -0
  130. funora-0.0.1.dev2/tests/fixtures/pages/account-balance-end.logged.ru.provenance.json +14 -0
  131. funora-0.0.1.dev2/tests/fixtures/pages/account-balance-end.logged.ru.skeleton.txt +2443 -0
  132. funora-0.0.1.dev2/tests/fixtures/pages/account-balance-first.logged.ru.provenance.json +14 -0
  133. funora-0.0.1.dev2/tests/fixtures/pages/account-balance-first.logged.ru.skeleton.txt +1561 -0
  134. funora-0.0.1.dev2/tests/fixtures/pages/account-balance.logged.ru.provenance.json +17 -0
  135. funora-0.0.1.dev2/tests/fixtures/pages/account-balance.logged.ru.skeleton.txt +1644 -0
  136. funora-0.0.1.dev2/tests/fixtures/pages/account-balance.v9.logged.ru.provenance.json +20 -0
  137. funora-0.0.1.dev2/tests/fixtures/pages/account-balance.v9.logged.ru.skeleton.txt +1629 -0
  138. funora-0.0.1.dev2/tests/fixtures/pages/catalog-fields.logged.ru.provenance.json +27 -0
  139. funora-0.0.1.dev2/tests/fixtures/pages/catalog-fields.logged.ru.skeleton.txt +4567 -0
  140. funora-0.0.1.dev2/tests/fixtures/pages/catalog-search.guest.ru.provenance.json +12 -0
  141. funora-0.0.1.dev2/tests/fixtures/pages/catalog-search.guest.ru.skeleton.txt +234 -0
  142. funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.logged.ru.provenance.json +17 -0
  143. funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.logged.ru.skeleton.txt +1509 -0
  144. funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.v8.logged.ru.provenance.json +18 -0
  145. funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.v8.logged.ru.skeleton.txt +1689 -0
  146. funora-0.0.1.dev2/tests/fixtures/pages/chat.logged.ru.provenance.json +17 -0
  147. funora-0.0.1.dev2/tests/fixtures/pages/chat.logged.ru.skeleton.txt +1170 -0
  148. funora-0.0.1.dev2/tests/fixtures/pages/chips.trimmed.guest.ru.provenance.json +40 -0
  149. funora-0.0.1.dev2/tests/fixtures/pages/chips.trimmed.guest.ru.skeleton.txt +1329 -0
  150. funora-0.0.1.dev2/tests/fixtures/pages/lot-edit-stock.logged.ru.provenance.json +14 -0
  151. funora-0.0.1.dev2/tests/fixtures/pages/lot-edit-stock.logged.ru.skeleton.txt +588 -0
  152. funora-0.0.1.dev2/tests/fixtures/pages/lot-edit.logged.ru.provenance.json +26 -0
  153. funora-0.0.1.dev2/tests/fixtures/pages/lot-edit.logged.ru.skeleton.txt +654 -0
  154. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade-stock.logged.ru.provenance.json +15 -0
  155. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade-stock.logged.ru.skeleton.txt +743 -0
  156. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.logged.ru.provenance.json +23 -0
  157. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.logged.ru.skeleton.txt +987 -0
  158. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.off.logged.ru.provenance.json +20 -0
  159. funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.off.logged.ru.skeleton.txt +579 -0
  160. funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.guest.ru.provenance.json +40 -0
  161. funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.guest.ru.skeleton.txt +3612 -0
  162. funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.logged.ru.provenance.json +37 -0
  163. funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.logged.ru.skeleton.txt +5953 -0
  164. funora-0.0.1.dev2/tests/fixtures/pages/order.logged.ru.provenance.json +14 -0
  165. funora-0.0.1.dev2/tests/fixtures/pages/order.logged.ru.skeleton.txt +732 -0
  166. funora-0.0.1.dev2/tests/fixtures/pages/order.v9.logged.ru.provenance.json +20 -0
  167. funora-0.0.1.dev2/tests/fixtures/pages/order.v9.logged.ru.skeleton.txt +856 -0
  168. funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered-empty.logged.ru.provenance.json +14 -0
  169. funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered-empty.logged.ru.skeleton.txt +3015 -0
  170. funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered.logged.ru.provenance.json +14 -0
  171. funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered.logged.ru.skeleton.txt +3600 -0
  172. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.empty.ru.provenance.json +17 -0
  173. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.empty.ru.skeleton.txt +3090 -0
  174. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.guest.ru.provenance.json +18 -0
  175. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.guest.ru.skeleton.txt +263 -0
  176. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.logged.ru.provenance.json +17 -0
  177. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.logged.ru.skeleton.txt +855 -0
  178. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.v8.logged.ru.provenance.json +17 -0
  179. funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.v8.logged.ru.skeleton.txt +4727 -0
  180. funora-0.0.1.dev2/tests/fixtures/pages/reviews-first.guest.ru.provenance.json +12 -0
  181. funora-0.0.1.dev2/tests/fixtures/pages/reviews-first.guest.ru.skeleton.txt +8326 -0
  182. funora-0.0.1.dev2/tests/fixtures/pages/reviews-last.guest.ru.provenance.json +12 -0
  183. funora-0.0.1.dev2/tests/fixtures/pages/reviews-last.guest.ru.skeleton.txt +176 -0
  184. funora-0.0.1.dev2/tests/fixtures/pages/reviews-next.guest.ru.provenance.json +12 -0
  185. funora-0.0.1.dev2/tests/fixtures/pages/reviews-next.guest.ru.skeleton.txt +1256 -0
  186. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-empty.guest.ru.provenance.json +14 -0
  187. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-empty.guest.ru.skeleton.txt +122 -0
  188. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-end.guest.ru.provenance.json +14 -0
  189. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-end.guest.ru.skeleton.txt +515 -0
  190. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-first.guest.ru.provenance.json +14 -0
  191. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-first.guest.ru.skeleton.txt +1243 -0
  192. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-next.guest.ru.provenance.json +14 -0
  193. funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-next.guest.ru.skeleton.txt +1256 -0
  194. funora-0.0.1.dev2/tests/fixtures/pages/root.logged.ru.provenance.json +17 -0
  195. funora-0.0.1.dev2/tests/fixtures/pages/root.logged.ru.skeleton.txt +32883 -0
  196. funora-0.0.1.dev2/tests/fixtures/pages/user-foreign.logged.ru.provenance.json +34 -0
  197. funora-0.0.1.dev2/tests/fixtures/pages/user-foreign.logged.ru.skeleton.txt +2430 -0
  198. funora-0.0.1.dev2/tests/fixtures/pages/user.logged.ru.provenance.json +14 -0
  199. funora-0.0.1.dev2/tests/fixtures/pages/user.logged.ru.skeleton.txt +4181 -0
  200. funora-0.0.1.dev2/tests/fixtures/pages/user.v9.logged.ru.provenance.json +20 -0
  201. funora-0.0.1.dev2/tests/fixtures/pages/user.v9.logged.ru.skeleton.txt +4446 -0
  202. funora-0.0.1.dev2/tests/fixtures/probes/README.md +43 -0
  203. funora-0.0.1.dev2/tests/fixtures/probes/currency.account-balance.json +72 -0
  204. funora-0.0.1.dev2/tests/fixtures/probes/currency.chat.json +26 -0
  205. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-n.json +22 -0
  206. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.codes-carrier-2.json +100 -0
  207. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.codes-carrier.json +100 -0
  208. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.json +102 -0
  209. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.codes.json +74 -0
  210. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.dollars.json +41 -0
  211. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.euro.json +41 -0
  212. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.json +41 -0
  213. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.rub-code.json +74 -0
  214. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.rubles.json +41 -0
  215. funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.switcher.json +41 -0
  216. funora-0.0.1.dev2/tests/fixtures/probes/currency.root.json +11 -0
  217. funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.dollars.json +39 -0
  218. funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.euro.json +39 -0
  219. funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.json +38 -0
  220. funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.rubles.json +39 -0
  221. funora-0.0.1.dev2/tests/fixtures/probes/market-price-display.guest.json +99 -0
  222. funora-0.0.1.dev2/tests/fixtures/probes/own-stock.logged.json +26 -0
  223. funora-0.0.1.dev2/tests/fixtures/probes/showcase-stock.guest.json +19 -0
  224. funora-0.0.1.dev2/tests/test_absence_claims.py +222 -0
  225. funora-0.0.1.dev2/tests/test_absence_semantics.py +97 -0
  226. funora-0.0.1.dev2/tests/test_account.py +284 -0
  227. funora-0.0.1.dev2/tests/test_account_budgets.py +43 -0
  228. funora-0.0.1.dev2/tests/test_aclient.py +538 -0
  229. funora-0.0.1.dev2/tests/test_action_budget.py +169 -0
  230. funora-0.0.1.dev2/tests/test_attribute_reading.py +91 -0
  231. funora-0.0.1.dev2/tests/test_auto_delivery.py +908 -0
  232. funora-0.0.1.dev2/tests/test_borrowed_writes_ask_consent.py +205 -0
  233. funora-0.0.1.dev2/tests/test_bot.py +823 -0
  234. funora-0.0.1.dev2/tests/test_budget.py +233 -0
  235. funora-0.0.1.dev2/tests/test_budget_concurrency.py +39 -0
  236. funora-0.0.1.dev2/tests/test_budget_exact.py +105 -0
  237. funora-0.0.1.dev2/tests/test_buyer_viewing.py +382 -0
  238. funora-0.0.1.dev2/tests/test_cache_codegen.py +44 -0
  239. funora-0.0.1.dev2/tests/test_calc.py +381 -0
  240. funora-0.0.1.dev2/tests/test_canonical.py +418 -0
  241. funora-0.0.1.dev2/tests/test_capability_profile.py +256 -0
  242. funora-0.0.1.dev2/tests/test_capture_tool.py +2259 -0
  243. funora-0.0.1.dev2/tests/test_catalog.py +375 -0
  244. funora-0.0.1.dev2/tests/test_catalog_cache.py +99 -0
  245. funora-0.0.1.dev2/tests/test_catalog_search.py +272 -0
  246. funora-0.0.1.dev2/tests/test_chat_history.py +577 -0
  247. funora-0.0.1.dev2/tests/test_chats.py +285 -0
  248. funora-0.0.1.dev2/tests/test_check_skeleton_tool.py +106 -0
  249. funora-0.0.1.dev2/tests/test_chips.py +382 -0
  250. funora-0.0.1.dev2/tests/test_chips_numbers.py +269 -0
  251. funora-0.0.1.dev2/tests/test_classify.py +982 -0
  252. funora-0.0.1.dev2/tests/test_client.py +898 -0
  253. funora-0.0.1.dev2/tests/test_client_boundaries.py +246 -0
  254. funora-0.0.1.dev2/tests/test_completeness.py +239 -0
  255. funora-0.0.1.dev2/tests/test_conformance.py +138 -0
  256. funora-0.0.1.dev2/tests/test_conformance_protocol.py +232 -0
  257. funora-0.0.1.dev2/tests/test_conversion_failure.py +112 -0
  258. funora-0.0.1.dev2/tests/test_core_boundaries.py +139 -0
  259. funora-0.0.1.dev2/tests/test_currency_code.py +269 -0
  260. funora-0.0.1.dev2/tests/test_currency_switch.py +349 -0
  261. funora-0.0.1.dev2/tests/test_declared_and_read.py +387 -0
  262. funora-0.0.1.dev2/tests/test_dedup_lru.py +56 -0
  263. funora-0.0.1.dev2/tests/test_delivery_end_to_end.py +378 -0
  264. funora-0.0.1.dev2/tests/test_diff.py +882 -0
  265. funora-0.0.1.dev2/tests/test_dispatch_concurrent.py +445 -0
  266. funora-0.0.1.dev2/tests/test_distribution_gate.py +239 -0
  267. funora-0.0.1.dev2/tests/test_docs.py +607 -0
  268. funora-0.0.1.dev2/tests/test_docs_numbers.py +278 -0
  269. funora-0.0.1.dev2/tests/test_durable_recovery.py +280 -0
  270. funora-0.0.1.dev2/tests/test_engine_boundaries.py +343 -0
  271. funora-0.0.1.dev2/tests/test_errors.py +56 -0
  272. funora-0.0.1.dev2/tests/test_event_schemas.py +509 -0
  273. funora-0.0.1.dev2/tests/test_field_schema.py +95 -0
  274. funora-0.0.1.dev2/tests/test_fixtures.py +577 -0
  275. funora-0.0.1.dev2/tests/test_foreign_profile.py +168 -0
  276. funora-0.0.1.dev2/tests/test_generated.py +545 -0
  277. funora-0.0.1.dev2/tests/test_health.py +214 -0
  278. funora-0.0.1.dev2/tests/test_hops.py +142 -0
  279. funora-0.0.1.dev2/tests/test_host.py +178 -0
  280. funora-0.0.1.dev2/tests/test_http_transport_contract.py +185 -0
  281. funora-0.0.1.dev2/tests/test_listen.py +576 -0
  282. funora-0.0.1.dev2/tests/test_locale.py +167 -0
  283. funora-0.0.1.dev2/tests/test_lot_capabilities.py +168 -0
  284. funora-0.0.1.dev2/tests/test_lot_edit.py +170 -0
  285. funora-0.0.1.dev2/tests/test_lot_form_preservation.py +76 -0
  286. funora-0.0.1.dev2/tests/test_lot_revision.py +270 -0
  287. funora-0.0.1.dev2/tests/test_lot_visibility.py +463 -0
  288. funora-0.0.1.dev2/tests/test_mark_read.py +353 -0
  289. funora-0.0.1.dev2/tests/test_market.py +330 -0
  290. funora-0.0.1.dev2/tests/test_market_money.py +190 -0
  291. funora-0.0.1.dev2/tests/test_market_offer_id.py +137 -0
  292. funora-0.0.1.dev2/tests/test_market_operation.py +442 -0
  293. funora-0.0.1.dev2/tests/test_market_snapshot.py +317 -0
  294. funora-0.0.1.dev2/tests/test_message_direction.py +493 -0
  295. funora-0.0.1.dev2/tests/test_model_containers.py +67 -0
  296. funora-0.0.1.dev2/tests/test_model_schemas.py +519 -0
  297. funora-0.0.1.dev2/tests/test_money.py +188 -0
  298. funora-0.0.1.dev2/tests/test_monitoring.py +587 -0
  299. funora-0.0.1.dev2/tests/test_monitoring_contract.py +79 -0
  300. funora-0.0.1.dev2/tests/test_monitoring_history.py +280 -0
  301. funora-0.0.1.dev2/tests/test_monitoring_timing.py +251 -0
  302. funora-0.0.1.dev2/tests/test_observe.py +489 -0
  303. funora-0.0.1.dev2/tests/test_observe_boundaries.py +133 -0
  304. funora-0.0.1.dev2/tests/test_observe_compare.py +252 -0
  305. funora-0.0.1.dev2/tests/test_observe_plan.py +107 -0
  306. funora-0.0.1.dev2/tests/test_observed.py +256 -0
  307. funora-0.0.1.dev2/tests/test_operation_codegen.py +102 -0
  308. funora-0.0.1.dev2/tests/test_operation_errors.py +138 -0
  309. funora-0.0.1.dev2/tests/test_order.py +394 -0
  310. funora-0.0.1.dev2/tests/test_order_details.py +451 -0
  311. funora-0.0.1.dev2/tests/test_order_filters.py +141 -0
  312. funora-0.0.1.dev2/tests/test_order_money.py +284 -0
  313. funora-0.0.1.dev2/tests/test_order_states.py +235 -0
  314. funora-0.0.1.dev2/tests/test_orders.py +795 -0
  315. funora-0.0.1.dev2/tests/test_outbound_durability.py +631 -0
  316. funora-0.0.1.dev2/tests/test_outbound_governor.py +396 -0
  317. funora-0.0.1.dev2/tests/test_outbound_governor_vectors.py +143 -0
  318. funora-0.0.1.dev2/tests/test_outbound_restore.py +174 -0
  319. funora-0.0.1.dev2/tests/test_own_lots.py +377 -0
  320. funora-0.0.1.dev2/tests/test_own_stock.py +203 -0
  321. funora-0.0.1.dev2/tests/test_pagination_cursor.py +359 -0
  322. funora-0.0.1.dev2/tests/test_parser_boundaries.py +222 -0
  323. funora-0.0.1.dev2/tests/test_parser_failures.py +169 -0
  324. funora-0.0.1.dev2/tests/test_persistence_failures.py +144 -0
  325. funora-0.0.1.dev2/tests/test_poll.py +344 -0
  326. funora-0.0.1.dev2/tests/test_portability.py +144 -0
  327. funora-0.0.1.dev2/tests/test_price_audit.py +556 -0
  328. funora-0.0.1.dev2/tests/test_price_audit_restore.py +151 -0
  329. funora-0.0.1.dev2/tests/test_printed_commands.py +254 -0
  330. funora-0.0.1.dev2/tests/test_promote.py +353 -0
  331. funora-0.0.1.dev2/tests/test_proxies.py +306 -0
  332. funora-0.0.1.dev2/tests/test_public_transport.py +269 -0
  333. funora-0.0.1.dev2/tests/test_rate_budget_vectors.py +241 -0
  334. funora-0.0.1.dev2/tests/test_reconciliation.py +366 -0
  335. funora-0.0.1.dev2/tests/test_recovery_boundaries.py +148 -0
  336. funora-0.0.1.dev2/tests/test_refund.py +409 -0
  337. funora-0.0.1.dev2/tests/test_release_gate.py +31 -0
  338. funora-0.0.1.dev2/tests/test_request_classes.py +301 -0
  339. funora-0.0.1.dev2/tests/test_result.py +106 -0
  340. funora-0.0.1.dev2/tests/test_resume_vectors.py +269 -0
  341. funora-0.0.1.dev2/tests/test_retry.py +402 -0
  342. funora-0.0.1.dev2/tests/test_retry_reason_reaches_the_caller.py +89 -0
  343. funora-0.0.1.dev2/tests/test_retry_vectors.py +85 -0
  344. funora-0.0.1.dev2/tests/test_review_filters.py +258 -0
  345. funora-0.0.1.dev2/tests/test_reviews.py +453 -0
  346. funora-0.0.1.dev2/tests/test_reviews_pagination.py +153 -0
  347. funora-0.0.1.dev2/tests/test_reviews_write.py +430 -0
  348. funora-0.0.1.dev2/tests/test_revision_source.py +409 -0
  349. funora-0.0.1.dev2/tests/test_runner_context.py +296 -0
  350. funora-0.0.1.dev2/tests/test_runner_validation.py +214 -0
  351. funora-0.0.1.dev2/tests/test_runtime_failures.py +161 -0
  352. funora-0.0.1.dev2/tests/test_secret.py +314 -0
  353. funora-0.0.1.dev2/tests/test_selectors_are_generated.py +262 -0
  354. funora-0.0.1.dev2/tests/test_send_image.py +441 -0
  355. funora-0.0.1.dev2/tests/test_send_outcome.py +305 -0
  356. funora-0.0.1.dev2/tests/test_send_text_operation.py +494 -0
  357. funora-0.0.1.dev2/tests/test_service_reads.py +119 -0
  358. funora-0.0.1.dev2/tests/test_showcase.py +338 -0
  359. funora-0.0.1.dev2/tests/test_showcase_stock.py +168 -0
  360. funora-0.0.1.dev2/tests/test_signals.py +278 -0
  361. funora-0.0.1.dev2/tests/test_skeleton.py +572 -0
  362. funora-0.0.1.dev2/tests/test_skeleton_format.py +261 -0
  363. funora-0.0.1.dev2/tests/test_skeleton_paths.py +181 -0
  364. funora-0.0.1.dev2/tests/test_spec_coverage.py +620 -0
  365. funora-0.0.1.dev2/tests/test_spec_selectors.py +709 -0
  366. funora-0.0.1.dev2/tests/test_spool.py +468 -0
  367. funora-0.0.1.dev2/tests/test_state.py +374 -0
  368. funora-0.0.1.dev2/tests/test_state_paths.py +150 -0
  369. funora-0.0.1.dev2/tests/test_state_without_operations.py +308 -0
  370. funora-0.0.1.dev2/tests/test_thread.py +528 -0
  371. funora-0.0.1.dev2/tests/test_transport.py +633 -0
  372. funora-0.0.1.dev2/tests/test_transport_async.py +259 -0
  373. funora-0.0.1.dev2/tests/test_update_price.py +419 -0
  374. funora-0.0.1.dev2/tests/test_updates_channel.py +339 -0
  375. funora-0.0.1.dev2/tests/test_verdicts.py +194 -0
  376. funora-0.0.1.dev2/tests/test_waiting_rule.py +205 -0
  377. funora-0.0.1.dev2/tests/test_watch.py +2393 -0
  378. funora-0.0.1.dev2/tests/test_watch_contract.py +41 -0
  379. funora-0.0.1.dev2/tests/test_watch_outbox.py +541 -0
  380. funora-0.0.1.dev2/tests/test_whoami.py +430 -0
  381. funora-0.0.1.dev2/tests/test_withdrawal_options.py +422 -0
  382. funora-0.0.1.dev2/tests/test_write_admission.py +114 -0
  383. funora-0.0.1.dev2/tools/capture.js +1685 -0
  384. funora-0.0.1.dev2/tools/capture.py +527 -0
  385. funora-0.0.1.dev2/tools/check_distribution.py +177 -0
  386. funora-0.0.1.dev2/tools/check_release.py +28 -0
  387. funora-0.0.1.dev2/tools/check_skeleton.py +266 -0
  388. funora-0.0.1.dev2/tools/codegen.py +3280 -0
  389. funora-0.0.1.dev2/tools/completeness.py +264 -0
  390. funora-0.0.1.dev2/tools/observe_plan.py +273 -0
  391. funora-0.0.1.dev2/tools/trim_skeleton.py +132 -0
@@ -0,0 +1,3 @@
1
+ # Тесты сравнивают строки побайтово, включая канареечные значения и подписи
2
+ # скелета. Перевод строки обязан быть одинаковым на всех машинах.
3
+ * text=auto eol=lf
@@ -0,0 +1,13 @@
1
+ # Actions in release workflows are pinned by commit SHA. Pins do not age well on
2
+ # their own - Dependabot is what keeps them current without giving up the pinning.
3
+ version: 2
4
+ updates:
5
+ - package-ecosystem: "github-actions"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "monthly"
9
+ commit-message:
10
+ prefix: "ci"
11
+ labels:
12
+ - "type:refactor"
13
+ open-pull-requests-limit: 3
@@ -0,0 +1,204 @@
1
+ # Проверки Python SDK.
2
+ #
3
+ # Сторонние actions закреплены по хэшу коммита, а не по тегу: тег в GitHub можно
4
+ # переставить на другой коммит, хэш нельзя.
5
+
6
+ name: ci
7
+
8
+ on:
9
+ workflow_call:
10
+ pull_request:
11
+ push:
12
+ branches: [main]
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ test:
19
+ name: Тесты и проверки
20
+ runs-on: ubuntu-latest
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ python-version: ['3.11', '3.12']
25
+ steps:
26
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
27
+ with:
28
+ persist-credentials: false
29
+
30
+ # Спецификация нужна, чтобы сверить обещанные ею селекторы с настоящими
31
+ # снимками страниц. Проверить это можно только здесь: снимки лежат в этом
32
+ # репозитории, а перечень селекторов - в том.
33
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ with:
35
+ repository: Funora-Develop/Funora-spec
36
+ ref: fa83fa17d548524815d42be74d24dc6100af9e66 # контракт 0.64.0
37
+ path: .funora-spec
38
+ persist-credentials: false
39
+
40
+ # Зелёная сборка без этого шага доказывает «совпадает со спецификацией,
41
+ # какой она была в момент сборки», а не «совпадает с версией X». При шести
42
+ # SDK и независимом версионировании спецификации это и есть тот вопрос,
43
+ # ради которого заведён spec/version.yaml.
44
+ - name: Против какой спецификации собрано
45
+ run: |
46
+ rev=$(git -C .funora-spec rev-parse HEAD)
47
+ ver=$(grep -m1 '^spec_version:' .funora-spec/spec/version.yaml | cut -d'"' -f2)
48
+ status=$(grep -m1 '^status:' .funora-spec/spec/version.yaml | awk '{print $2}')
49
+ echo "спецификация: версия $ver, статус $status, ревизия $rev"
50
+ {
51
+ echo "### Спецификация"
52
+ echo ""
53
+ echo "| поле | значение |"
54
+ echo "| --- | --- |"
55
+ echo "| версия | \`$ver\` |"
56
+ echo "| статус | \`$status\` |"
57
+ echo "| ревизия | \`$rev\` |"
58
+ } >> "$GITHUB_STEP_SUMMARY"
59
+
60
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
61
+ with:
62
+ python-version: ${{ matrix.python-version }}
63
+
64
+ # Раннер набора соответствия живёт в репозитории спецификации и написан на
65
+ # JavaScript: принадлежать одной реализации из шести ему нельзя. Без его
66
+ # зависимостей набор падал бы на «Cannot find module», и это выглядело бы
67
+ # поломкой реализации, а не недостачей сборки.
68
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
69
+ with:
70
+ node-version: '22'
71
+
72
+ - name: Зависимости раннера
73
+ run: npm ci
74
+ working-directory: .funora-spec
75
+
76
+ - run: python -m pip install --upgrade pip
77
+ - run: pip install -e ".[dev,docs]"
78
+
79
+ - name: Нижняя граница версии сборщика
80
+ if: matrix.python-version == '3.11'
81
+ run: python -m pip install hatchling==1.27.0
82
+
83
+ - name: Линтер
84
+ run: ruff check src tests tools
85
+
86
+ - name: Форматирование
87
+ run: ruff format --check src tests tools
88
+
89
+ - name: Проверка типов
90
+ run: mypy
91
+
92
+ - name: Тесты
93
+ run: pytest -q --cov=funora --cov-report=xml --cov-fail-under=100
94
+ env:
95
+ FUNORA_SPEC_DIR: ${{ github.workspace }}/.funora-spec
96
+
97
+ # Набор соответствия - тот самый, ради которого заведены векторы.
98
+ #
99
+ # До сих пор он в сборку НЕ ВХОДИЛ, и гоняли его, когда вспомнят. Набор,
100
+ # который гоняют по памяти, - это тот же объявленный и молчащий механизм,
101
+ # только с лишним шагом: расхождение реализации с контрактом дожидалось
102
+ # бы того, кто решит его запустить.
103
+ #
104
+ # Раннер живёт в репозитории спецификации: принадлежать одной реализации
105
+ # из шести ему нельзя.
106
+ - name: Соответствие контракту
107
+ run: node scripts/conformance.js "python -m funora.conformance"
108
+ working-directory: .funora-spec
109
+ env:
110
+ FUNORA_SPEC_DIR: ${{ github.workspace }}/.funora-spec
111
+
112
+ # Руководство собирается той же сборкой, что и код.
113
+ #
114
+ # Документация, которую никто не собирает, ломается тише кода: битая
115
+ # разметка, глава, выпавшая из оглавления, ссылка в никуда - всё это видно
116
+ # только тому, кто откроет страницу, то есть первому пришедшему человеку.
117
+ #
118
+ # Строго: предупреждение сборщика здесь - отказ. Проверку самих ссылок
119
+ # делает pytest по настоящему дереву репозитория, и она сильнее.
120
+ - name: Руководство собирается
121
+ run: mkdocs build --strict
122
+
123
+ # Порождённые модули обязаны совпадать со спецификацией посимвольно.
124
+ # Шаг отдельный и без права на пропуск: расхождение здесь означает, что
125
+ # спецификацию изменили, а сборку не перезапустили, и шесть реализаций
126
+ # разъедутся молча.
127
+ - name: Порождённые модули не отстали
128
+ run: python tools/codegen.py --check
129
+ env:
130
+ FUNORA_SPEC_DIR: ${{ github.workspace }}/.funora-spec
131
+
132
+ - name: Матрица функций не отстала
133
+ run: python tools/completeness.py --check
134
+ env:
135
+ FUNORA_SPEC_DIR: ${{ github.workspace }}/.funora-spec
136
+
137
+ - name: Сборка и установка wheel и sdist
138
+ run: |
139
+ python -m pip install build twine
140
+ python -m build --no-isolation
141
+ python -m twine check dist/*
142
+ python tools/check_distribution.py dist
143
+
144
+ # Отдельным шагом, потому что молчаливый пропуск здесь недопустим. Наборы
145
+ # сверки пропускают себя, если спецификация недоступна, и без этой
146
+ # проверки отсутствие сверки выглядело бы как зелёная сборка.
147
+ - name: Сверка со спецификацией выполнена, а не пропущена
148
+ run: |
149
+ out=$(pytest tests/test_spec_selectors.py tests/test_generated.py tests/test_revision_source.py tests/test_fixtures.py tests/test_money.py -q -rs)
150
+ echo "$out"
151
+ # Ловится недоступность спецификации, а не всякий пропуск. Пропуски
152
+ # бывают законные: счётчик, объявленный в области строки, по документу
153
+ # не сверяется - его проверяет разбор, а не подсчёт узлов.
154
+ #
155
+ # Признак недоступности точный: модуль пропускается целиком с этой
156
+ # причиной, и тогда не проходит ни одна проверка.
157
+ if echo "$out" | grep -q "FUNORA_SPEC_DIR"; then
158
+ echo "сверка со спецификацией пропущена: она недоступна"
159
+ exit 1
160
+ fi
161
+ if ! echo "$out" | grep -qE '[0-9]+ passed'; then
162
+ echo "сверка со спецификацией не выполнилась ни разу"
163
+ exit 1
164
+ fi
165
+ env:
166
+ FUNORA_SPEC_DIR: ${{ github.workspace }}/.funora-spec
167
+
168
+ windows-storage:
169
+ name: Очереди и журналы на Windows
170
+ runs-on: windows-latest
171
+ steps:
172
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
173
+ with:
174
+ persist-credentials: false
175
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
176
+ with:
177
+ python-version: '3.12'
178
+ - run: python -m pip install -e ".[dev]"
179
+ - name: Блокировки, восстановление и общий бюджет
180
+ run: >-
181
+ python -m pytest -q tests/test_state.py tests/test_spool.py
182
+ tests/test_persistence_failures.py tests/test_runtime_failures.py
183
+ tests/test_bot.py tests/test_budget_concurrency.py
184
+ tests/test_http_transport_contract.py
185
+ tests/test_watch_outbox.py
186
+ tests/test_monitoring.py
187
+ tests/test_monitoring_timing.py
188
+ tests/test_monitoring_history.py
189
+ tests/test_distribution_gate.py
190
+ tests/test_lot_revision.py
191
+ tests/test_lot_form_preservation.py
192
+ tests/test_outbound_restore.py
193
+ tests/test_durable_recovery.py
194
+ tests/test_price_audit_restore.py
195
+ tests/test_state_paths.py
196
+ tests/test_absence_semantics.py
197
+ tests/test_client_boundaries.py
198
+ tests/test_core_boundaries.py
199
+ tests/test_engine_boundaries.py
200
+ tests/test_observe_boundaries.py
201
+ tests/test_parser_boundaries.py
202
+ tests/test_parser_failures.py
203
+ tests/test_recovery_boundaries.py
204
+ tests/test_service_reads.py
@@ -0,0 +1,75 @@
1
+ # Publishes funora to PyPI via Trusted Publishing (OIDC).
2
+ # No API token is stored anywhere: PyPI trusts this repository, this workflow
3
+ # file name and the "pypi" environment. Third-party actions are pinned by
4
+ # commit SHA, as required for release and security workflows.
5
+
6
+ name: release
7
+
8
+ on:
9
+ push:
10
+ tags:
11
+ - 'v*'
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ verify:
18
+ name: Проверки перед выпуском
19
+ uses: ./.github/workflows/ci.yml
20
+
21
+ build:
22
+ name: Build distributions
23
+ needs: verify
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
27
+ with:
28
+ persist-credentials: false
29
+
30
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
31
+ with:
32
+ python-version: '3.12'
33
+
34
+ - name: Тег соответствует версии пакета
35
+ run: python tools/check_release.py
36
+ env:
37
+ FUNORA_RELEASE_TAG: ${{ github.ref_name }}
38
+
39
+ - name: Build sdist and wheel
40
+ run: |
41
+ python -m pip install --upgrade build
42
+ python -m build
43
+
44
+ - name: Установка wheel и sdist в чистые окружения
45
+ run: python tools/check_distribution.py dist
46
+
47
+ - name: Validate package metadata
48
+ run: |
49
+ python -m pip install --upgrade twine
50
+ python -m twine check dist/*
51
+
52
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
53
+ with:
54
+ name: dist
55
+ path: dist/
56
+ if-no-files-found: error
57
+
58
+ publish:
59
+ name: Publish to PyPI
60
+ needs: build
61
+ # Тег v<версия> обозначает намеренный выпуск, включая pre-alpha.
62
+ # Обычные коммиты и PR этот workflow не запускают.
63
+ runs-on: ubuntu-latest
64
+ environment:
65
+ name: pypi
66
+ url: https://pypi.org/p/funora
67
+ permissions:
68
+ id-token: write
69
+ steps:
70
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
71
+ with:
72
+ name: dist
73
+ path: dist/
74
+
75
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
@@ -0,0 +1,189 @@
1
+ # ---------------------------------------------------------------------------
2
+ # Funora
3
+ #
4
+ # Credentials come first on purpose. A FunPay session key is not a scoped token:
5
+ # it is the whole account. Anything that could carry one must never be committed,
6
+ # because git history cannot be cleaned out of forks and caches after the fact.
7
+ # ---------------------------------------------------------------------------
8
+
9
+ # --- Credentials and session material -------------------------------------
10
+ .env
11
+ .env.*
12
+ !.env.example
13
+ *.pem
14
+ *.key
15
+ secrets.*
16
+ credentials.*
17
+ golden_key*
18
+ *golden*key*
19
+ cookies.txt
20
+ cookies.json
21
+ *.cookies
22
+ session.json
23
+ session_*.json
24
+ .session/
25
+ auth.json
26
+ *.netrc
27
+ .npmrc
28
+ .pypirc
29
+
30
+ # --- Captured protocol material -------------------------------------------
31
+ # Raw pages from a signed-in account contain buyer names and message text.
32
+ # Only redacted, structurally skeletonized fixtures belong in the repository.
33
+ captures/
34
+ raw-captures/
35
+ *.raw.html
36
+ *.raw.json
37
+ snapshots/raw/
38
+ debug-dump/
39
+ diagnostics-*.json
40
+
41
+ # --- Local working notes ---------------------------------------------------
42
+ # Assistant and maintainer scratch space. Never committed.
43
+ .notes/
44
+
45
+ # --- AI assistants and coding agents ---------------------------------------
46
+ .claude/
47
+ .claude.json
48
+ CLAUDE.md
49
+ .anthropic/
50
+ .cursor/
51
+ .cursorrules
52
+ .cursorignore
53
+ .cursorindexingignore
54
+ .aider*
55
+ .continue/
56
+ .windsurf/
57
+ .windsurfrules
58
+ .codeium/
59
+ .codeiumignore
60
+ .tabnine/
61
+ .cody/
62
+ .sourcegraph/
63
+ .gemini/
64
+ GEMINI.md
65
+ .agent/
66
+ .agents/
67
+ AGENTS.md
68
+ AGENT.md
69
+ .copilot/
70
+ copilot-instructions.md
71
+ .cline*
72
+ .clinerules
73
+ .roo/
74
+ .roomodes
75
+ .roorules
76
+ .specstory/
77
+ .junie/
78
+ .devin/
79
+ .opencode/
80
+ .crush/
81
+ .qodo/
82
+ .pearai/
83
+ .trae/
84
+ .kiro/
85
+ .amazonq/
86
+ .augment/
87
+ .augmentignore
88
+ .mcp.json
89
+ .mcp/
90
+ .llm/
91
+ .ai/
92
+ llm-notes/
93
+ prompts.local.*
94
+
95
+ # --- Editors and IDEs ------------------------------------------------------
96
+ .idea/
97
+ .vscode/
98
+ !.vscode/extensions.json
99
+ .vs/
100
+ .fleet/
101
+ .zed/
102
+ *.swp
103
+ *.swo
104
+ *~
105
+ .project
106
+ .classpath
107
+ .settings/
108
+ *.sublime-workspace
109
+ *.sublime-project
110
+
111
+ # --- Operating system ------------------------------------------------------
112
+ .DS_Store
113
+ .DS_Store?
114
+ ._*
115
+ .Spotlight-V100
116
+ .Trashes
117
+ Thumbs.db
118
+ ehthumbs.db
119
+ Desktop.ini
120
+ desktop.ini
121
+ $RECYCLE.BIN/
122
+
123
+ # --- Logs and temporary files ----------------------------------------------
124
+ *.log
125
+ logs/
126
+ tmp/
127
+ temp/
128
+ .tmp/
129
+ *.tmp
130
+ *.bak
131
+ *.orig
132
+ *.rej
133
+
134
+ # --- Python ----------------------------------------------------------------
135
+ __pycache__/
136
+ *.py[cod]
137
+ *$py.class
138
+ *.so
139
+ .Python
140
+ build/
141
+ develop-eggs/
142
+ dist/
143
+ downloads/
144
+ eggs/
145
+ .eggs/
146
+ lib64/
147
+ parts/
148
+ sdist/
149
+ wheels/
150
+ *.egg-info/
151
+ .installed.cfg
152
+ *.egg
153
+ MANIFEST
154
+ .venv/
155
+ venv/
156
+ env/
157
+ ENV/
158
+ .python-version
159
+ .pytest_cache/
160
+ .mypy_cache/
161
+ .dmypy.json
162
+ .pyre/
163
+ .ruff_cache/
164
+ .coverage
165
+ .coverage.*
166
+ coverage.xml
167
+ htmlcov/
168
+ .tox/
169
+ .nox/
170
+ .hypothesis/
171
+
172
+ # Рабочая копия спецификации, которую CI клонирует для сверки селекторов.
173
+ .funora-spec/
174
+
175
+ # Каталог, куда пишет инструмент наблюдений (funora.observe, ключ --out).
176
+ #
177
+ # Закрыт намеренно и наглухо. Инструмент ходит на площадку под живой сессией и
178
+ # кладёт сюда скелет страницы вместе с описанием происхождения. Скелет текстов
179
+ # не несёт, но каталог - рабочий: рядом с ним оказывается всё, что автор снял
180
+ # по дороге, включая сырую разметку, если он сохранил её руками для разбора.
181
+ #
182
+ # Правило проекта: сырая разметка авторизованных страниц в репозиторий не
183
+ # попадает никогда. Снимки, которые вправду нужны, кладутся в
184
+ # tests/fixtures/pages осознанно и поимённо, а не потому, что каталог не был
185
+ # закрыт.
186
+ observations/
187
+
188
+ # Собранный сайт руководства. Строится из docs/ и в репозиторий не кладётся.
189
+ site/
@@ -0,0 +1,157 @@
1
+ # Disclaimer
2
+
3
+ *The English text is authoritative. Русская версия - ниже.*
4
+
5
+ ## Not affiliated with FunPay
6
+
7
+ Funora is an independent, community-built project. It is **not affiliated with, endorsed by,
8
+ sponsored by, or connected to FunPay** or any of its operators. The name "FunPay" is used
9
+ only to describe what this software interoperates with.
10
+
11
+ ## It works against an interface that is not meant for it
12
+
13
+ There is no public, documented FunPay API. Funora talks to a private web interface: HTML
14
+ pages, form fields and internal JSON payloads that can change at any time, without notice
15
+ and without a version number. A change on the site can break Funora in ways that are not
16
+ always loud - a page may still load and simply return nothing.
17
+
18
+ Funora is built to detect that and fail visibly rather than quietly, but no such mechanism is
19
+ perfect.
20
+
21
+ ## The risk is yours
22
+
23
+ Automating a marketplace you do not own carries real consequences:
24
+
25
+ - your account may be suspended, temporarily or permanently;
26
+ - funds and pending payouts may be frozen while that is resolved;
27
+ - a parsing failure at the wrong moment can mean an order not delivered, a message not
28
+ answered, or a price set incorrectly.
29
+
30
+ The account is yours. The money is yours. **No disclaimer moves that risk anywhere else**,
31
+ and this software is provided without any warranty - see the [LICENSE](LICENSE).
32
+
33
+ ## What the published rules say, and what they do not
34
+
35
+ We quote FunPay's own rules so you can check every claim rather than trust ours.
36
+
37
+ Source: **[funpay.com/trade/info](https://funpay.com/trade/info)** (RU) ·
38
+ **[funpay.com/en/trade/info](https://funpay.com/en/trade/info)** (EN)
39
+
40
+ - **1.9** - *"Advertising, spamming, mass mailing to users."* Sanction: temporary or
41
+ permanent suspension of the account. This is why Funora has no broadcast or mass-messaging
42
+ feature and will not accept one.
43
+ - **2.2.9** - *"Продажа товаров и услуг, связанных со спамом и массовой рассылкой сообщений."*
44
+ (Selling goods and services related to spam and mass messaging.)
45
+ - **2.1.8** - *"The 'Automatic delivery' function must not be used for products that require
46
+ communication or additional services."* If you build automatic delivery on Funora,
47
+ respecting this is your responsibility: the framework cannot know what your product needs.
48
+ - **3.4.3** - *"Account suspension due to poor-quality services (for example, due to the
49
+ seller using bots or other software prohibited by the game publisher)."* Note the actual
50
+ subject of this clause: software prohibited **by the game publisher**, not automation of
51
+ FunPay itself.
52
+
53
+ **We did not find any published clause that either permits or forbids automating FunPay
54
+ itself.** We will not claim otherwise in either direction. Part of FunPay's documentation is
55
+ reachable only by signed-in users and we have not reviewed it. Read the rules and the
56
+ agreement that apply to your own account, and decide for yourself.
57
+
58
+ ## What Funora will not do
59
+
60
+ These are permanent non-goals, not features postponed to a later release:
61
+
62
+ - CAPTCHA solving or bypass;
63
+ - anti-detection or browser fingerprint spoofing;
64
+ - proxy rotation intended to evade rate limits or bans;
65
+ - mass messaging, broadcast helpers, or anything that makes spam convenient;
66
+ - automatic generation of reviews or ratings.
67
+
68
+ Pull requests implementing any of the above will be closed.
69
+
70
+ ## Your credentials and other people's data
71
+
72
+ A FunPay session key is not a scoped token - it is your entire account. Funora is designed to
73
+ keep it out of logs, exception text and diagnostics, but the guarantee ends at the edges of
74
+ this project: a third-party HTTP client with debug logging enabled, an APM agent, or an
75
+ in-process plugin can all read it. See
76
+ [SECURITY.md](https://github.com/Funora-Develop/.github/blob/main/SECURITY.md).
77
+
78
+ This software also processes data belonging to people who never installed it - your buyers'
79
+ messages, names and order details. Handle it accordingly.
80
+
81
+ ---
82
+
83
+ # Отказ от ответственности
84
+
85
+ *Английский текст является основным; русский приведён для удобства.*
86
+
87
+ ## Проект не аффилирован с FunPay
88
+
89
+ Funora - независимый проект, разрабатываемый сообществом. Он **не аффилирован с FunPay, не
90
+ одобрен ею, не спонсируется и никак с ней не связан**. Название «FunPay» используется только
91
+ для описания того, с чем это ПО взаимодействует.
92
+
93
+ ## Он работает с интерфейсом, который для этого не предназначен
94
+
95
+ Публичного документированного API у FunPay нет. Funora обращается к приватному
96
+ веб-интерфейсу: HTML-страницам, полям форм и внутренним JSON-ответам, которые могут
97
+ измениться в любой момент, без предупреждения и без номера версии. Изменение на сайте может
98
+ сломать Funora негромко - страница загрузится и просто вернёт пустоту.
99
+
100
+ Framework спроектирован так, чтобы обнаруживать это и падать заметно, а не молчать. Но
101
+ идеальных механизмов такого рода не бывает.
102
+
103
+ ## Риск несёте вы
104
+
105
+ У автоматизации чужой площадки есть реальные последствия:
106
+
107
+ - аккаунт могут заблокировать, временно или навсегда;
108
+ - средства и незавершённые выплаты могут быть заморожены на время разбирательства;
109
+ - сбой парсинга в неудачный момент означает невыданный заказ, неотвеченное сообщение или
110
+ неверно выставленную цену.
111
+
112
+ Аккаунт ваш. Деньги ваши. **Никакой отказ от ответственности не переносит этот риск на
113
+ кого-то другого**, и программа предоставляется без каких-либо гарантий - см. [LICENSE](LICENSE).
114
+
115
+ ## Что говорят опубликованные правила, а что - нет
116
+
117
+ Цитируем правила FunPay, чтобы вы могли проверить каждое утверждение, а не верить нам на слово.
118
+
119
+ Источник: **[funpay.com/trade/info](https://funpay.com/trade/info)**
120
+
121
+ - **1.9** - «Реклама, спам, массовая рассылка пользователям.» Санкция: временная или
122
+ постоянная блокировка аккаунта. Поэтому в Funora нет массовых рассылок и не будет.
123
+ - **2.2.9** - «Продажа товаров и услуг, связанных со спамом и массовой рассылкой сообщений.»
124
+ - **2.1.8** - «Функцию "Автоматическая выдача" запрещается использовать для товаров, при
125
+ продаже которых требуется общение или предоставление дополнительных услуг.» Если строите
126
+ автовыдачу на Funora, соблюдение этого - на вас: framework не знает, что требует ваш товар.
127
+ - **3.4.3** - «Блокировка аккаунта из-за некачественно оказываемой услуги (например, из-за
128
+ использования продавцом бота или другого запрещённого издателем игры ПО).» Обратите
129
+ внимание, о чём пункт: о ПО, запрещённом **издателем игры**, а не об автоматизации FunPay.
130
+
131
+ **Пункта, который прямо разрешал или прямо запрещал бы автоматизацию самой FunPay, в
132
+ опубликованных правилах мы не нашли.** Утверждать обратное - ни в ту, ни в другую сторону -
133
+ не будем. Часть документации площадки доступна только авторизованным пользователям, и мы её
134
+ не просматривали. Прочитайте правила и соглашение, применимые к вашему аккаунту, и решите сами.
135
+
136
+ ## Чего Funora делать не будет
137
+
138
+ Это постоянные не-цели, а не отложенные функции:
139
+
140
+ - решение или обход CAPTCHA;
141
+ - антидетект и подмена отпечатка браузера;
142
+ - ротация прокси для обхода ограничений или блокировок;
143
+ - массовые рассылки и всё, что делает спам удобным;
144
+ - автоматическая генерация отзывов и оценок.
145
+
146
+ Pull request с любым из перечисленного будет закрыт.
147
+
148
+ ## Ваши учётные данные и чужие данные
149
+
150
+ Сессионный ключ FunPay - это не токен с ограниченными правами, это доступ ко всему аккаунту.
151
+ Funora проектируется так, чтобы он не попадал в логи, текст исключений и диагностику, но
152
+ гарантия заканчивается на границе проекта: сторонний HTTP-клиент с включённым отладочным
153
+ логированием, APM-агент или плагин внутри процесса прочитают его. См.
154
+ [SECURITY.md](https://github.com/Funora-Develop/.github/blob/main/SECURITY.md).
155
+
156
+ Эта программа также обрабатывает данные людей, которые её не устанавливали, - сообщения,
157
+ имена и детали заказов ваших покупателей. Обращайтесь с ними соответственно.