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.
- funora-0.0.1.dev2/.gitattributes +3 -0
- funora-0.0.1.dev2/.github/dependabot.yml +13 -0
- funora-0.0.1.dev2/.github/workflows/ci.yml +204 -0
- funora-0.0.1.dev2/.github/workflows/release.yml +75 -0
- funora-0.0.1.dev2/.gitignore +189 -0
- funora-0.0.1.dev2/DISCLAIMER.md +157 -0
- funora-0.0.1.dev2/LICENSE +201 -0
- funora-0.0.1.dev2/PKG-INFO +294 -0
- funora-0.0.1.dev2/README.en.md +245 -0
- funora-0.0.1.dev2/README.md +262 -0
- funora-0.0.1.dev2/docs/architecture.md +893 -0
- funora-0.0.1.dev2/docs/completeness.md +148 -0
- funora-0.0.1.dev2/docs/guide/account.md +245 -0
- funora-0.0.1.dev2/docs/guide/async.md +85 -0
- funora-0.0.1.dev2/docs/guide/bot.md +488 -0
- funora-0.0.1.dev2/docs/guide/budget.md +166 -0
- funora-0.0.1.dev2/docs/guide/catalog.md +70 -0
- funora-0.0.1.dev2/docs/guide/chats.md +264 -0
- funora-0.0.1.dev2/docs/guide/errors.md +97 -0
- funora-0.0.1.dev2/docs/guide/events.md +203 -0
- funora-0.0.1.dev2/docs/guide/first-run.md +110 -0
- funora-0.0.1.dev2/docs/guide/install.md +92 -0
- funora-0.0.1.dev2/docs/guide/lots.md +549 -0
- funora-0.0.1.dev2/docs/guide/market.md +394 -0
- funora-0.0.1.dev2/docs/guide/observed.md +118 -0
- funora-0.0.1.dev2/docs/guide/orders.md +325 -0
- funora-0.0.1.dev2/docs/guide/pages.md +111 -0
- funora-0.0.1.dev2/docs/guide/secret.md +121 -0
- funora-0.0.1.dev2/docs/guide/sending.md +197 -0
- funora-0.0.1.dev2/docs/index.md +77 -0
- funora-0.0.1.dev2/docs/limits.md +342 -0
- funora-0.0.1.dev2/docs/observation-plan.md +575 -0
- funora-0.0.1.dev2/docs/observations.md +561 -0
- funora-0.0.1.dev2/docs/observing.md +259 -0
- funora-0.0.1.dev2/docs/pre-alpha.md +80 -0
- funora-0.0.1.dev2/docs/protocol-questions.md +203 -0
- funora-0.0.1.dev2/docs/validation.md +723 -0
- funora-0.0.1.dev2/mkdocs.yml +121 -0
- funora-0.0.1.dev2/pyproject.toml +86 -0
- funora-0.0.1.dev2/src/funora/__init__.py +265 -0
- funora-0.0.1.dev2/src/funora/_account.py +661 -0
- funora-0.0.1.dev2/src/funora/_aclient.py +1484 -0
- funora-0.0.1.dev2/src/funora/_budget.py +579 -0
- funora-0.0.1.dev2/src/funora/_calc.py +182 -0
- funora-0.0.1.dev2/src/funora/_canonical.py +235 -0
- funora-0.0.1.dev2/src/funora/_catalog.py +473 -0
- funora-0.0.1.dev2/src/funora/_chat_history.py +367 -0
- funora-0.0.1.dev2/src/funora/_chats.py +392 -0
- funora-0.0.1.dev2/src/funora/_chips.py +403 -0
- funora-0.0.1.dev2/src/funora/_classify.py +466 -0
- funora-0.0.1.dev2/src/funora/_client.py +1490 -0
- funora-0.0.1.dev2/src/funora/_currency_switch.py +130 -0
- funora-0.0.1.dev2/src/funora/_cursor.py +120 -0
- funora-0.0.1.dev2/src/funora/_delivered.py +233 -0
- funora-0.0.1.dev2/src/funora/_diff.py +752 -0
- funora-0.0.1.dev2/src/funora/_engine.py +4795 -0
- funora-0.0.1.dev2/src/funora/_extract.py +124 -0
- funora-0.0.1.dev2/src/funora/_field_schema.py +112 -0
- funora-0.0.1.dev2/src/funora/_fileio.py +58 -0
- funora-0.0.1.dev2/src/funora/_gate.py +69 -0
- funora-0.0.1.dev2/src/funora/_hops.py +101 -0
- funora-0.0.1.dev2/src/funora/_host.py +120 -0
- funora-0.0.1.dev2/src/funora/_identity.py +284 -0
- funora-0.0.1.dev2/src/funora/_json.py +31 -0
- funora-0.0.1.dev2/src/funora/_listen.py +312 -0
- funora-0.0.1.dev2/src/funora/_lot_form.py +331 -0
- funora-0.0.1.dev2/src/funora/_market.py +406 -0
- funora-0.0.1.dev2/src/funora/_matching.py +147 -0
- funora-0.0.1.dev2/src/funora/_money.py +279 -0
- funora-0.0.1.dev2/src/funora/_monitoring.py +396 -0
- funora-0.0.1.dev2/src/funora/_observed.py +237 -0
- funora-0.0.1.dev2/src/funora/_order.py +552 -0
- funora-0.0.1.dev2/src/funora/_order_details.py +281 -0
- funora-0.0.1.dev2/src/funora/_orders.py +807 -0
- funora-0.0.1.dev2/src/funora/_outbound.py +453 -0
- funora-0.0.1.dev2/src/funora/_own_lots.py +301 -0
- funora-0.0.1.dev2/src/funora/_poll.py +410 -0
- funora-0.0.1.dev2/src/funora/_price_audit.py +281 -0
- funora-0.0.1.dev2/src/funora/_proxies.py +232 -0
- funora-0.0.1.dev2/src/funora/_raise.py +150 -0
- funora-0.0.1.dev2/src/funora/_refund.py +102 -0
- funora-0.0.1.dev2/src/funora/_result.py +157 -0
- funora-0.0.1.dev2/src/funora/_retry.py +213 -0
- funora-0.0.1.dev2/src/funora/_review_write.py +138 -0
- funora-0.0.1.dev2/src/funora/_reviews.py +584 -0
- funora-0.0.1.dev2/src/funora/_runner.py +651 -0
- funora-0.0.1.dev2/src/funora/_secret.py +385 -0
- funora-0.0.1.dev2/src/funora/_showcase.py +362 -0
- funora-0.0.1.dev2/src/funora/_signals.py +375 -0
- funora-0.0.1.dev2/src/funora/_skeleton.py +752 -0
- funora-0.0.1.dev2/src/funora/_snapshot.py +276 -0
- funora-0.0.1.dev2/src/funora/_state.py +279 -0
- funora-0.0.1.dev2/src/funora/_stock.py +32 -0
- funora-0.0.1.dev2/src/funora/_thread.py +574 -0
- funora-0.0.1.dev2/src/funora/_transport.py +1023 -0
- funora-0.0.1.dev2/src/funora/_updates.py +292 -0
- funora-0.0.1.dev2/src/funora/_verdicts.py +91 -0
- funora-0.0.1.dev2/src/funora/_viewing.py +143 -0
- funora-0.0.1.dev2/src/funora/_watch.py +825 -0
- funora-0.0.1.dev2/src/funora/_watch_state.py +237 -0
- funora-0.0.1.dev2/src/funora/_whoami.py +546 -0
- funora-0.0.1.dev2/src/funora/bot/__init__.py +52 -0
- funora-0.0.1.dev2/src/funora/bot/_delivery.py +341 -0
- funora-0.0.1.dev2/src/funora/bot/_outbox.py +261 -0
- funora-0.0.1.dev2/src/funora/bot/_runtime.py +447 -0
- funora-0.0.1.dev2/src/funora/bot/_spool.py +534 -0
- funora-0.0.1.dev2/src/funora/budget.py +311 -0
- funora-0.0.1.dev2/src/funora/capabilities.py +297 -0
- funora-0.0.1.dev2/src/funora/conformance.py +758 -0
- funora-0.0.1.dev2/src/funora/contract.py +73 -0
- funora-0.0.1.dev2/src/funora/errors.py +996 -0
- funora-0.0.1.dev2/src/funora/events.py +189 -0
- funora-0.0.1.dev2/src/funora/extraction.py +420 -0
- funora-0.0.1.dev2/src/funora/observe.py +560 -0
- funora-0.0.1.dev2/src/funora/operations.py +671 -0
- funora-0.0.1.dev2/src/funora/py.typed +0 -0
- funora-0.0.1.dev2/src/funora/reconciliation.py +51 -0
- funora-0.0.1.dev2/src/funora/response_classes.py +155 -0
- funora-0.0.1.dev2/src/funora/retry.py +238 -0
- funora-0.0.1.dev2/src/funora/send_outcome.py +78 -0
- funora-0.0.1.dev2/src/funora/skeleton_format.py +77 -0
- funora-0.0.1.dev2/tests/_consent_probe.py +69 -0
- funora-0.0.1.dev2/tests/_schema_check.py +329 -0
- funora-0.0.1.dev2/tests/conftest.py +56 -0
- funora-0.0.1.dev2/tests/fixtures/completeness.json +385 -0
- funora-0.0.1.dev2/tests/fixtures/network/README.md +36 -0
- funora-0.0.1.dev2/tests/fixtures/network/network.lot-save-form.json +94 -0
- funora-0.0.1.dev2/tests/fixtures/network/network.promote.json +45 -0
- funora-0.0.1.dev2/tests/fixtures/pages/README.md +134 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance-end.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance-end.logged.ru.skeleton.txt +2443 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance-first.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance-first.logged.ru.skeleton.txt +1561 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance.logged.ru.skeleton.txt +1644 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance.v9.logged.ru.provenance.json +20 -0
- funora-0.0.1.dev2/tests/fixtures/pages/account-balance.v9.logged.ru.skeleton.txt +1629 -0
- funora-0.0.1.dev2/tests/fixtures/pages/catalog-fields.logged.ru.provenance.json +27 -0
- funora-0.0.1.dev2/tests/fixtures/pages/catalog-fields.logged.ru.skeleton.txt +4567 -0
- funora-0.0.1.dev2/tests/fixtures/pages/catalog-search.guest.ru.provenance.json +12 -0
- funora-0.0.1.dev2/tests/fixtures/pages/catalog-search.guest.ru.skeleton.txt +234 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.logged.ru.skeleton.txt +1509 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.v8.logged.ru.provenance.json +18 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat-thread.v8.logged.ru.skeleton.txt +1689 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chat.logged.ru.skeleton.txt +1170 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chips.trimmed.guest.ru.provenance.json +40 -0
- funora-0.0.1.dev2/tests/fixtures/pages/chips.trimmed.guest.ru.skeleton.txt +1329 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lot-edit-stock.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lot-edit-stock.logged.ru.skeleton.txt +588 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lot-edit.logged.ru.provenance.json +26 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lot-edit.logged.ru.skeleton.txt +654 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade-stock.logged.ru.provenance.json +15 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade-stock.logged.ru.skeleton.txt +743 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.logged.ru.provenance.json +23 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.logged.ru.skeleton.txt +987 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.off.logged.ru.provenance.json +20 -0
- funora-0.0.1.dev2/tests/fixtures/pages/lots-trade.off.logged.ru.skeleton.txt +579 -0
- funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.guest.ru.provenance.json +40 -0
- funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.guest.ru.skeleton.txt +3612 -0
- funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.logged.ru.provenance.json +37 -0
- funora-0.0.1.dev2/tests/fixtures/pages/market-offers.trimmed.logged.ru.skeleton.txt +5953 -0
- funora-0.0.1.dev2/tests/fixtures/pages/order.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/order.logged.ru.skeleton.txt +732 -0
- funora-0.0.1.dev2/tests/fixtures/pages/order.v9.logged.ru.provenance.json +20 -0
- funora-0.0.1.dev2/tests/fixtures/pages/order.v9.logged.ru.skeleton.txt +856 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered-empty.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered-empty.logged.ru.skeleton.txt +3015 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-filtered.logged.ru.skeleton.txt +3600 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.empty.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.empty.ru.skeleton.txt +3090 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.guest.ru.provenance.json +18 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.guest.ru.skeleton.txt +263 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.logged.ru.skeleton.txt +855 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.v8.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/orders-trade.v8.logged.ru.skeleton.txt +4727 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-first.guest.ru.provenance.json +12 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-first.guest.ru.skeleton.txt +8326 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-last.guest.ru.provenance.json +12 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-last.guest.ru.skeleton.txt +176 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-next.guest.ru.provenance.json +12 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-next.guest.ru.skeleton.txt +1256 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-empty.guest.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-empty.guest.ru.skeleton.txt +122 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-end.guest.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-end.guest.ru.skeleton.txt +515 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-first.guest.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-first.guest.ru.skeleton.txt +1243 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-next.guest.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/reviews-rating-next.guest.ru.skeleton.txt +1256 -0
- funora-0.0.1.dev2/tests/fixtures/pages/root.logged.ru.provenance.json +17 -0
- funora-0.0.1.dev2/tests/fixtures/pages/root.logged.ru.skeleton.txt +32883 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user-foreign.logged.ru.provenance.json +34 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user-foreign.logged.ru.skeleton.txt +2430 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user.logged.ru.provenance.json +14 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user.logged.ru.skeleton.txt +4181 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user.v9.logged.ru.provenance.json +20 -0
- funora-0.0.1.dev2/tests/fixtures/pages/user.v9.logged.ru.skeleton.txt +4446 -0
- funora-0.0.1.dev2/tests/fixtures/probes/README.md +43 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.account-balance.json +72 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.chat.json +26 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-n.json +22 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.codes-carrier-2.json +100 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.codes-carrier.json +100 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders-trade.json +102 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.codes.json +74 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.dollars.json +41 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.euro.json +41 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.json +41 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.rub-code.json +74 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.rubles.json +41 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.orders.switcher.json +41 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.root.json +11 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.dollars.json +39 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.euro.json +39 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.json +38 -0
- funora-0.0.1.dev2/tests/fixtures/probes/currency.users-n.rubles.json +39 -0
- funora-0.0.1.dev2/tests/fixtures/probes/market-price-display.guest.json +99 -0
- funora-0.0.1.dev2/tests/fixtures/probes/own-stock.logged.json +26 -0
- funora-0.0.1.dev2/tests/fixtures/probes/showcase-stock.guest.json +19 -0
- funora-0.0.1.dev2/tests/test_absence_claims.py +222 -0
- funora-0.0.1.dev2/tests/test_absence_semantics.py +97 -0
- funora-0.0.1.dev2/tests/test_account.py +284 -0
- funora-0.0.1.dev2/tests/test_account_budgets.py +43 -0
- funora-0.0.1.dev2/tests/test_aclient.py +538 -0
- funora-0.0.1.dev2/tests/test_action_budget.py +169 -0
- funora-0.0.1.dev2/tests/test_attribute_reading.py +91 -0
- funora-0.0.1.dev2/tests/test_auto_delivery.py +908 -0
- funora-0.0.1.dev2/tests/test_borrowed_writes_ask_consent.py +205 -0
- funora-0.0.1.dev2/tests/test_bot.py +823 -0
- funora-0.0.1.dev2/tests/test_budget.py +233 -0
- funora-0.0.1.dev2/tests/test_budget_concurrency.py +39 -0
- funora-0.0.1.dev2/tests/test_budget_exact.py +105 -0
- funora-0.0.1.dev2/tests/test_buyer_viewing.py +382 -0
- funora-0.0.1.dev2/tests/test_cache_codegen.py +44 -0
- funora-0.0.1.dev2/tests/test_calc.py +381 -0
- funora-0.0.1.dev2/tests/test_canonical.py +418 -0
- funora-0.0.1.dev2/tests/test_capability_profile.py +256 -0
- funora-0.0.1.dev2/tests/test_capture_tool.py +2259 -0
- funora-0.0.1.dev2/tests/test_catalog.py +375 -0
- funora-0.0.1.dev2/tests/test_catalog_cache.py +99 -0
- funora-0.0.1.dev2/tests/test_catalog_search.py +272 -0
- funora-0.0.1.dev2/tests/test_chat_history.py +577 -0
- funora-0.0.1.dev2/tests/test_chats.py +285 -0
- funora-0.0.1.dev2/tests/test_check_skeleton_tool.py +106 -0
- funora-0.0.1.dev2/tests/test_chips.py +382 -0
- funora-0.0.1.dev2/tests/test_chips_numbers.py +269 -0
- funora-0.0.1.dev2/tests/test_classify.py +982 -0
- funora-0.0.1.dev2/tests/test_client.py +898 -0
- funora-0.0.1.dev2/tests/test_client_boundaries.py +246 -0
- funora-0.0.1.dev2/tests/test_completeness.py +239 -0
- funora-0.0.1.dev2/tests/test_conformance.py +138 -0
- funora-0.0.1.dev2/tests/test_conformance_protocol.py +232 -0
- funora-0.0.1.dev2/tests/test_conversion_failure.py +112 -0
- funora-0.0.1.dev2/tests/test_core_boundaries.py +139 -0
- funora-0.0.1.dev2/tests/test_currency_code.py +269 -0
- funora-0.0.1.dev2/tests/test_currency_switch.py +349 -0
- funora-0.0.1.dev2/tests/test_declared_and_read.py +387 -0
- funora-0.0.1.dev2/tests/test_dedup_lru.py +56 -0
- funora-0.0.1.dev2/tests/test_delivery_end_to_end.py +378 -0
- funora-0.0.1.dev2/tests/test_diff.py +882 -0
- funora-0.0.1.dev2/tests/test_dispatch_concurrent.py +445 -0
- funora-0.0.1.dev2/tests/test_distribution_gate.py +239 -0
- funora-0.0.1.dev2/tests/test_docs.py +607 -0
- funora-0.0.1.dev2/tests/test_docs_numbers.py +278 -0
- funora-0.0.1.dev2/tests/test_durable_recovery.py +280 -0
- funora-0.0.1.dev2/tests/test_engine_boundaries.py +343 -0
- funora-0.0.1.dev2/tests/test_errors.py +56 -0
- funora-0.0.1.dev2/tests/test_event_schemas.py +509 -0
- funora-0.0.1.dev2/tests/test_field_schema.py +95 -0
- funora-0.0.1.dev2/tests/test_fixtures.py +577 -0
- funora-0.0.1.dev2/tests/test_foreign_profile.py +168 -0
- funora-0.0.1.dev2/tests/test_generated.py +545 -0
- funora-0.0.1.dev2/tests/test_health.py +214 -0
- funora-0.0.1.dev2/tests/test_hops.py +142 -0
- funora-0.0.1.dev2/tests/test_host.py +178 -0
- funora-0.0.1.dev2/tests/test_http_transport_contract.py +185 -0
- funora-0.0.1.dev2/tests/test_listen.py +576 -0
- funora-0.0.1.dev2/tests/test_locale.py +167 -0
- funora-0.0.1.dev2/tests/test_lot_capabilities.py +168 -0
- funora-0.0.1.dev2/tests/test_lot_edit.py +170 -0
- funora-0.0.1.dev2/tests/test_lot_form_preservation.py +76 -0
- funora-0.0.1.dev2/tests/test_lot_revision.py +270 -0
- funora-0.0.1.dev2/tests/test_lot_visibility.py +463 -0
- funora-0.0.1.dev2/tests/test_mark_read.py +353 -0
- funora-0.0.1.dev2/tests/test_market.py +330 -0
- funora-0.0.1.dev2/tests/test_market_money.py +190 -0
- funora-0.0.1.dev2/tests/test_market_offer_id.py +137 -0
- funora-0.0.1.dev2/tests/test_market_operation.py +442 -0
- funora-0.0.1.dev2/tests/test_market_snapshot.py +317 -0
- funora-0.0.1.dev2/tests/test_message_direction.py +493 -0
- funora-0.0.1.dev2/tests/test_model_containers.py +67 -0
- funora-0.0.1.dev2/tests/test_model_schemas.py +519 -0
- funora-0.0.1.dev2/tests/test_money.py +188 -0
- funora-0.0.1.dev2/tests/test_monitoring.py +587 -0
- funora-0.0.1.dev2/tests/test_monitoring_contract.py +79 -0
- funora-0.0.1.dev2/tests/test_monitoring_history.py +280 -0
- funora-0.0.1.dev2/tests/test_monitoring_timing.py +251 -0
- funora-0.0.1.dev2/tests/test_observe.py +489 -0
- funora-0.0.1.dev2/tests/test_observe_boundaries.py +133 -0
- funora-0.0.1.dev2/tests/test_observe_compare.py +252 -0
- funora-0.0.1.dev2/tests/test_observe_plan.py +107 -0
- funora-0.0.1.dev2/tests/test_observed.py +256 -0
- funora-0.0.1.dev2/tests/test_operation_codegen.py +102 -0
- funora-0.0.1.dev2/tests/test_operation_errors.py +138 -0
- funora-0.0.1.dev2/tests/test_order.py +394 -0
- funora-0.0.1.dev2/tests/test_order_details.py +451 -0
- funora-0.0.1.dev2/tests/test_order_filters.py +141 -0
- funora-0.0.1.dev2/tests/test_order_money.py +284 -0
- funora-0.0.1.dev2/tests/test_order_states.py +235 -0
- funora-0.0.1.dev2/tests/test_orders.py +795 -0
- funora-0.0.1.dev2/tests/test_outbound_durability.py +631 -0
- funora-0.0.1.dev2/tests/test_outbound_governor.py +396 -0
- funora-0.0.1.dev2/tests/test_outbound_governor_vectors.py +143 -0
- funora-0.0.1.dev2/tests/test_outbound_restore.py +174 -0
- funora-0.0.1.dev2/tests/test_own_lots.py +377 -0
- funora-0.0.1.dev2/tests/test_own_stock.py +203 -0
- funora-0.0.1.dev2/tests/test_pagination_cursor.py +359 -0
- funora-0.0.1.dev2/tests/test_parser_boundaries.py +222 -0
- funora-0.0.1.dev2/tests/test_parser_failures.py +169 -0
- funora-0.0.1.dev2/tests/test_persistence_failures.py +144 -0
- funora-0.0.1.dev2/tests/test_poll.py +344 -0
- funora-0.0.1.dev2/tests/test_portability.py +144 -0
- funora-0.0.1.dev2/tests/test_price_audit.py +556 -0
- funora-0.0.1.dev2/tests/test_price_audit_restore.py +151 -0
- funora-0.0.1.dev2/tests/test_printed_commands.py +254 -0
- funora-0.0.1.dev2/tests/test_promote.py +353 -0
- funora-0.0.1.dev2/tests/test_proxies.py +306 -0
- funora-0.0.1.dev2/tests/test_public_transport.py +269 -0
- funora-0.0.1.dev2/tests/test_rate_budget_vectors.py +241 -0
- funora-0.0.1.dev2/tests/test_reconciliation.py +366 -0
- funora-0.0.1.dev2/tests/test_recovery_boundaries.py +148 -0
- funora-0.0.1.dev2/tests/test_refund.py +409 -0
- funora-0.0.1.dev2/tests/test_release_gate.py +31 -0
- funora-0.0.1.dev2/tests/test_request_classes.py +301 -0
- funora-0.0.1.dev2/tests/test_result.py +106 -0
- funora-0.0.1.dev2/tests/test_resume_vectors.py +269 -0
- funora-0.0.1.dev2/tests/test_retry.py +402 -0
- funora-0.0.1.dev2/tests/test_retry_reason_reaches_the_caller.py +89 -0
- funora-0.0.1.dev2/tests/test_retry_vectors.py +85 -0
- funora-0.0.1.dev2/tests/test_review_filters.py +258 -0
- funora-0.0.1.dev2/tests/test_reviews.py +453 -0
- funora-0.0.1.dev2/tests/test_reviews_pagination.py +153 -0
- funora-0.0.1.dev2/tests/test_reviews_write.py +430 -0
- funora-0.0.1.dev2/tests/test_revision_source.py +409 -0
- funora-0.0.1.dev2/tests/test_runner_context.py +296 -0
- funora-0.0.1.dev2/tests/test_runner_validation.py +214 -0
- funora-0.0.1.dev2/tests/test_runtime_failures.py +161 -0
- funora-0.0.1.dev2/tests/test_secret.py +314 -0
- funora-0.0.1.dev2/tests/test_selectors_are_generated.py +262 -0
- funora-0.0.1.dev2/tests/test_send_image.py +441 -0
- funora-0.0.1.dev2/tests/test_send_outcome.py +305 -0
- funora-0.0.1.dev2/tests/test_send_text_operation.py +494 -0
- funora-0.0.1.dev2/tests/test_service_reads.py +119 -0
- funora-0.0.1.dev2/tests/test_showcase.py +338 -0
- funora-0.0.1.dev2/tests/test_showcase_stock.py +168 -0
- funora-0.0.1.dev2/tests/test_signals.py +278 -0
- funora-0.0.1.dev2/tests/test_skeleton.py +572 -0
- funora-0.0.1.dev2/tests/test_skeleton_format.py +261 -0
- funora-0.0.1.dev2/tests/test_skeleton_paths.py +181 -0
- funora-0.0.1.dev2/tests/test_spec_coverage.py +620 -0
- funora-0.0.1.dev2/tests/test_spec_selectors.py +709 -0
- funora-0.0.1.dev2/tests/test_spool.py +468 -0
- funora-0.0.1.dev2/tests/test_state.py +374 -0
- funora-0.0.1.dev2/tests/test_state_paths.py +150 -0
- funora-0.0.1.dev2/tests/test_state_without_operations.py +308 -0
- funora-0.0.1.dev2/tests/test_thread.py +528 -0
- funora-0.0.1.dev2/tests/test_transport.py +633 -0
- funora-0.0.1.dev2/tests/test_transport_async.py +259 -0
- funora-0.0.1.dev2/tests/test_update_price.py +419 -0
- funora-0.0.1.dev2/tests/test_updates_channel.py +339 -0
- funora-0.0.1.dev2/tests/test_verdicts.py +194 -0
- funora-0.0.1.dev2/tests/test_waiting_rule.py +205 -0
- funora-0.0.1.dev2/tests/test_watch.py +2393 -0
- funora-0.0.1.dev2/tests/test_watch_contract.py +41 -0
- funora-0.0.1.dev2/tests/test_watch_outbox.py +541 -0
- funora-0.0.1.dev2/tests/test_whoami.py +430 -0
- funora-0.0.1.dev2/tests/test_withdrawal_options.py +422 -0
- funora-0.0.1.dev2/tests/test_write_admission.py +114 -0
- funora-0.0.1.dev2/tools/capture.js +1685 -0
- funora-0.0.1.dev2/tools/capture.py +527 -0
- funora-0.0.1.dev2/tools/check_distribution.py +177 -0
- funora-0.0.1.dev2/tools/check_release.py +28 -0
- funora-0.0.1.dev2/tools/check_skeleton.py +266 -0
- funora-0.0.1.dev2/tools/codegen.py +3280 -0
- funora-0.0.1.dev2/tools/completeness.py +264 -0
- funora-0.0.1.dev2/tools/observe_plan.py +273 -0
- funora-0.0.1.dev2/tools/trim_skeleton.py +132 -0
|
@@ -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
|
+
имена и детали заказов ваших покупателей. Обращайтесь с ними соответственно.
|