graphrefly 0.4.0__tar.gz → 0.5.0__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.
- {graphrefly-0.4.0 → graphrefly-0.5.0}/CHANGELOG.md +13 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/PKG-INFO +1 -1
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/optimizations.md +9 -2
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/roadmap.md +9 -9
- {graphrefly-0.4.0 → graphrefly-0.5.0}/pyproject.toml +3 -1
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/__init__.py +3 -0
- graphrefly-0.5.0/src/graphrefly/core/cancellation.py +91 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/__init__.py +36 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/adapters.py +461 -170
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/ai.py +2 -5
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_adapters_ingest.py +12 -12
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_adapters_storage.py +401 -18
- graphrefly-0.5.0/website/src/components/Header.astro +325 -0
- graphrefly-0.4.0/website/src/components/Header.astro +0 -157
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.claude/skills/dev-dispatch/SKILL.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.claude/skills/parity/SKILL.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.claude/skills/qa/SKILL.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.gemini/skills/dev-dispatch/SKILL.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.gemini/skills/parity/SKILL.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.github/workflows/pages.yml +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.github/workflows/release.yml +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.gitignore +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/.mise.toml +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/CLAUDE.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/CONTRIBUTING.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/GEMINI.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/LICENSE +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/README.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/DESIGN-ARCHIVE-INDEX.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-access-control-actor-guard.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-cross-repo-implementation-audit.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-demo-test-strategy.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-graphrefly-spec-design.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-serialization-memory-footprint.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-tier2-parity-nonlocal-forward-inner.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/archive/docs/SESSION-universal-reduction-layer.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/benchmarks/py-baseline.json +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/ADAPTER-CONTRACT.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/benchmark.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/docs-guidance.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/docs/test-guidance.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/examples/README.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/examples/basic_counter.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/llms.txt +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/compat/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/compat/async_utils.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/compat/asyncio_runner.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/compat/trio_runner.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/clock.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/dynamic_node.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/guard.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/meta.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/node.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/protocol.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/runner.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/subgraph_locks.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/sugar.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/core/versioning.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/backoff.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/backpressure.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/checkpoint.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/composite.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/cron.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/data_structures.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/resilience.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/sources.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/tier1.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/extra/tier2.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/graph/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/graph/graph.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/integrations/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/integrations/fastapi.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/cqrs.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/memory.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/messaging.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/orchestration.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/reactive_layout/__init__.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/reactive_layout/measurement_adapters.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/reactive_layout/reactive_block_layout.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/patterns/reactive_layout/reactive_layout.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/src/graphrefly/py.typed +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/bench_core.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/conftest.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_adapter_contract.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_backpressure.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_concurrency.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_core.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_dynamic_node.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_edge_cases.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_composite.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_data_structures.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_resilience.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_sources.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_sources_http.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_tier1.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_extra_tier2.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_fastapi.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_graph.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_guard.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_measurement_adapters.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_patterns_ai.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_patterns_cqrs.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_patterns_memory.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_patterns_messaging.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_patterns_orchestration.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_perf_smoke.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_protocol.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_reactive_block_layout.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_reactive_layout.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_regressions.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_runner.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_smoke.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_sugar.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/tests/test_versioning.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/.gitignore +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/README.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/astro.config.mjs +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/content.config.ts +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/package.json +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/pnpm-lock.yaml +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/public/llms.txt +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/py-api-sidebar.mjs +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/scripts/gen_api_docs.py +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/scripts/sync-docs.mjs +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/components/GraphreflyHero.astro +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/components/MobileMenuFooter.astro +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/components/PyodidePlayground.tsx +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/components/Sidebar.astro +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/components/SiteTitle.astro +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/BackoffPreset.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/BackoffStrategy.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/CheckpointAdapter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/CircuitBreaker.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/CircuitOpenError.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/DeferWhen.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/DictCheckpointAdapter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/DistillBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/EmitStrategy.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/Extraction.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/FileCheckpointAdapter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/HttpBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/JitterMode.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/MemoryCheckpointAdapter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/Message.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/MessageType.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/Messages.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/NodeActions.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/NodeFn.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/NodeImpl.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/NodeStatus.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/PipeOperator.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/PubSubHub.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/ReactiveIndexBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/ReactiveListBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/ReactiveLogBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/ReactiveMapBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/SqliteCheckpointAdapter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/SubscribeHints.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/TokenBucket.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/VerifiableBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/Versioned.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/WithBreakerBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/WithStatusBundle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/audit.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/batch.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/buffer.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/buffer_count.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/buffer_time.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/cached.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/checkpoint_node_value.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/circuit_breaker.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/combine.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/concat.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/concat_map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/constant.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/debounce.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/decorrelated_jitter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/delay.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/derived.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/dispatch_messages.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/distill.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/distinct_until_changed.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/effect.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/element_at.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/emit_with_batch.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/empty.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/exhaust_map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/exponential.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/fibonacci.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/filter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/find.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/first.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/first_value_from.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/flat_map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/for_each.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_any.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_async_iter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_awaitable.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_cron.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_event_emitter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_fs_watch.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_git_hook.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_http.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_iter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_mcp.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_timer.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_webhook.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/from_websocket.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/gate.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/index.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/interval.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/is_batching.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/is_phase2_message.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/is_terminal_message.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/last.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/linear.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/log_slice.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/merge.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/message_tier.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/never.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/node.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/of.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/operator.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/pairwise.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/partition_for_batch.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/pausable.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/pipe.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/producer.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/propagates_to_meta.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/pubsub.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/race.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/rate_limiter.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/reactive_index.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/reactive_list.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/reactive_log.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/reactive_map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/reduce.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/repeat.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/replay.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/rescue.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/resolve_backoff_preset.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/restore_graph_checkpoint.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/retry.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/sample.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/save_graph_checkpoint.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/scan.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/share.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/skip.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/start_with.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/state.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/subscribe.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/switch_map.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/take.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/take_until.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/take_while.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/tap.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/throttle.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/throw_error.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/timeout.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/to_array.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/to_list.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/to_sse.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/to_websocket.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/token_bucket.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/token_tracker.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/verifiable.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/window.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/window_count.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/window_time.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/with_breaker.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/with_latest_from.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/with_max_attempts.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/with_status.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/api/zip.md +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/index.mdx +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content/docs/lab/python.mdx +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/content.config.ts +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/env.d.ts +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/src/styles/custom.css +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/theme-prototypes.html +0 -0
- {graphrefly-0.4.0 → graphrefly-0.5.0}/website/tsconfig.json +0 -0
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.5.0 (2026-04-05)
|
|
6
|
+
|
|
7
|
+
### Chores
|
|
8
|
+
|
|
9
|
+
- Fix mobile nav
|
|
10
|
+
([`a372c40`](https://github.com/graphrefly/graphrefly-py/commit/a372c40274d1cd7ec57b69414ada245605177334))
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- Address optimization items
|
|
15
|
+
([`8911fd4`](https://github.com/graphrefly/graphrefly-py/commit/8911fd41a177fe9cfaa7e8932f24f2c2af44135a))
|
|
16
|
+
|
|
17
|
+
|
|
5
18
|
## v0.4.0 (2026-04-04)
|
|
6
19
|
|
|
7
20
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphrefly
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Reactive graph protocol for human + LLM co-operation. Composable nodes, glitch-free diamond resolution, two-phase push, durable streaming. Zero dependencies.
|
|
5
5
|
Project-URL: Homepage, https://py.graphrefly.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/graphrefly/graphrefly-py
|
|
@@ -119,13 +119,20 @@ Union-find over node identity merges components when nodes list dependencies at
|
|
|
119
119
|
- **`Graph.signal`:** `GuardDenied` aborts the walk on first rejection; nodes visited earlier in the traversal may already have received the message (non-transactional). Prefer guards that allow **system** `signal` when using `destroy()` / lifecycle if you need guaranteed completion.
|
|
120
120
|
- **`Graph.remove` / `_teardown_mounted_graph`:** after the registry drops a name, primary `TEARDOWN` uses `Node.down(..., internal=True)` so a guard cannot reject teardown **after** unregister (would orphan the node instance).
|
|
121
121
|
|
|
122
|
+
## Open design decisions
|
|
123
|
+
|
|
124
|
+
- **~~Sink adapter silent error swallowing (Phase 5.2b–5.2d, noted 2026-04-04, resolved 2026-04-04):~~** All per-record sinks now return a `SinkHandle` (or `BufferedSinkHandle`) with a reactive `errors` companion node. The `_create_sink_error_handler()` factory always writes to the errors node; if a user callback is also provided, it fires first. `dispose()` sends `TEARDOWN` to the errors node. Mirrors TS implementation. Re-entrant batch drain protection applied via `contextlib.suppress(Exception)` around `errors_node.down()`.
|
|
125
|
+
- **~~TS buffered sinks missing ERROR flush (Phase 5.3c, noted 2026-04-04, resolved 2026-04-04):~~** Both TS and PY buffered sinks now use `messageTier(msg[0]) >= 3` / `message_tier(msg[0]) >= 3` to flush on any terminal (COMPLETE, ERROR, TEARDOWN). Previously both used hardcoded `COMPLETE || TEARDOWN` checks and silently dropped buffered data on upstream ERROR.
|
|
126
|
+
- **~~Synchronous SQLite blocking in `to_sqlite` sink (Phase 5.2b, noted 2026-04-04, resolved 2026-04-04):~~** Both TS and PY now accept `batch_insert` / `batchInsert` (default `False`) and `max_batch_size` / `maxBatchSize` (default `1000`). DATA values are buffered and flushed inside a `BEGIN`/`COMMIT` transaction on terminal messages (`message_tier >= 3`), at `max_batch_size` threshold, or on `dispose()`. On insert error, the first error triggers `break` + `ROLLBACK`. BEGIN failure preserves pending data for retry via manual `flush()`. Both return `BufferedSinkHandle` when batch mode is enabled.
|
|
127
|
+
|
|
122
128
|
---
|
|
123
129
|
|
|
124
130
|
## Cross-language implementation notes
|
|
125
131
|
|
|
126
132
|
**Keep this section in sync with `graphrefly-ts/docs/optimizations.md` § Cross-language implementation notes** so you can open both files side by side.
|
|
127
133
|
|
|
128
|
-
- **
|
|
134
|
+
- **SQLite adapter parity (Phase 5.2b, 2026-04-04):** Both TS and PY use duck-typed `SqliteDbLike` with a `query(sql, params)` method — matching the `PostgresClientLike`/`ClickHouseClientLike` convention. TS `SqliteDbLike.query()` returns `unknown[]`; PY `SqliteDbLike.query()` returns `list[Any]`. Both are fully synchronous (no Promises/async). `from_sqlite`/`fromSqlite` is one-shot (DATA per row, then COMPLETE); compose with `switch_map` + `from_timer` for periodic re-query. `to_sqlite`/`toSqlite` follows per-record sink pattern (same as `to_postgres`/`toPostgres`). Default insert SQL uses JSON column; custom `to_sql` override available. TS uses `node:sqlite` `DatabaseSync` or `better-sqlite3`; PY uses stdlib `sqlite3` — both zero-dep from GraphReFly's perspective (user provides instance).
|
|
135
|
+
- **Storage & sink adapter pattern parity (Phase 5.2d, 2026-04-04):** All 5.2d sinks follow the same pattern in both TS and PY: duck-typed client protocols, `on_message` intercepting `DATA`, `SinkTransportError` for serialize/send failures. All sinks return a `SinkHandle` with `dispose()` + `errors: Node[SinkTransportError | None]`. `dispose()` sends `TEARDOWN` to the errors node. Buffered sinks (`to_clickhouse`, `to_s3`, `to_file`, `to_csv`) return a `BufferedSinkHandle` adding `flush()`. TS `SinkHandle` has optional `flush?: ...`; PY uses separate `BufferedSinkHandle` dataclass (intentional — more Pythonic). Checkpoint adapters (`checkpoint_to_s3`, `checkpoint_to_redis`) wire `graph.auto_checkpoint()`. PY uses `threading.Timer` for flush timers; TS uses `setTimeout`. PY `to_postgres` calls `client.execute(sql, params)` (psycopg2/3 style); TS calls `client.query(sql, params)` (pg style). PY `json.dumps` includes spaces after separators; TS `JSON.stringify` does not — NDJSON output is semantically equivalent but not byte-identical across languages.
|
|
129
136
|
|
|
130
137
|
### 1. Message type wire encoding
|
|
131
138
|
|
|
@@ -638,7 +645,7 @@ Both ports now align on the following:
|
|
|
638
645
|
| `from_http` external cancellation | No external signal (deferred); unsubscribe suppresses late emissions | Supports external `AbortSignal` via options | Language/runtime cancellation primitives |
|
|
639
646
|
| AbortSignal on async sources | Not supported (deferred) | `signal` option on `fromTimer`, `fromPromise`, `fromAsyncIter` | TS has native AbortSignal; Py deferred |
|
|
640
647
|
|
|
641
|
-
**Resolved (2026-03-31
|
|
648
|
+
**Resolved (2026-03-31, implemented 2026-04-04):** `CancellationToken` protocol and `cancellation_token()` factory implemented in `core/cancellation.py`. Exported from `graphrefly.core`. Backed by `threading.Event` with lock-protected callback list, `is_cancelled` property, `on_cancel(fn)` returning an unsubscribe callable, and `cancel()` method. Wiring into async sources (`from_timer`, `from_awaitable`, `from_async_iter`) deferred — the protocol is ready. `TEARDOWN`-via-unsubscribe remains the primary cancellation path; the token is for external/cooperative cancellation.
|
|
642
649
|
|
|
643
650
|
## Resolved design decisions (cross-language, 2026-04-03)
|
|
644
651
|
|
|
@@ -302,7 +302,7 @@ Composition layer over 3.2 (`reactive_log`), 4.1 (sagas), 4.2 (event bus), 4.3 (
|
|
|
302
302
|
- [ ] SQLAlchemy ORM integration
|
|
303
303
|
- [ ] Django ORM integration
|
|
304
304
|
- [ ] Tortoise ORM integration
|
|
305
|
-
- [
|
|
305
|
+
- [x] `from_sqlite(db, query)` / `to_sqlite(db, table)` — SQLite via duck-typed `SqliteDbLike` (`query()` method); one-shot source + per-record sink; sync
|
|
306
306
|
|
|
307
307
|
### 5.3 — Adapters
|
|
308
308
|
|
|
@@ -330,14 +330,14 @@ Connectors for the universal reduction layer (Phase 8). Each wraps an external p
|
|
|
330
330
|
|
|
331
331
|
### 5.3c — Storage & sink adapters
|
|
332
332
|
|
|
333
|
-
- [
|
|
334
|
-
- [
|
|
335
|
-
- [
|
|
336
|
-
- [
|
|
337
|
-
- [
|
|
338
|
-
- [
|
|
339
|
-
- [
|
|
340
|
-
- [
|
|
333
|
+
- [x] `to_clickhouse(table, opts)` — buffered batch insert sink
|
|
334
|
+
- [x] `to_s3(bucket, opts)` — object storage sink (Parquet/NDJSON, partitioned; via `boto3`)
|
|
335
|
+
- [x] `to_postgres(table, opts)` / `to_mongo(collection, opts)` — document/relational sink
|
|
336
|
+
- [x] `to_loki(opts)` / `to_tempo(opts)` — Grafana stack sinks
|
|
337
|
+
- [x] `checkpoint_to_s3(bucket, opts)` — graph snapshot persistence to object storage
|
|
338
|
+
- [x] `checkpoint_to_redis(prefix, opts)` — fast checkpoint for ephemeral infra
|
|
339
|
+
- [x] `to_file(path, opts)` — file sink
|
|
340
|
+
- [x] `to_csv(path, opts)` — CSV file sink
|
|
341
341
|
|
|
342
342
|
### 5.4 — LLM tool integration
|
|
343
343
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "graphrefly"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.5.0"
|
|
4
4
|
description = "Reactive graph protocol for human + LLM co-operation. Composable nodes, glitch-free diamond resolution, two-phase push, durable streaming. Zero dependencies."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -60,6 +60,8 @@ dev = [
|
|
|
60
60
|
"croniter>=2.0",
|
|
61
61
|
"fastapi>=0.100",
|
|
62
62
|
"httpx>=0.24",
|
|
63
|
+
"pillow>=12.2.0",
|
|
64
|
+
"trio>=0.33.0",
|
|
63
65
|
]
|
|
64
66
|
|
|
65
67
|
[tool.semantic_release]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Core node primitives and protocol types for graphrefly."""
|
|
2
2
|
|
|
3
|
+
from graphrefly.core.cancellation import CancellationToken, cancellation_token
|
|
3
4
|
from graphrefly.core.clock import monotonic_ns, wall_clock_ns
|
|
4
5
|
from graphrefly.core.dynamic_node import DynamicNodeImpl, dynamic_node
|
|
5
6
|
from graphrefly.core.guard import (
|
|
@@ -77,6 +78,8 @@ from graphrefly.core.versioning import (
|
|
|
77
78
|
|
|
78
79
|
__all__ = [
|
|
79
80
|
"Actor",
|
|
81
|
+
"CancellationToken",
|
|
82
|
+
"cancellation_token",
|
|
80
83
|
"DynamicNodeImpl",
|
|
81
84
|
"DeferWhen",
|
|
82
85
|
"EmitStrategy",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Cooperative cancellation token for async/LLM boundaries.
|
|
2
|
+
|
|
3
|
+
The ``CancellationToken`` protocol provides a small interface for cooperative
|
|
4
|
+
cancellation that mirrors TypeScript's ``AbortSignal`` pattern. It is backed
|
|
5
|
+
by ``threading.Event`` and is fully reactive (no polling — callbacks fire
|
|
6
|
+
immediately on cancellation).
|
|
7
|
+
|
|
8
|
+
Usage::
|
|
9
|
+
|
|
10
|
+
token = cancellation_token()
|
|
11
|
+
token.on_cancel(lambda: print("cancelled"))
|
|
12
|
+
token.cancel() # fires callback synchronously
|
|
13
|
+
|
|
14
|
+
Pass into ``LLMAdapter.invoke()`` via ``LLMInvokeOptions`` so adapters can
|
|
15
|
+
react to cancellation without polling.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import threading
|
|
21
|
+
from contextlib import suppress
|
|
22
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@runtime_checkable
|
|
29
|
+
class CancellationToken(Protocol):
|
|
30
|
+
"""Cooperative cancellation token (cross-language: TS ``AbortSignal``)."""
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def is_cancelled(self) -> bool:
|
|
34
|
+
"""Whether cancellation has been requested."""
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
def on_cancel(self, fn: Callable[[], None]) -> Callable[[], None]:
|
|
38
|
+
"""Register a callback to fire on cancellation.
|
|
39
|
+
|
|
40
|
+
Returns an unsubscribe callable that removes the callback.
|
|
41
|
+
If already cancelled, ``fn`` fires synchronously before returning.
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class _CancellationTokenImpl:
|
|
47
|
+
"""Concrete cancellation token backed by ``threading.Event``."""
|
|
48
|
+
|
|
49
|
+
__slots__ = ("_event", "_callbacks", "_lock")
|
|
50
|
+
|
|
51
|
+
def __init__(self) -> None:
|
|
52
|
+
self._event = threading.Event()
|
|
53
|
+
self._callbacks: list[Callable[[], None]] = []
|
|
54
|
+
self._lock = threading.Lock()
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def is_cancelled(self) -> bool:
|
|
58
|
+
return self._event.is_set()
|
|
59
|
+
|
|
60
|
+
def on_cancel(self, fn: Callable[[], None]) -> Callable[[], None]:
|
|
61
|
+
with self._lock:
|
|
62
|
+
if self._event.is_set():
|
|
63
|
+
fn()
|
|
64
|
+
return lambda: None
|
|
65
|
+
self._callbacks.append(fn)
|
|
66
|
+
|
|
67
|
+
def _unsub() -> None:
|
|
68
|
+
with self._lock, suppress(ValueError):
|
|
69
|
+
self._callbacks.remove(fn)
|
|
70
|
+
|
|
71
|
+
return _unsub
|
|
72
|
+
|
|
73
|
+
def cancel(self) -> None:
|
|
74
|
+
"""Request cancellation. Fires all registered callbacks synchronously."""
|
|
75
|
+
with self._lock:
|
|
76
|
+
if self._event.is_set():
|
|
77
|
+
return
|
|
78
|
+
self._event.set()
|
|
79
|
+
cbs = list(self._callbacks)
|
|
80
|
+
self._callbacks.clear()
|
|
81
|
+
for cb in cbs:
|
|
82
|
+
cb()
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def cancellation_token() -> _CancellationTokenImpl:
|
|
86
|
+
"""Create a new cancellation token.
|
|
87
|
+
|
|
88
|
+
Returns a concrete token with ``cancel()``, ``is_cancelled``, and
|
|
89
|
+
``on_cancel(fn)`` methods.
|
|
90
|
+
"""
|
|
91
|
+
return _CancellationTokenImpl()
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
"""Extra operators and sources (roadmap Phase 2+)."""
|
|
2
2
|
|
|
3
3
|
from graphrefly.extra.adapters import (
|
|
4
|
+
BufferedSinkHandle,
|
|
5
|
+
ClickHouseInsertClientLike,
|
|
6
|
+
FileWriterLike,
|
|
4
7
|
HttpBundle,
|
|
5
8
|
OTelBundle,
|
|
9
|
+
S3ClientLike,
|
|
10
|
+
SinkHandle,
|
|
11
|
+
SqliteDbLike,
|
|
12
|
+
checkpoint_to_redis,
|
|
13
|
+
checkpoint_to_s3,
|
|
6
14
|
from_clickhouse_watch,
|
|
7
15
|
from_csv,
|
|
8
16
|
from_event_emitter,
|
|
@@ -18,6 +26,7 @@ from graphrefly.extra.adapters import (
|
|
|
18
26
|
from_pulsar,
|
|
19
27
|
from_rabbitmq,
|
|
20
28
|
from_redis_stream,
|
|
29
|
+
from_sqlite,
|
|
21
30
|
from_statsd,
|
|
22
31
|
from_syslog,
|
|
23
32
|
from_webhook,
|
|
@@ -26,12 +35,21 @@ from graphrefly.extra.adapters import (
|
|
|
26
35
|
parse_statsd,
|
|
27
36
|
parse_syslog,
|
|
28
37
|
sse_frame,
|
|
38
|
+
to_clickhouse,
|
|
39
|
+
to_csv,
|
|
40
|
+
to_file,
|
|
29
41
|
to_kafka,
|
|
42
|
+
to_loki,
|
|
43
|
+
to_mongo,
|
|
30
44
|
to_nats,
|
|
45
|
+
to_postgres,
|
|
31
46
|
to_pulsar,
|
|
32
47
|
to_rabbitmq,
|
|
33
48
|
to_redis_stream,
|
|
49
|
+
to_s3,
|
|
50
|
+
to_sqlite,
|
|
34
51
|
to_sse,
|
|
52
|
+
to_tempo,
|
|
35
53
|
to_websocket,
|
|
36
54
|
)
|
|
37
55
|
from graphrefly.extra.backoff import (
|
|
@@ -226,6 +244,7 @@ __all__ = [
|
|
|
226
244
|
"from_pulsar",
|
|
227
245
|
"from_rabbitmq",
|
|
228
246
|
"from_redis_stream",
|
|
247
|
+
"from_sqlite",
|
|
229
248
|
"from_statsd",
|
|
230
249
|
"from_syslog",
|
|
231
250
|
"from_websocket",
|
|
@@ -242,11 +261,28 @@ __all__ = [
|
|
|
242
261
|
"share",
|
|
243
262
|
"throw_error",
|
|
244
263
|
"to_array",
|
|
264
|
+
"BufferedSinkHandle",
|
|
265
|
+
"ClickHouseInsertClientLike",
|
|
266
|
+
"FileWriterLike",
|
|
267
|
+
"S3ClientLike",
|
|
268
|
+
"SinkHandle",
|
|
269
|
+
"checkpoint_to_redis",
|
|
270
|
+
"checkpoint_to_s3",
|
|
271
|
+
"to_clickhouse",
|
|
272
|
+
"to_csv",
|
|
273
|
+
"to_file",
|
|
245
274
|
"to_kafka",
|
|
275
|
+
"to_loki",
|
|
276
|
+
"to_mongo",
|
|
246
277
|
"to_nats",
|
|
278
|
+
"to_postgres",
|
|
247
279
|
"to_pulsar",
|
|
248
280
|
"to_rabbitmq",
|
|
249
281
|
"to_redis_stream",
|
|
282
|
+
"to_s3",
|
|
283
|
+
"to_sqlite",
|
|
284
|
+
"to_tempo",
|
|
285
|
+
"SqliteDbLike",
|
|
250
286
|
"sse_frame",
|
|
251
287
|
"to_websocket",
|
|
252
288
|
"to_sse",
|