Move `reactivedataflow` docs into mkdocs (#294)
* add mkdocs * formatting * formatting
This commit is contained in:
Родитель
e80909b429
Коммит
9024b5121a
|
@ -5,6 +5,7 @@ javascript/*/lib/
|
|||
javascript/*/dist/
|
||||
javascript/*/storybook-static/
|
||||
javascript/*/docsTemp/
|
||||
python/*/site/
|
||||
.swc/
|
||||
.turbo/
|
||||
|
||||
|
|
|
@ -1,220 +1,9 @@
|
|||
# Reactive-Dataflow
|
||||
# reactivedataflow
|
||||
Reactive Processing Graphs for Python.
|
||||
|
||||
|
||||
# Getting Started
|
||||
|
||||
## Installation
|
||||
```sh
|
||||
pip install reactivedataflow
|
||||
```
|
||||
|
||||
The key dependencies for this project include `rx`, `networkx`, and `pydantic`. These are outlined in the `pyproject.toml` dependencies section.
|
||||
|
||||
# Key Concepts
|
||||
`reactivedataflow` has a design that is inspired by our prior work with [datashaper](https://github.com/microsoft/datashaper) and the neuron model of neural networks.
|
||||
In a neural network, individual neurons are connected to other neurons through synapses.
|
||||
In traditional neural network topologies, there are "hidden" layers of normal neurons, in addition to special neurons that are designated as input neurons, and other neurons that are designated as output neurons.
|
||||
|
||||
In `reactivedataflow`, we have a similar conceptual framework of _Verb Nodes_, _Input Nodes_, and _Output Nodes_.
|
||||
|
||||
## Nodes
|
||||
Nodes are the heart of the system, and they are responsible for processing data streams and emitting transformed results. A key feature of this system is that data streams between nodes are _polymorphic_ - meaning that they can be any type. Care should be taken that the processing function of a verb node is able to handle the data types that are passed to it.
|
||||
|
||||
### Input Nodes
|
||||
Input nodes are simple nodes that are initialized with a `reactivex` event stream, and emit data on a single output port.
|
||||
|
||||
### Output Nodes
|
||||
Output nodes are simple nodes that are used to observe the output of a verb node. They are initialized with a reference to a verb node, and emit data on a single output port.
|
||||
This is the primary mechanism for reading results from the processing graph.
|
||||
|
||||
### Verb Nodes
|
||||
|
||||
<img src="docs/verb_node.png" height="350">
|
||||
|
||||
Verb nodes are composed of a number of "ports" that are used to describe their inputs, outputs, and configuration properties.
|
||||
* _Input ports_ represent data streams that are consumed by the verb node. Each message from an input port will result in a re-evaluation of the VerbNode's processing function, and may result in new messages being emitted on any number of output ports.
|
||||
* The _array input port_ is a special port type that allows for multiple input streams to be consumed by the verb node. This is useful for cases where multiple data streams are required to be processed together. When any of the input streams emit a message, the verb node will re-evaluate its processing function with the latest messages from all input streams.
|
||||
* _Configuration_ ports are used to provide static configuration values, such as system services or algorithmic hyper-parameters, to the verb node. These values are used to parameterize the processing function, and are not expected to change during the lifetime of the verb node.
|
||||
* _Output ports_ represent data streams that are emitted by the verb node. Each message emitted on an output port will be sent to any downstream nodes that are connected to the verb node via an input port.
|
||||
|
||||
## Edges
|
||||
Edges are used to connect nodes together in a processing graph. They are used to define the flow of data between nodes, and are used to establish the dependencies between nodes. Each edge represents an event-based reactive datastream. Edges are attached to _two_ nodes. Edges must be configured with:
|
||||
|
||||
* The _from node_ that is the source of the data stream.
|
||||
* The _to node_ that is the destination of the data stream.
|
||||
|
||||
Optionally, they may include:
|
||||
* The _to_port_, which is the name of the input port in the target node. If this is not provided it will be treated as an array input.
|
||||
* The _from_port_, which is the name of the output port in the source node. If this is not provided it, we will use the _default output name_.
|
||||
|
||||
# Simple Example
|
||||
The first task in using `reactivedataflow` is to define your relevant processing verbs.
|
||||
Processing verbs are _pure functions_ that are annotated using the `@verb` decorator and the `Annotated` feature.
|
||||
A key feature of `reactivedataflow` is that verb functions _are not explicitly coupled_ to reactivedataflow, and may be used in other contexts as well.
|
||||
|
||||
For more detail on defining various node types, see the [Defining Verbs](#defining-verbs) section.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config
|
||||
from typing import Annotated
|
||||
|
||||
@verb(name="print")
|
||||
def print_verb(
|
||||
val: Annotated[str, Input()],
|
||||
prefix: Annotated[str, Config()] = ""
|
||||
) -> str:
|
||||
return f"{prefix}{val}"
|
||||
```
|
||||
|
||||
Once we have a set of verbs defined, we can define a processing graph to establish a dataflow.
|
||||
In this example, we'll load a simple one-node graph using the `Graph` schema.
|
||||
The `GraphBuilder` also has a builder-mode API so that graphs can be defined iteratively.
|
||||
|
||||
```python
|
||||
import reactivex as rx
|
||||
from reactivedataflow import (
|
||||
GraphBuilder,
|
||||
Graph,
|
||||
InputNode,
|
||||
Node,
|
||||
Edge,
|
||||
Output
|
||||
)
|
||||
|
||||
#
|
||||
# Define a simple graph
|
||||
#
|
||||
graph = GraphBuilder().load_model(
|
||||
Graph(
|
||||
inputs=[InputNode(id="input")],
|
||||
nodes=[Node(id="printed", verb="print", config={"prefix": "!"})],
|
||||
edges=[Edge(from_node="input", to_node="printed")],
|
||||
outputs=[Output(name="result", node="printed")],
|
||||
)
|
||||
).build(
|
||||
inputs={
|
||||
"input": rx.of(["hello", "world"]),
|
||||
}
|
||||
)
|
||||
graph.output("result").subscribe(print)
|
||||
# Output:
|
||||
# !hello
|
||||
# !world
|
||||
```
|
||||
|
||||
# Defining Verbs
|
||||
|
||||
## Named Inputs
|
||||
```python
|
||||
from reactivedataflow import verb, Input
|
||||
from typing import Annotated
|
||||
|
||||
@verb(name="add")
|
||||
def add(
|
||||
a: Annotated[int, Input()],
|
||||
b: Annotated[int, Input()]
|
||||
) -> int:
|
||||
return a + b
|
||||
```
|
||||
Input Options:
|
||||
* `required` (bool, default=?): Whether this input is required. This is inferred from whether the argument has a default value.
|
||||
|
||||
## Array Inputs
|
||||
```python
|
||||
from reactivedataflow import verb, ArrayInput
|
||||
from typing import Annotated
|
||||
|
||||
@verb(name="add")
|
||||
def add(
|
||||
inputs: Annotated[list[int], ArrayInput(min_inputs=2)]
|
||||
) -> int:
|
||||
return sum(inputs)
|
||||
```
|
||||
|
||||
Array Input Options:
|
||||
* `required` (bool, default=?): Whether this input is required. This is inferred from whether the argument has a default value.
|
||||
* `min_inputs` (int, default=None): The minimum number of inputs that must be provided to the verb node.
|
||||
* `defined_inputs` (bool, default=False): If true, then each array value must be non-None for the verb to fire.
|
||||
|
||||
## Explicit Port Definitions
|
||||
As an alternative to decorating function arguments, ports may be defined explicitly.
|
||||
Each port has a name and maps into a parameter name.
|
||||
```python
|
||||
@verb(
|
||||
"add"
|
||||
ports=[
|
||||
Input(name="input_1", parameter="x", required=True),
|
||||
Input(name="input_2", parameter="y", required=True),
|
||||
Config(name="config", parameter="config", required=False),
|
||||
Output(name="output)
|
||||
]
|
||||
)
|
||||
def add(x: int, y: int, config: int = 0) -> int:
|
||||
return x + y + config
|
||||
```
|
||||
|
||||
## Multiple Outputs
|
||||
When multiple outputs are desired, you can set the `output_mode` to `OutputMode.Tuple` and provide a list of output port names.
|
||||
|
||||
```python
|
||||
@verb(
|
||||
"twin_outputs",
|
||||
output_names=["output_1", "output_2"],
|
||||
output_mode=OutputMode.Tuple,
|
||||
)
|
||||
def twin_outputs(
|
||||
x: Annotated[str | None, Input()],
|
||||
y: Annotated[str | None, Input()]
|
||||
) -> tuple[str, str]:
|
||||
output_1 = f"{x} {y}"
|
||||
output_2 = f"{y} {x}"
|
||||
return output_1, output_2
|
||||
```
|
||||
|
||||
## Custom Registry
|
||||
There may be cases where you want to separate verb definitions from each other. This is most often used in testing. In these cases, verbs can be initialized with a custom registry instance. By default, a singleton registry is used.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbRegistry
|
||||
|
||||
registry = VerbRegistry()
|
||||
@verb(name="add", registry=registry)
|
||||
...
|
||||
```
|
||||
|
||||
## Verb Conditions
|
||||
The `verb` API allows for users to define _firing_ and _emitting_ conditions.
|
||||
These are predicate functions that operate on `VerbInput` and `VerbOutput` objects.
|
||||
|
||||
The low-level VerbNode type essentially operates as a function that accepts a `VerbInput` and returns a `VerbOutput`. Our `verb` decorators are a higher-level API that automatically bundles and unpacks these values for you.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbCondition, VerbInput
|
||||
|
||||
def fire_condition(input: VerbInput) -> bool:
|
||||
return input["a"] > 0
|
||||
|
||||
def emit_condition(input: VerbInput, output: VerbOutput) -> bool:
|
||||
return output["result"] > 0
|
||||
|
||||
@verb(
|
||||
name="add",
|
||||
fire_conditions=[fire_condition],
|
||||
emit_conditions=[emit_condition]
|
||||
)
|
||||
def add(
|
||||
a: Annotated[int, Input()],
|
||||
b: Annotated[int, Input()]
|
||||
) -> int:
|
||||
return a + b
|
||||
```
|
||||
|
||||
|
||||
##
|
||||
|
||||
## To Discuss:
|
||||
* Builder API
|
||||
* Configuration injection
|
||||
* Error handling
|
||||
* More complex examples
|
|
@ -0,0 +1,133 @@
|
|||
# Examples
|
||||
|
||||
## Simple Example
|
||||
The first task in using `reactivedataflow` is to define your relevant processing verbs.
|
||||
Processing verbs are _pure functions_ that are annotated using the `@verb` decorator and the `Annotated` feature.
|
||||
A key feature of `reactivedataflow` is that verb functions _are not explicitly coupled_ to reactivedataflow, and may be used in other contexts as well.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config
|
||||
from typing import Annotated
|
||||
|
||||
@verb(name="print")
|
||||
def print_verb(
|
||||
val: Annotated[str, Input()],
|
||||
prefix: Annotated[str, Config()] = ""
|
||||
) -> str:
|
||||
return f"{prefix}{val}"
|
||||
```
|
||||
|
||||
Once we have a set of verbs defined, we can define a processing graph to establish a dataflow.
|
||||
In this example, we'll load a simple one-node graph using the `Graph` schema.
|
||||
The `GraphBuilder` also has a builder-mode API so that graphs can be defined iteratively.
|
||||
|
||||
```python
|
||||
import reactivex as rx
|
||||
from reactivedataflow import (
|
||||
GraphBuilder,
|
||||
Graph,
|
||||
InputNode,
|
||||
Node,
|
||||
Edge,
|
||||
Output
|
||||
)
|
||||
|
||||
#
|
||||
# Define a simple graph
|
||||
#
|
||||
graph = GraphBuilder().load_model(
|
||||
Graph(
|
||||
inputs=[InputNode(id="input")],
|
||||
nodes=[Node(id="printed", verb="print", config={"prefix": "!"})],
|
||||
edges=[Edge(from_node="input", to_node="printed")],
|
||||
outputs=[Output(name="result", node="printed")],
|
||||
)
|
||||
).build(
|
||||
inputs={
|
||||
"input": rx.of(["hello", "world"]),
|
||||
}
|
||||
)
|
||||
graph.output("result").subscribe(print)
|
||||
# Output:
|
||||
# !hello
|
||||
# !world
|
||||
```
|
||||
|
||||
## Math Operators
|
||||
```python
|
||||
|
||||
@verb("add")
|
||||
def add(
|
||||
values: Annotated[list[int], ArrayInput(min_inputs=1, defined_inputs=True)],
|
||||
) -> int:
|
||||
return sum(values)
|
||||
|
||||
@verb("multiply")
|
||||
def multiply(a: Annotated[int, Input()], b: Annotated[int, Input()]) -> int:
|
||||
return a * b
|
||||
|
||||
@verb("constant")
|
||||
def constant(value: Annotated[int, Config()]) -> int:
|
||||
return value
|
||||
|
||||
graph = GraphBuilder().load_model(
|
||||
Graph(
|
||||
inputs=[
|
||||
InputNode(id="input"),
|
||||
],
|
||||
nodes=[
|
||||
Node(id="c3", verb="constant", config={"value": 3}),
|
||||
Node(id="c5", verb="constant", config={"value": ValRef(value=5)}),
|
||||
Node(id="first_add", verb="add"),
|
||||
Node(id="second_add", verb="add"),
|
||||
Node(id="product", verb="multiply"),
|
||||
],
|
||||
edges=[
|
||||
# First sum inputs: 1 + 3 = 4
|
||||
Edge(from_node="input", to_node="first_add"),
|
||||
Edge(from_node="c3", to_node="first_add"),
|
||||
# Second sum inputs: 5 + 3 = 8
|
||||
Edge(from_node="c3", to_node="second_add"),
|
||||
Edge(from_node="c5", to_node="second_add"),
|
||||
# Multiply the sums: 4 * 8 = 32
|
||||
Edge(from_node="first_add", to_node="product", to_port="a"),
|
||||
Edge(from_node="second_add", to_node="product", to_port="b"),
|
||||
],
|
||||
outputs=[Output(name="result", node="product")],
|
||||
)
|
||||
).build(
|
||||
inputs={
|
||||
"input": rx.of([1]),
|
||||
}
|
||||
)
|
||||
graph.output("result").subscribe(print)
|
||||
# Output: 32
|
||||
```
|
||||
|
||||
## Math Operators using Builder API
|
||||
|
||||
```python
|
||||
# Assemble a graph:
|
||||
#
|
||||
# n1 ----\
|
||||
# n3
|
||||
# n2 ----/
|
||||
#
|
||||
graph = GraphBuilder()
|
||||
# Define Constant Layer
|
||||
.add_node("c1", "constant", config={"value": 1})
|
||||
.add_node("c3", "constant", config={"value": 3})
|
||||
.add_node("c5", "constant", config={"value": 5})
|
||||
# Define Execution Layer
|
||||
.add_node("n1", "add")
|
||||
.add_edge(from_node="c1", to_node="n1")
|
||||
.add_edge(from_node="c3", to_node="n1")
|
||||
.add_node("n2", "add")
|
||||
.add_edge(from_node="c3", to_node="n2")
|
||||
.add_edge(from_node="c5", to_node="n2")
|
||||
.add_node("n3", "multiply")
|
||||
.add_edge(from_node="n1", to_node="n3", to_port="a")
|
||||
.add_edge(from_node="n2", to_node="n3", to_port="b")
|
||||
.add_output("result", "n3")
|
||||
.build()
|
||||
```
|
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 34 KiB |
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 23 KiB |
До Ширина: | Высота: | Размер: 54 KiB После Ширина: | Высота: | Размер: 54 KiB |
|
@ -0,0 +1,3 @@
|
|||
code {
|
||||
tab-size: 2
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
# Getting Started
|
||||
|
||||
reactivedataflow is a Python library for building reactive data processing graphs. It is designed to work with streaming data sources.
|
||||
|
||||
```sh
|
||||
pip install reactivedataflow
|
||||
```
|
||||
|
||||
The dependencies for this project include `rx`, `networkx`, and `pydantic`.
|
||||
|
||||
## Legacy
|
||||
`reactivedataflow` has a design that is inspired by our prior work with [datashaper](https://github.com/microsoft/datashaper) and the neuron model of neural networks.
|
||||
In a neural network, individual neurons are connected to other neurons through synapses.
|
||||
In traditional neural network topologies, there are "hidden" layers of normal neurons, in addition to special neurons that are designated as input neurons, and other neurons that are designated as output neurons.
|
||||
|
||||
In `reactivedataflow`, we have a similar conceptual framework of _Verb Nodes_, _Input Nodes_, and _Output Nodes_.
|
||||
|
||||
## Nodes
|
||||
Nodes are the heart of the system, and they are responsible for processing data streams and emitting transformed results. A key feature of this system is that data streams between nodes are _polymorphic_ - meaning that they can be any type. Care should be taken that the processing function of a verb node is able to handle the data types that are passed to it.
|
||||
|
||||
#### Input Nodes
|
||||
|
||||
<img src="./images/input_node.png" height="300" title="Input Node"/>
|
||||
|
||||
Input nodes are simple nodes that are initialized with a `reactivex` event stream, and emit data on a single output port.
|
||||
|
||||
#### Output Nodes
|
||||
|
||||
<img src="./images/output_node.png" height="250" title="Output Node"/>
|
||||
|
||||
Output nodes are simple nodes that are used to observe the output of a verb node. They are initialized with a reference to a verb node, and emit data on a single output port.
|
||||
This is the primary mechanism for reading results from the processing graph.
|
||||
|
||||
#### Verb Nodes
|
||||
|
||||
<img src="./images/verb_node.png" height="350" title="Verb Node"/>
|
||||
|
||||
Verb nodes are composed of a number of "ports" that are used to describe their inputs, outputs, and configuration properties.
|
||||
|
||||
* _Input ports_ represent data streams that are consumed by the verb node. Each message from an input port will result in a re-evaluation of the VerbNode's processing function, and may result in new messages being emitted on any number of output ports.
|
||||
* The _array input port_ is a special port type that allows for multiple input streams to be consumed by the verb node. This is useful for cases where multiple data streams are required to be processed together. When any of the input streams emit a message, the verb node will re-evaluate its processing function with the latest messages from all input streams.
|
||||
* _Configuration_ ports are used to provide static configuration values, such as system services or algorithmic hyper-parameters, to the verb node. These values are used to parameterize the processing function, and are not expected to change during the lifetime of the verb node.
|
||||
* _Output ports_ represent data streams that are emitted by the verb node. Each message emitted on an output port will be sent to any downstream nodes that are connected to the verb node via an input port.
|
||||
|
||||
## Edges
|
||||
Edges are used to connect nodes together in a processing graph. They are used to define the flow of data between nodes, and are used to establish the dependencies between nodes. Each edge represents an event-based reactive datastream. Edges are attached to _two_ nodes. Edge properties may include:
|
||||
|
||||
* _from node_ (required) - the source node id of the data stream.
|
||||
* _to node_ (required) - the destination node id of the data stream.
|
||||
* _to_port_ - the name of the input port in the target node. If this is not provided it will be treated as an array input.
|
||||
* _from_port_ - the name of the output port in the source node. If this is not provided it, we will use the _default output name_.
|
|
@ -0,0 +1,167 @@
|
|||
# Verbs
|
||||
|
||||
Verbs are at the heart of `reactivedataflow`. Verbs are custom processing functions that react to input event streams and emit output event streams. Verbs are normally defined using _pure functions_ which are annotated using the `@verb` decorator and the `Annotated` feature. This mechanism allows verbs to be used in other contexts as well, not just `reactivedataflow`, improving their utility and testability.
|
||||
|
||||
At a base level, the system treats each verb as a function that accepts a `VerbInput` and returns a `VerbOutput`. The `verb` decorator and related annotations provide convenience mechanisms for adapting pure functions to fit into the execution model.
|
||||
|
||||
## Annotated Verbs (recommended)
|
||||
```python
|
||||
from reactivedataflow import verb, Input
|
||||
from typing import Annotated
|
||||
|
||||
@verb("add")
|
||||
def add(
|
||||
a: Annotated[int, Input()],
|
||||
b: Annotated[int, Input()]
|
||||
) -> int:
|
||||
return a + b
|
||||
```
|
||||
Input Options:
|
||||
|
||||
* `required` _(bool, default=?)_: Whether this input is required. This is inferred from whether the argument has a default value.
|
||||
|
||||
## Raw Verbs
|
||||
```python
|
||||
from reactivedataflow import verb, VerbInput, VerbOutput, InputMode, OutputMode
|
||||
|
||||
@verb(
|
||||
name="add",
|
||||
input_mode=InputMode.Raw,
|
||||
output_mode=OutputMode.Raw
|
||||
)
|
||||
def add(input: VerbInput) -> VerbOutput:
|
||||
return {"result": input["a"] + input["b"]}
|
||||
```
|
||||
|
||||
## Using Array Inputs
|
||||
```python
|
||||
from reactivedataflow import verb, ArrayInput
|
||||
from typing import Annotated
|
||||
|
||||
@verb("add")
|
||||
def add(
|
||||
inputs: Annotated[list[int], ArrayInput(min_inputs=2)]
|
||||
) -> int:
|
||||
return sum(inputs)
|
||||
```
|
||||
|
||||
Array Input Options:
|
||||
|
||||
* `required` _(bool, default=?)_: Whether this input is required. This is inferred from whether the argument has a default value.
|
||||
* `min_inputs` _(int, default=None)_: The minimum number of inputs that must be provided to the verb node.
|
||||
* `defined_inputs` _(bool, default=False)_: If true, then each array value must be non-None for the verb to fire.
|
||||
|
||||
## Using Explicit Port Definitions
|
||||
As an alternative to decorating function arguments, ports may be defined explicitly.
|
||||
Each port has a name and maps into a parameter name.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config
|
||||
|
||||
@verb(
|
||||
"add",
|
||||
ports=[
|
||||
Input(name="input_1", parameter="x", required=True),
|
||||
Input(name="input_2", parameter="y", required=True),
|
||||
Config(name="config", parameter="z", required=False),
|
||||
Output(name="output"),
|
||||
]
|
||||
)
|
||||
def add(x: int, y: int, z: int = 0) -> int:
|
||||
return x + y + z
|
||||
```
|
||||
|
||||
## Emitting Multiple Outputs
|
||||
When multiple outputs are desired, you can set the `output_mode` to `OutputMode.Tuple` and provide a list of output port names.
|
||||
|
||||
```python
|
||||
@verb(
|
||||
"twin_outputs",
|
||||
output_names=["output_1", "output_2"],
|
||||
output_mode=OutputMode.Tuple,
|
||||
)
|
||||
def twin_outputs(
|
||||
x: Annotated[str | None, Input()],
|
||||
y: Annotated[str | None, Input()]
|
||||
) -> tuple[str, str]:
|
||||
output_1 = f"{x} {y}"
|
||||
output_2 = f"{y} {x}"
|
||||
return output_1, output_2
|
||||
```
|
||||
|
||||
## Using a Custom Registry
|
||||
There may be cases where you want to separate verb definitions from each other. This is most often used in testing. In these cases, verbs can be initialized with a custom registry instance. By default, a singleton registry is used.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbRegistry
|
||||
|
||||
registry = VerbRegistry()
|
||||
@verb("add", registry=registry)
|
||||
...
|
||||
```
|
||||
## Overriding a Defined Verb
|
||||
Verbs are registered as their Python files are loaded. In situations where you need to override a verb definition, you can use the `override` parameter.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbRegistry
|
||||
|
||||
registry = VerbRegistry()
|
||||
@verb("add", override=True)
|
||||
...
|
||||
```
|
||||
|
||||
## Adding Custom Adapters
|
||||
You can register decorator functions that are applied _before_ any `reactivedataflow` decoration is applied. This is useful for adding custom behavior to verbs.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config
|
||||
|
||||
def emit_telemetry(fn):
|
||||
def wrap_fn():
|
||||
print(f"Calling {fn.__name__}")
|
||||
return fn()
|
||||
return wrap_n
|
||||
|
||||
@verb("add", adapters=[emit_telemetry])
|
||||
def add(
|
||||
a: Annotated[int, Input()],
|
||||
b: Annotated[int, Input()]
|
||||
) -> int:
|
||||
return a + b
|
||||
```
|
||||
## Overriding a Defined Verb
|
||||
Verbs are registered as their Python files are loaded. In situations where you need to override a verb definition, you can use the `override` parameter.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbRegistry
|
||||
|
||||
registry = VerbRegistry()
|
||||
@verb("add", override=True)
|
||||
...
|
||||
```
|
||||
|
||||
## Fire/Emit Conditions
|
||||
The `verb` API allows for users to define _firing_ and _emitting_ conditions.
|
||||
These are predicate functions that operate on `VerbInput` and `VerbOutput` objects.
|
||||
|
||||
```python
|
||||
from reactivedataflow import verb, Input, Config, VerbCondition, VerbInput
|
||||
|
||||
def fire_condition(input: VerbInput) -> bool:
|
||||
return input["a"] > 0
|
||||
|
||||
def emit_condition(input: VerbInput, output: VerbOutput) -> bool:
|
||||
return output["result"] > 0
|
||||
|
||||
@verb(
|
||||
"add",
|
||||
fire_conditions=[fire_condition],
|
||||
emit_conditions=[emit_condition]
|
||||
)
|
||||
def add(
|
||||
a: Annotated[int, Input()],
|
||||
b: Annotated[int, Input()]
|
||||
) -> int:
|
||||
return a + b
|
||||
```
|
||||
|
Двоичный файл не отображается.
|
@ -0,0 +1,2 @@
|
|||
site_name: reactivedataflow
|
||||
extra_css: [index.css]
|
|
@ -11,6 +11,20 @@ files = [
|
|||
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "click"
|
||||
version = "8.1.7"
|
||||
description = "Composable command line interface toolkit"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
|
||||
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
version = "0.4.6"
|
||||
|
@ -120,6 +134,23 @@ files = [
|
|||
[package.extras]
|
||||
test = ["pytest (>=6)"]
|
||||
|
||||
[[package]]
|
||||
name = "ghp-import"
|
||||
version = "2.1.0"
|
||||
description = "Copy your docs directly to the gh-pages branch."
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
|
||||
{file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
python-dateutil = ">=2.8.1"
|
||||
|
||||
[package.extras]
|
||||
dev = ["flake8", "markdown", "twine", "wheel"]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "2.0.0"
|
||||
|
@ -131,6 +162,164 @@ files = [
|
|||
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jinja2"
|
||||
version = "3.1.4"
|
||||
description = "A very fast and expressive template engine."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
|
||||
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
MarkupSafe = ">=2.0"
|
||||
|
||||
[package.extras]
|
||||
i18n = ["Babel (>=2.7)"]
|
||||
|
||||
[[package]]
|
||||
name = "markdown"
|
||||
version = "3.7"
|
||||
description = "Python implementation of John Gruber's Markdown."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
|
||||
{file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
|
||||
testing = ["coverage", "pyyaml"]
|
||||
|
||||
[[package]]
|
||||
name = "markupsafe"
|
||||
version = "2.1.5"
|
||||
description = "Safely add untrusted strings to HTML/XML markup."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
|
||||
{file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
|
||||
{file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
|
||||
{file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"},
|
||||
{file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"},
|
||||
{file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"},
|
||||
{file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"},
|
||||
{file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mergedeep"
|
||||
version = "1.3.4"
|
||||
description = "A deep merge function for 🐍."
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
|
||||
{file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs"
|
||||
version = "1.6.1"
|
||||
description = "Project documentation with Markdown."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"},
|
||||
{file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
click = ">=7.0"
|
||||
colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""}
|
||||
ghp-import = ">=1.0"
|
||||
jinja2 = ">=2.11.1"
|
||||
markdown = ">=3.3.6"
|
||||
markupsafe = ">=2.0.1"
|
||||
mergedeep = ">=1.3.4"
|
||||
mkdocs-get-deps = ">=0.2.0"
|
||||
packaging = ">=20.5"
|
||||
pathspec = ">=0.11.1"
|
||||
pyyaml = ">=5.1"
|
||||
pyyaml-env-tag = ">=0.1"
|
||||
watchdog = ">=2.0"
|
||||
|
||||
[package.extras]
|
||||
i18n = ["babel (>=2.9.0)"]
|
||||
min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs-get-deps"
|
||||
version = "0.2.0"
|
||||
description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"},
|
||||
{file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
mergedeep = ">=1.3.4"
|
||||
platformdirs = ">=2.2.0"
|
||||
pyyaml = ">=5.1"
|
||||
|
||||
[[package]]
|
||||
name = "networkx"
|
||||
version = "3.3"
|
||||
|
@ -227,6 +416,33 @@ files = [
|
|||
{file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pathspec"
|
||||
version = "0.12.1"
|
||||
description = "Utility library for gitignore style pattern matching of file paths."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
|
||||
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "4.3.6"
|
||||
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
|
||||
{file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
|
||||
type = ["mypy (>=1.11.2)"]
|
||||
|
||||
[[package]]
|
||||
name = "pluggy"
|
||||
version = "1.5.0"
|
||||
|
@ -444,6 +660,96 @@ pytest = ">=7.0.0,<9"
|
|||
docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
|
||||
testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "python-dateutil"
|
||||
version = "2.9.0.post0"
|
||||
description = "Extensions to the standard Python datetime module"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
|
||||
files = [
|
||||
{file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
|
||||
{file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
six = ">=1.5"
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml"
|
||||
version = "6.0.2"
|
||||
description = "YAML parser and emitter for Python"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
|
||||
{file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
|
||||
{file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
|
||||
{file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
|
||||
{file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
|
||||
{file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
|
||||
{file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
|
||||
{file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml-env-tag"
|
||||
version = "0.1"
|
||||
description = "A custom YAML tag for referencing environment variables in YAML files. "
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
|
||||
{file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
pyyaml = "*"
|
||||
|
||||
[[package]]
|
||||
name = "reactivex"
|
||||
version = "4.0.4"
|
||||
|
@ -485,6 +791,17 @@ files = [
|
|||
{file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "six"
|
||||
version = "1.16.0"
|
||||
description = "Python 2 and 3 compatibility utilities"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
files = [
|
||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tomli"
|
||||
version = "2.0.1"
|
||||
|
@ -507,7 +824,49 @@ files = [
|
|||
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "watchdog"
|
||||
version = "5.0.3"
|
||||
description = "Filesystem events monitoring"
|
||||
optional = false
|
||||
python-versions = ">=3.9"
|
||||
files = [
|
||||
{file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"},
|
||||
{file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"},
|
||||
{file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"},
|
||||
{file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"},
|
||||
{file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"},
|
||||
{file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"},
|
||||
{file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"},
|
||||
{file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"},
|
||||
{file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"},
|
||||
{file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"},
|
||||
{file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"},
|
||||
{file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"},
|
||||
{file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"},
|
||||
{file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"},
|
||||
{file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"},
|
||||
{file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"},
|
||||
{file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"},
|
||||
{file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"},
|
||||
{file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"},
|
||||
{file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"},
|
||||
{file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"},
|
||||
{file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"},
|
||||
{file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"},
|
||||
{file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
watchmedo = ["PyYAML (>=3.10)"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "597b4b3fdb830bc7a7916a874c720a8bb4d7bdd578a76afb13cf0cd83d69ddc0"
|
||||
content-hash = "49f4c7a5164ae834765f5641ce79bfefee949e82389a23de2faf0bcb1d626221"
|
||||
|
|
|
@ -21,6 +21,7 @@ pyright = "^1.1.366"
|
|||
coverage = "^7.5.3"
|
||||
numpy = "<2"
|
||||
pytest-asyncio = "^0.23.7"
|
||||
mkdocs = "^1.6.1"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
|
@ -41,6 +42,9 @@ fix_unsafe = "ruff check --preview --fix --unsafe-fixes ."
|
|||
format = ['_sort_imports', '_format_code']
|
||||
test = "pytest tests"
|
||||
|
||||
serve_docs = "mkdocs serve"
|
||||
build_docs = "mkdocs build"
|
||||
|
||||
_test_with_coverage = 'coverage run --source=reactivedataflow -m pytest tests/unit'
|
||||
_coverage_report = 'coverage report --fail-under=100 --show-missing --omit="reactivedataflow/nodes/node.py,reactivedataflow/types.py,reactivedataflow/config_provider.py,reactivedataflow/callbacks.py"'
|
||||
_generate_coverage_xml = 'coverage xml --omit="reactivedataflow/nodes/node.py,reactivedataflow/types.py,reactivedataflow/config_provider.py,reactivedataflow/callbacks.py"'
|
||||
|
|
|
@ -24,6 +24,7 @@ P = ParamSpec("P")
|
|||
|
||||
def verb(
|
||||
name: str,
|
||||
*,
|
||||
adapters: list[Decorator] | None = None,
|
||||
fire_conditions: list[FireCondition] | None = None,
|
||||
emit_conditions: list[EmitCondition] | None = None,
|
||||
|
|
|
@ -5,12 +5,7 @@ from collections.abc import Callable
|
|||
from dataclasses import dataclass
|
||||
|
||||
from reactivedataflow.decorators import Decorator
|
||||
from reactivedataflow.nodes import (
|
||||
EmitCondition,
|
||||
FireCondition,
|
||||
InputMode,
|
||||
OutputMode,
|
||||
)
|
||||
from reactivedataflow.nodes import EmitCondition, FireCondition, InputMode, OutputMode
|
||||
from reactivedataflow.ports import Ports
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче