moat-kv 0.70.19__tar.gz → 0.70.22__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.
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.gitmodules +3 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/PKG-INFO +20 -2
- moat_kv-0.70.22/docs/source/v3.rst +168 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/client.py +2 -2
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/job.py +1 -1
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/runner.py +1 -1
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/PKG-INFO +20 -2
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/SOURCES.txt +1 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/requires.txt +1 -1
- {moat-kv-0.70.19 → moat_kv-0.70.22}/pyproject.toml +1 -1
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_error.py +1 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.appveyor.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.coveragerc +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.gitignore +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.pylintrc +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.readthedocs.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/.travis.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE.APACHE2 +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE.MIT +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/MANIFEST.in +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/Makefile +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/README.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/rtd-requirements.txt +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/test-requirements.txt +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/travis.sh +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/Makefile +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/make.bat +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/TODO.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/_static/.gitkeep +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/acls.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/auth.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/client_protocol.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/code.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/command_line.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/common_protocol.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/conf.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/debugging.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/extend.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/history.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/index.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/model.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/overview.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/related.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/server_protocol.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/startup.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/translator.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/tutorial.rst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.scale.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.switch.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.timeslot.yml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/pathify.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/mktag +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/_config.yaml +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/_main.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/actor/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/actor/deletor.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/_test.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/password.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/root.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/mqtt.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/serf.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/code.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/codec.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/acl.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/auth.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/code.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/codec.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/data.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/dump/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/error.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/internal.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/log.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/server.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/type.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/config.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/data.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/errors.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/exceptions.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/mqtt.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/serf.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/tracer.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/model.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/obj/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/obj/command.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/server.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/types.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/dependency_links.txt +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/top_level.txt +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/current +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/env +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/init +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/recover +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/rotate +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-all +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-any +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-single +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/success +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/setup.cfg +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-recover.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-rotate.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-rotate.timer +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-all.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-all@.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-any.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-any@.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-single.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-single@.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv.service +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/postinst +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/sysusers +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/__init__.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/conftest.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/logging.cfg +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_basic.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_basic_serf.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_acl.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_allrunner.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_auth.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_code.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_config.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_convert.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_dh.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_mirror.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_runner.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_singlerunner.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_ssl.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_typecheck.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_kill.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_load_save.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_multi.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_passthru.py +0 -0
- {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_recover.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: moat-kv
|
3
|
-
Version: 0.70.
|
3
|
+
Version: 0.70.22
|
4
4
|
Summary: A distributed no-master key-value store
|
5
5
|
Author-email: Matthias Urlichs <matthias@urlichs.de>
|
6
6
|
Project-URL: homepage, https://m-o-a-t.org
|
@@ -21,10 +21,28 @@ Classifier: Topic :: Home Automation
|
|
21
21
|
Classifier: Topic :: System :: Distributed Computing
|
22
22
|
Requires-Python: >=3.8
|
23
23
|
Description-Content-Type: text/x-rst
|
24
|
-
Provides-Extra: dev
|
25
24
|
License-File: LICENSE
|
26
25
|
License-File: LICENSE.APACHE2
|
27
26
|
License-File: LICENSE.MIT
|
27
|
+
Requires-Dist: asyncclick>7.99
|
28
|
+
Requires-Dist: trio>=0.22
|
29
|
+
Requires-Dist: anyio>=4
|
30
|
+
Requires-Dist: range_set>=0.2
|
31
|
+
Requires-Dist: attrs>=22
|
32
|
+
Requires-Dist: asyncserf>=0.16
|
33
|
+
Requires-Dist: asyncactor>=0.24
|
34
|
+
Requires-Dist: asyncscope>=0.10.4
|
35
|
+
Requires-Dist: jsonschema>=2.5
|
36
|
+
Requires-Dist: ruyaml>=0.89
|
37
|
+
Requires-Dist: PyNaCl>=1.3
|
38
|
+
Requires-Dist: moat-lib-diffiehellman~=0.13.1.6
|
39
|
+
Requires-Dist: psutil
|
40
|
+
Requires-Dist: simpleeval>=0.9.10
|
41
|
+
Requires-Dist: moat-mqtt~=0.39.4
|
42
|
+
Requires-Dist: moat-util>=0.51.3
|
43
|
+
Requires-Dist: exceptiongroup; python_version < "3.11"
|
44
|
+
Provides-Extra: dev
|
45
|
+
Requires-Dist: moat-src>=0.5.0; extra == "dev"
|
28
46
|
|
29
47
|
=======
|
30
48
|
MoaT-KV
|
@@ -0,0 +1,168 @@
|
|
1
|
+
=================
|
2
|
+
MoaT-KV Version 3
|
3
|
+
=================
|
4
|
+
|
5
|
+
+++++++++
|
6
|
+
Rationale
|
7
|
+
+++++++++
|
8
|
+
|
9
|
+
The V2 servers worked, for the most part, but they had a couple of problems.
|
10
|
+
|
11
|
+
* sometimes there are strange deadlocks
|
12
|
+
|
13
|
+
* msgpack isn't that widely supported compared to CBOR
|
14
|
+
|
15
|
+
* the initial client/server negotiation isn't versioned
|
16
|
+
|
17
|
+
* the sync protocol is somewhat overengineered
|
18
|
+
|
19
|
+
* speed of updates is limited by the client>server>MQTT>server>client
|
20
|
+
chain; two possibly-high-load servers in between cause too much delay
|
21
|
+
|
22
|
+
* Messages tended to be more verbose than necessary
|
23
|
+
|
24
|
+
++++++++++++++++++
|
25
|
+
V3 design overview
|
26
|
+
++++++++++++++++++
|
27
|
+
|
28
|
+
Server start
|
29
|
+
++++++++++++
|
30
|
+
|
31
|
+
* connect to MQTT, listen to all MoaT messages,
|
32
|
+
update internal state as messages come in
|
33
|
+
|
34
|
+
* ask for a server link on the Join/Actor topic
|
35
|
+
|
36
|
+
* load the local backup if present
|
37
|
+
|
38
|
+
* fetch full tree from designated server is replied
|
39
|
+
|
40
|
+
* merge data
|
41
|
+
|
42
|
+
* Join actor topic
|
43
|
+
|
44
|
+
|
45
|
+
Client connection setup A
|
46
|
+
+++++++++++++++++++++++++
|
47
|
+
|
48
|
+
* Client connects to MQTT and sends Query message
|
49
|
+
* Designated server replies with connection data
|
50
|
+
* Client connects to server
|
51
|
+
|
52
|
+
* Server greets client
|
53
|
+
* Client authenticates
|
54
|
+
* Server sends MQTT connection information
|
55
|
+
* Client connects to MQTT and sends Birth message
|
56
|
+
* Server sees the client's message and sends ACK to the client
|
57
|
+
|
58
|
+
Client connection setup B
|
59
|
+
+++++++++++++++++++++++++
|
60
|
+
|
61
|
+
This method is slower; it can be used when the configured server doesn't work.
|
62
|
+
|
63
|
+
* Client connects to MQTT and sends Query message
|
64
|
+
* Designated server sends connection data
|
65
|
+
|
66
|
+
Reading initial data
|
67
|
+
++++++++++++++++++++
|
68
|
+
|
69
|
+
* Client subscribes to MQTT topic
|
70
|
+
* Client requests initial data from server
|
71
|
+
* Server sends data, advises client that no data exist, or tells the client
|
72
|
+
that MQTT uses retaining (if so, which codec to use)
|
73
|
+
|
74
|
+
Updates
|
75
|
+
+++++++
|
76
|
+
|
77
|
+
The most notable pain point of the old design is the speed of updates.
|
78
|
+
Thus in V3 all updates will be MQTT messages.
|
79
|
+
|
80
|
+
This section does not apply if the MQTT server retains the data.
|
81
|
+
|
82
|
+
MoaT update messages are CBOR maps. Keys are small integers for message brevity and
|
83
|
+
decode speed.
|
84
|
+
|
85
|
+
* 0: tock
|
86
|
+
|
87
|
+
The system-wide update counter. May be missing.
|
88
|
+
|
89
|
+
* 1: value
|
90
|
+
|
91
|
+
Contents: Whatever is CBOR-encodeable. A missing value means that the
|
92
|
+
object shall be deleted.
|
93
|
+
|
94
|
+
* 2: tick.
|
95
|
+
|
96
|
+
Update tracker. This is a ``((name, seq, counter), …)`` list of tuples.
|
97
|
+
|
98
|
+
* name
|
99
|
+
The server's name
|
100
|
+
|
101
|
+
* seq
|
102
|
+
Client connection. Zero is reserved for server-generated content.
|
103
|
+
|
104
|
+
* counter
|
105
|
+
A per-client update counter, managed by the client. Must start at 1 and
|
106
|
+
increment in steps of 1, in order to detect skipped updates.
|
107
|
+
|
108
|
+
|
109
|
+
The server sees the update and sends an ACK message to the client, assuming
|
110
|
+
that there was no conflict.
|
111
|
+
|
112
|
+
|
113
|
+
Skipped updates
|
114
|
+
+++++++++++++++
|
115
|
+
|
116
|
+
Servers listen to all messages. If there's a gap in a client's sequence
|
117
|
+
numbers, the server will ask it to repeat the message.
|
118
|
+
|
119
|
+
|
120
|
+
Update conflict resolution
|
121
|
+
++++++++++++++++++++++++++
|
122
|
+
|
123
|
+
If a client sends a message which the server determines
|
124
|
+
|
125
|
+
|
126
|
+
MQTT topics
|
127
|
+
+++++++++++
|
128
|
+
|
129
|
+
All are under a common configured prefix, the default is "moat/main".
|
130
|
+
|
131
|
+
svc/act
|
132
|
+
-------
|
133
|
+
|
134
|
+
The Actor topic for server identification.
|
135
|
+
|
136
|
+
The transmitted value contains the server's name, host and port.
|
137
|
+
|
138
|
+
|
139
|
+
svc/query
|
140
|
+
---------
|
141
|
+
|
142
|
+
Connect requests from clients.
|
143
|
+
|
144
|
+
svc/server
|
145
|
+
----------
|
146
|
+
|
147
|
+
Reply queue for messages to ``svc/query``. Contains the server value as
|
148
|
+
above.
|
149
|
+
|
150
|
+
|
151
|
+
d/*
|
152
|
+
---
|
153
|
+
|
154
|
+
Update messages.
|
155
|
+
|
156
|
+
Topic translation
|
157
|
+
+++++++++++++++++
|
158
|
+
|
159
|
+
Topics are encoded like MoaT paths, except for these differences:
|
160
|
+
|
161
|
+
* The path separator is ``/`` instead of ``.``
|
162
|
+
* Slashes are escaped as ``:_``.
|
163
|
+
* Spaces in paths are never escaped: that would collide with the previous rule
|
164
|
+
* Dots are not escaped, obviously.
|
165
|
+
* `None` is encoded as "$NULL" when it's a top-level element.
|
166
|
+
* The sequence ``:.`` is used to shield both wildcards and strings with a
|
167
|
+
leading ``$`` character. It translates back to an empty string, not a
|
168
|
+
dot, and may be treated as an illegal sequence otherwise.
|
@@ -246,7 +246,7 @@ class StreamedRequest:
|
|
246
246
|
async def __anext__(self):
|
247
247
|
try:
|
248
248
|
res = await self.qr.get()
|
249
|
-
except (anyio.EndOfStream, anyio.ClosedResourceError):
|
249
|
+
except (anyio.EndOfStream, anyio.ClosedResourceError, EOFError):
|
250
250
|
raise StopAsyncIteration
|
251
251
|
except CancelledError:
|
252
252
|
raise StopAsyncIteration # just terminate
|
@@ -274,7 +274,7 @@ class StreamedRequest:
|
|
274
274
|
async def cancel(self):
|
275
275
|
try:
|
276
276
|
await self.qr.put_error(CancelledError())
|
277
|
-
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
|
277
|
+
except (anyio.BrokenResourceError, anyio.ClosedResourceError, EOFError):
|
278
278
|
pass
|
279
279
|
else:
|
280
280
|
try:
|
@@ -70,7 +70,7 @@ async def at_cli(ctx, path):
|
|
70
70
|
|
71
71
|
if ctx.invoked_subcommand is None:
|
72
72
|
res = await obj.client.get(obj.path + path, nchain=obj.meta)
|
73
|
-
yprint(res if obj.meta else res.value, stream=obj.stdout)
|
73
|
+
yprint(res if obj.meta else res.value if 'value' in res else None, stream=obj.stdout)
|
74
74
|
|
75
75
|
|
76
76
|
@cli.command("info")
|
@@ -120,7 +120,6 @@ for _c in (
|
|
120
120
|
CompleteState,
|
121
121
|
ActorState,
|
122
122
|
BrokenState,
|
123
|
-
NotGiven,
|
124
123
|
TimerMsg,
|
125
124
|
ReadyMsg,
|
126
125
|
ChangeMsg,
|
@@ -130,6 +129,7 @@ for _c in (
|
|
130
129
|
):
|
131
130
|
_CLASSES[_c.__name__] = _c
|
132
131
|
|
132
|
+
_CLASSES["NotGiven"] = NotGiven # ellipsis
|
133
133
|
|
134
134
|
class CallAdmin:
|
135
135
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: moat-kv
|
3
|
-
Version: 0.70.
|
3
|
+
Version: 0.70.22
|
4
4
|
Summary: A distributed no-master key-value store
|
5
5
|
Author-email: Matthias Urlichs <matthias@urlichs.de>
|
6
6
|
Project-URL: homepage, https://m-o-a-t.org
|
@@ -21,10 +21,28 @@ Classifier: Topic :: Home Automation
|
|
21
21
|
Classifier: Topic :: System :: Distributed Computing
|
22
22
|
Requires-Python: >=3.8
|
23
23
|
Description-Content-Type: text/x-rst
|
24
|
-
Provides-Extra: dev
|
25
24
|
License-File: LICENSE
|
26
25
|
License-File: LICENSE.APACHE2
|
27
26
|
License-File: LICENSE.MIT
|
27
|
+
Requires-Dist: asyncclick>7.99
|
28
|
+
Requires-Dist: trio>=0.22
|
29
|
+
Requires-Dist: anyio>=4
|
30
|
+
Requires-Dist: range_set>=0.2
|
31
|
+
Requires-Dist: attrs>=22
|
32
|
+
Requires-Dist: asyncserf>=0.16
|
33
|
+
Requires-Dist: asyncactor>=0.24
|
34
|
+
Requires-Dist: asyncscope>=0.10.4
|
35
|
+
Requires-Dist: jsonschema>=2.5
|
36
|
+
Requires-Dist: ruyaml>=0.89
|
37
|
+
Requires-Dist: PyNaCl>=1.3
|
38
|
+
Requires-Dist: moat-lib-diffiehellman~=0.13.1.6
|
39
|
+
Requires-Dist: psutil
|
40
|
+
Requires-Dist: simpleeval>=0.9.10
|
41
|
+
Requires-Dist: moat-mqtt~=0.39.4
|
42
|
+
Requires-Dist: moat-util>=0.51.3
|
43
|
+
Requires-Dist: exceptiongroup; python_version < "3.11"
|
44
|
+
Provides-Extra: dev
|
45
|
+
Requires-Dist: moat-src>=0.5.0; extra == "dev"
|
28
46
|
|
29
47
|
=======
|
30
48
|
MoaT-KV
|
@@ -45,6 +45,7 @@ async def test_81_basic(autojump_clock): # pylint: disable=unused-argument
|
|
45
45
|
@pytest.mark.trio
|
46
46
|
@pytest.mark.xfail
|
47
47
|
async def test_82_many(autojump_clock): # pylint: disable=unused-argument
|
48
|
+
pytest.skip("broken")
|
48
49
|
async with stdtest(args={"init": 123}, tocks=80) as st:
|
49
50
|
assert st is not None
|
50
51
|
async with st.client() as cx, st.client() as cy, st.client() as cz:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|