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.
Files changed (140) hide show
  1. {moat-kv-0.70.19 → moat_kv-0.70.22}/.gitmodules +3 -0
  2. {moat-kv-0.70.19 → moat_kv-0.70.22}/PKG-INFO +20 -2
  3. moat_kv-0.70.22/docs/source/v3.rst +168 -0
  4. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/client.py +2 -2
  5. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/job.py +1 -1
  6. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/runner.py +1 -1
  7. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/PKG-INFO +20 -2
  8. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/SOURCES.txt +1 -0
  9. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/requires.txt +1 -1
  10. {moat-kv-0.70.19 → moat_kv-0.70.22}/pyproject.toml +1 -1
  11. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_error.py +1 -0
  12. {moat-kv-0.70.19 → moat_kv-0.70.22}/.appveyor.yml +0 -0
  13. {moat-kv-0.70.19 → moat_kv-0.70.22}/.coveragerc +0 -0
  14. {moat-kv-0.70.19 → moat_kv-0.70.22}/.gitignore +0 -0
  15. {moat-kv-0.70.19 → moat_kv-0.70.22}/.pylintrc +0 -0
  16. {moat-kv-0.70.19 → moat_kv-0.70.22}/.readthedocs.yml +0 -0
  17. {moat-kv-0.70.19 → moat_kv-0.70.22}/.travis.yml +0 -0
  18. {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE +0 -0
  19. {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE.APACHE2 +0 -0
  20. {moat-kv-0.70.19 → moat_kv-0.70.22}/LICENSE.MIT +0 -0
  21. {moat-kv-0.70.19 → moat_kv-0.70.22}/MANIFEST.in +0 -0
  22. {moat-kv-0.70.19 → moat_kv-0.70.22}/Makefile +0 -0
  23. {moat-kv-0.70.19 → moat_kv-0.70.22}/README.rst +0 -0
  24. {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/rtd-requirements.txt +0 -0
  25. {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/test-requirements.txt +0 -0
  26. {moat-kv-0.70.19 → moat_kv-0.70.22}/ci/travis.sh +0 -0
  27. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/Makefile +0 -0
  28. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/make.bat +0 -0
  29. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/TODO.rst +0 -0
  30. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/_static/.gitkeep +0 -0
  31. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/acls.rst +0 -0
  32. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/auth.rst +0 -0
  33. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/client_protocol.rst +0 -0
  34. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/code.rst +0 -0
  35. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/command_line.rst +0 -0
  36. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/common_protocol.rst +0 -0
  37. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/conf.py +0 -0
  38. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/debugging.rst +0 -0
  39. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/extend.rst +0 -0
  40. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/history.rst +0 -0
  41. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/index.rst +0 -0
  42. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/model.rst +0 -0
  43. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/overview.rst +0 -0
  44. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/related.rst +0 -0
  45. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/server_protocol.rst +0 -0
  46. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/startup.rst +0 -0
  47. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/translator.rst +0 -0
  48. {moat-kv-0.70.19 → moat_kv-0.70.22}/docs/source/tutorial.rst +0 -0
  49. {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.scale.yml +0 -0
  50. {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.switch.yml +0 -0
  51. {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/code/transform.timeslot.yml +0 -0
  52. {moat-kv-0.70.19 → moat_kv-0.70.22}/examples/pathify.py +0 -0
  53. {moat-kv-0.70.19 → moat_kv-0.70.22}/mktag +0 -0
  54. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/__init__.py +0 -0
  55. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/__init__.py +0 -0
  56. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/_config.yaml +0 -0
  57. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/_main.py +0 -0
  58. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/actor/__init__.py +0 -0
  59. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/actor/deletor.py +0 -0
  60. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/__init__.py +0 -0
  61. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/_test.py +0 -0
  62. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/password.py +0 -0
  63. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/auth/root.py +0 -0
  64. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/__init__.py +0 -0
  65. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/mqtt.py +0 -0
  66. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/backend/serf.py +0 -0
  67. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/code.py +0 -0
  68. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/codec.py +0 -0
  69. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/__init__.py +0 -0
  70. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/acl.py +0 -0
  71. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/auth.py +0 -0
  72. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/code.py +0 -0
  73. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/codec.py +0 -0
  74. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/data.py +0 -0
  75. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/dump/__init__.py +0 -0
  76. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/error.py +0 -0
  77. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/internal.py +0 -0
  78. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/log.py +0 -0
  79. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/server.py +0 -0
  80. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/command/type.py +0 -0
  81. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/config.py +0 -0
  82. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/data.py +0 -0
  83. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/errors.py +0 -0
  84. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/exceptions.py +0 -0
  85. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/__init__.py +0 -0
  86. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/mqtt.py +0 -0
  87. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/serf.py +0 -0
  88. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/mock/tracer.py +0 -0
  89. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/model.py +0 -0
  90. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/obj/__init__.py +0 -0
  91. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/obj/command.py +0 -0
  92. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/server.py +0 -0
  93. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat/kv/types.py +0 -0
  94. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/dependency_links.txt +0 -0
  95. {moat-kv-0.70.19 → moat_kv-0.70.22}/moat_kv.egg-info/top_level.txt +0 -0
  96. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/current +0 -0
  97. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/env +0 -0
  98. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/init +0 -0
  99. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/recover +0 -0
  100. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/rotate +0 -0
  101. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run +0 -0
  102. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-all +0 -0
  103. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-any +0 -0
  104. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/run-single +0 -0
  105. {moat-kv-0.70.19 → moat_kv-0.70.22}/scripts/success +0 -0
  106. {moat-kv-0.70.19 → moat_kv-0.70.22}/setup.cfg +0 -0
  107. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-recover.service +0 -0
  108. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-rotate.service +0 -0
  109. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-rotate.timer +0 -0
  110. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-all.service +0 -0
  111. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-all@.service +0 -0
  112. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-any.service +0 -0
  113. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-any@.service +0 -0
  114. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-single.service +0 -0
  115. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv-run-single@.service +0 -0
  116. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/moat-kv.service +0 -0
  117. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/postinst +0 -0
  118. {moat-kv-0.70.19 → moat_kv-0.70.22}/systemd/sysusers +0 -0
  119. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/__init__.py +0 -0
  120. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/conftest.py +0 -0
  121. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/logging.cfg +0 -0
  122. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_basic.py +0 -0
  123. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_basic_serf.py +0 -0
  124. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_acl.py +0 -0
  125. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_allrunner.py +0 -0
  126. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_auth.py +0 -0
  127. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_code.py +0 -0
  128. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_config.py +0 -0
  129. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_convert.py +0 -0
  130. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_dh.py +0 -0
  131. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_mirror.py +0 -0
  132. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_runner.py +0 -0
  133. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_singlerunner.py +0 -0
  134. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_ssl.py +0 -0
  135. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_feature_typecheck.py +0 -0
  136. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_kill.py +0 -0
  137. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_load_save.py +0 -0
  138. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_multi.py +0 -0
  139. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_passthru.py +0 -0
  140. {moat-kv-0.70.19 → moat_kv-0.70.22}/tests/test_recover.py +0 -0
@@ -19,3 +19,6 @@
19
19
  [submodule "ext/wago"]
20
20
  path = ext/wago
21
21
  url = git://git.smurf.noris.de/moat-kv-wago.git
22
+ [submodule "ext/cal"]
23
+ path = ext/cal
24
+ url = git://git.smurf.noris.de/moat-kv-cal.git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: moat-kv
3
- Version: 0.70.19
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.19
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
@@ -37,6 +37,7 @@ docs/source/server_protocol.rst
37
37
  docs/source/startup.rst
38
38
  docs/source/translator.rst
39
39
  docs/source/tutorial.rst
40
+ docs/source/v3.rst
40
41
  docs/source/_static/.gitkeep
41
42
  examples/pathify.py
42
43
  examples/code/transform.scale.yml
@@ -8,7 +8,7 @@ attrs>=22
8
8
  jsonschema>=2.5
9
9
  moat-lib-diffiehellman~=0.13.1.6
10
10
  moat-mqtt~=0.39.4
11
- moat-util~=0.35.0
11
+ moat-util>=0.51.3
12
12
  psutil
13
13
  range_set>=0.2
14
14
  ruyaml>=0.89
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "psutil",
36
36
  "simpleeval >= 0.9.10",
37
37
  "moat-mqtt ~= 0.39.4",
38
- "moat-util ~= 0.35.0",
38
+ "moat-util >= 0.51.3",
39
39
  "exceptiongroup; python_version<'3.11'",
40
40
  ]
41
41
  dynamic = [ "version",]
@@ -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