wunderspec 0.129.7__tar.gz → 0.129.8__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 (147) hide show
  1. {wunderspec-0.129.7 → wunderspec-0.129.8}/PKG-INFO +3 -3
  2. {wunderspec-0.129.7 → wunderspec-0.129.8}/README.md +2 -2
  3. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/wunderspec-five-minutes.md +36 -2
  4. {wunderspec-0.129.7 → wunderspec-0.129.8}/pyproject.toml +1 -1
  5. {wunderspec-0.129.7 → wunderspec-0.129.8}/tests/README.md +4 -4
  6. {wunderspec-0.129.7 → wunderspec-0.129.8}/uv.lock +1 -1
  7. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/__init__.py +1 -1
  8. {wunderspec-0.129.7 → wunderspec-0.129.8}/.devcontainer/Dockerfile +0 -0
  9. {wunderspec-0.129.7 → wunderspec-0.129.8}/.devcontainer/devcontainer.json +0 -0
  10. {wunderspec-0.129.7 → wunderspec-0.129.8}/.devcontainer/post-create.sh +0 -0
  11. {wunderspec-0.129.7 → wunderspec-0.129.8}/.flake8 +0 -0
  12. {wunderspec-0.129.7 → wunderspec-0.129.8}/.github/workflows/build.yml +0 -0
  13. {wunderspec-0.129.7 → wunderspec-0.129.8}/.github/workflows/convert-to-tla.yml +0 -0
  14. {wunderspec-0.129.7 → wunderspec-0.129.8}/.github/workflows/lint.yml +0 -0
  15. {wunderspec-0.129.7 → wunderspec-0.129.8}/.github/workflows/publish.yml +0 -0
  16. {wunderspec-0.129.7 → wunderspec-0.129.8}/.github/workflows/run-examples.yml +0 -0
  17. {wunderspec-0.129.7 → wunderspec-0.129.8}/.gitignore +0 -0
  18. {wunderspec-0.129.7 → wunderspec-0.129.8}/CONTRIBUTING.md +0 -0
  19. {wunderspec-0.129.7 → wunderspec-0.129.8}/LICENSE +0 -0
  20. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/README.md +0 -0
  21. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-avatar-github-1024.png +0 -0
  22. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-avatar-github-256.png +0 -0
  23. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-avatar-github-512.png +0 -0
  24. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-icon-circle-dark-1024.png +0 -0
  25. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-icon-circle-dark-512.png +0 -0
  26. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-icon-circle-transparent-1024.png +0 -0
  27. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-lockup-horizontal-dark-1600.png +0 -0
  28. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-lockup-horizontal-dark-800.png +0 -0
  29. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-mark-transparent-1024.png +0 -0
  30. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-readme-header-dark-1200x480.png +0 -0
  31. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-readme-header-dark-1600x640.png +0 -0
  32. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-social-preview-1280x640.png +0 -0
  33. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/png/wunderspec-wordmark-transparent-900.png +0 -0
  34. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-avatar-github.svg +0 -0
  35. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-icon-circle-dark.svg +0 -0
  36. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-icon-circle-transparent.svg +0 -0
  37. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-lockup-horizontal-dark.svg +0 -0
  38. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-lockup-horizontal-transparent.svg +0 -0
  39. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-mark-transparent.svg +0 -0
  40. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-readme-header-dark.svg +0 -0
  41. {wunderspec-0.129.7 → wunderspec-0.129.8}/assets/design/svg/wunderspec-wordmark-transparent.svg +0 -0
  42. {wunderspec-0.129.7 → wunderspec-0.129.8}/basedpyrightconfig.json +0 -0
  43. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/references/from-quint-llms.md +0 -0
  44. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/references/from-tla-llms.md +0 -0
  45. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/booleans.md +0 -0
  46. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/cheatsheet.html +0 -0
  47. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/comprehensions.md +0 -0
  48. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/decorators.md +0 -0
  49. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/enums.md +0 -0
  50. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/flow.md +0 -0
  51. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/integers.md +0 -0
  52. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/lists.md +0 -0
  53. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/maps.md +0 -0
  54. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/records.md +0 -0
  55. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/sets.md +0 -0
  56. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/state-machine.md +0 -0
  57. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/strings.md +0 -0
  58. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/temporal.md +0 -0
  59. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/tuples.md +0 -0
  60. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-references/unions.md +0 -0
  61. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-stories/bobs_log.md +0 -0
  62. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-stories/bobs_log.png +0 -0
  63. {wunderspec-0.129.7 → wunderspec-0.129.8}/docs/user-stories/img/bob.png +0 -0
  64. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/bags.py +0 -0
  65. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/bakery.py +0 -0
  66. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/bakery_walk.py +0 -0
  67. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/ben_or.py +0 -0
  68. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/channel.py +0 -0
  69. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/dekker.py +0 -0
  70. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/epfd.py +0 -0
  71. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/examples.yaml +0 -0
  72. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/fifo.py +0 -0
  73. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/fpaxos.py +0 -0
  74. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/kv_store.py +0 -0
  75. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/lamport_mutex.py +0 -0
  76. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/ledger.py +0 -0
  77. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/minimmit.py +0 -0
  78. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/payment.py +0 -0
  79. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/producer_consumer.py +0 -0
  80. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/readers_writers.py +0 -0
  81. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/readers_writers_walk.py +0 -0
  82. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/simple_ponzi.py +0 -0
  83. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/simple_ponzi_machine.py +0 -0
  84. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/simple_ponzi_machine_walk.py +0 -0
  85. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/simple_wal1.py +0 -0
  86. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/simple_wal2.py +0 -0
  87. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/sliding_puzzles.py +0 -0
  88. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/sloppy_counter.py +0 -0
  89. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/test_simple_ponzi_machine.py +0 -0
  90. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/tiny_workers.py +0 -0
  91. {wunderspec-0.129.7 → wunderspec-0.129.8}/examples/two_phase.py +0 -0
  92. {wunderspec-0.129.7 → wunderspec-0.129.8}/pyrightconfig.json +0 -0
  93. {wunderspec-0.129.7 → wunderspec-0.129.8}/scripts/__init__.py +0 -0
  94. {wunderspec-0.129.7 → wunderspec-0.129.8}/scripts/_spec_utils.py +0 -0
  95. {wunderspec-0.129.7 → wunderspec-0.129.8}/scripts/convert_examples_to_tla.py +0 -0
  96. {wunderspec-0.129.7 → wunderspec-0.129.8}/scripts/run_examples.py +0 -0
  97. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/__main__.py +0 -0
  98. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/_edition.py +0 -0
  99. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/apalache.py +0 -0
  100. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/api.py +0 -0
  101. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/__init__.py +0 -0
  102. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/action_ast.py +0 -0
  103. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/ast.py +0 -0
  104. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/list_ast.py +0 -0
  105. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/map_ast.py +0 -0
  106. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/record_ast.py +0 -0
  107. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/serialization.py +0 -0
  108. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/set_ast.py +0 -0
  109. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/sorts.py +0 -0
  110. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/temporal_ast.py +0 -0
  111. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/terms.py +0 -0
  112. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/tuple_ast.py +0 -0
  113. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/ast/union_ast.py +0 -0
  114. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/cli.py +0 -0
  115. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/dev_debug.py +0 -0
  116. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/doc_format.py +0 -0
  117. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/errors.py +0 -0
  118. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/exec/__init__.py +0 -0
  119. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/exec/action_exec.py +0 -0
  120. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/exec/context.py +0 -0
  121. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/exec/scheduler.py +0 -0
  122. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/explain.py +0 -0
  123. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/expr.py +0 -0
  124. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/flow.py +0 -0
  125. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/fuzzer.py +0 -0
  126. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/interpreter.py +0 -0
  127. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/interpreter_sampling.py +0 -0
  128. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/interpreter_value.py +0 -0
  129. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/itf_trace.py +0 -0
  130. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/lang.py +0 -0
  131. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/linter.py +0 -0
  132. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/machine.py +0 -0
  133. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/model_checker.py +0 -0
  134. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/permutation.py +0 -0
  135. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/petnames.py +0 -0
  136. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/pretty.py +0 -0
  137. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/py.typed +0 -0
  138. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/quint_convert.py +0 -0
  139. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/random_walk.py +0 -0
  140. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/source_tracking.py +0 -0
  141. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/submachine.py +0 -0
  142. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/sym_context.py +0 -0
  143. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/tla.py +0 -0
  144. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/tlc.py +0 -0
  145. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/tlc_trace.py +0 -0
  146. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/trace_output.py +0 -0
  147. {wunderspec-0.129.7 → wunderspec-0.129.8}/wunderspec/uniq_names.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wunderspec
3
- Version: 0.129.7
3
+ Version: 0.129.8
4
4
  Summary: Protocol specifications as Python code
5
5
  Author: Igor Konnov, Thomas Pani
6
6
  License-File: LICENSE
@@ -90,8 +90,8 @@ commands are not included in this package.
90
90
 
91
91
  ## 4. Release Provenance
92
92
 
93
- - Release tag: `v0.129.7`
94
- - Source commit: `9f7d0c21b38bc84e2c830dd2d0b238d5de34d78a`
93
+ - Release tag: `v0.129.8`
94
+ - Source commit: `370a2fc4ee7aa0311e6df15487d0f2079e6f148e`
95
95
 
96
96
  See [tests/README.md][] for the development test log captured at release time.
97
97
 
@@ -74,8 +74,8 @@ commands are not included in this package.
74
74
 
75
75
  ## 4. Release Provenance
76
76
 
77
- - Release tag: `v0.129.7`
78
- - Source commit: `9f7d0c21b38bc84e2c830dd2d0b238d5de34d78a`
77
+ - Release tag: `v0.129.8`
78
+ - Source commit: `370a2fc4ee7aa0311e6df15487d0f2079e6f148e`
79
79
 
80
80
  See [tests/README.md][] for the development test log captured at release time.
81
81
 
@@ -105,10 +105,44 @@ currently has three kinds of properties:
105
105
 
106
106
  **Immutability.** While the Wunderspec state machines mutate the state,
107
107
  the expressions operate over immutable data structures. For the data
108
- structures, see the [Cheatsheet][cheatsheet].
108
+ structures, see the [Cheatsheet][cheatsheet]. You can still specify mutable
109
+ data structures in Wunderspec!
110
+
111
+ **Python DSL.** Wunderspec is a Python DSL for writing state machines. As a
112
+ result, you get plenty of Python goodies automatically:
113
+
114
+ - Syntax highlighting, code completion, and linting in your favorite IDE.
115
+
116
+ - Opinionated code formatting and optional type checking with [mypy][].
117
+
118
+ - REPL with [IPython][] and debugging with [pdb][].
119
+
120
+ - package management with [uv][] (well, let's say this is good!).
121
+
122
+ - Many high-level constructs and idioms from Python.
123
+
124
+ - You can use Python as a meta-language or a macroprocessor to generate
125
+ Wunderspec code.
126
+
127
+ Since Wunderspec is a DSL, it comes with a few warnings:
128
+
129
+ - Your Python code actually acts as a transpiler! When it runs, it produces an
130
+ internal abstract syntax tree (AST) of Wunderspec. For example, local
131
+ declarations are *lazy* by default, this can be fixed with `c.cache(...)`. Run
132
+ `wunderspec lint` to find the common footguns.
133
+
134
+ - A subset of Python code makes sense in Wunderspec. For example, you should
135
+ not use `if` and `for` directly in your actions. Instead, use
136
+ `c.alternatives(...)`, `c.one_of(...)`, and `c.split(...)`.
137
+
138
+ - Always check the [Cheatsheet][cheatsheet], to see what works.
109
139
 
110
140
 
111
141
  [sloppy_counter]: https://github.com/wunderspec/wunderspec/blob/main/examples/sloppy_counter.py
112
142
  [ledger]: https://github.com/wunderspec/wunderspec/blob/main/examples/ledger.py
113
143
  [simple_wal1]: https://github.com/wunderspec/wunderspec/blob/main/examples/simple_wal1.py
114
- [cheatsheet]: https://wunderspec.com/cheatsheet
144
+ [cheatsheet]: https://wunderspec.com/cheatsheet
145
+ [mypy]: https://mypy.readthedocs.io/en/stable/
146
+ [IPython]: https://ipython.org/
147
+ [pdb]: https://docs.python.org/3/library/pdb.html
148
+ [uv]: https://docs.astral.sh/uv/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "wunderspec"
3
- version = "0.129.7"
3
+ version = "0.129.8"
4
4
  description = "Protocol specifications as Python code"
5
5
  authors = [
6
6
  {name = "Igor Konnov"},
@@ -6,9 +6,9 @@ public distribution to keep the package focused. The full development
6
6
 
7
7
  ## Release Provenance
8
8
 
9
- - Release tag: `v0.129.7`
10
- - Source commit: `9f7d0c21b38bc84e2c830dd2d0b238d5de34d78a`
11
- - Test log captured at: `2026-06-16T19:26:12Z`
9
+ - Release tag: `v0.129.8`
10
+ - Source commit: `370a2fc4ee7aa0311e6df15487d0f2079e6f148e`
11
+ - Test log captured at: `2026-06-17T06:53:18Z`
12
12
  - `make test` exit code: `0`
13
13
 
14
14
  ## Full Test Log From the Development Repository
@@ -124,5 +124,5 @@ tests/test_tla.py ...................................................... [ 94%]
124
124
  tests/test_tlc_trace.py .... [ 98%]
125
125
  tests/test_trace_output.py ......................... [100%]
126
126
 
127
- ====================== 2344 passed, 11 skipped in 29.78s =======================
127
+ ====================== 2344 passed, 11 skipped in 29.38s =======================
128
128
  ```
@@ -1781,7 +1781,7 @@ wheels = [
1781
1781
 
1782
1782
  [[package]]
1783
1783
  name = "wunderspec"
1784
- version = "0.129.7"
1784
+ version = "0.129.8"
1785
1785
  source = { editable = "." }
1786
1786
  dependencies = [
1787
1787
  { name = "executing" },
@@ -144,7 +144,7 @@ from .random_walk import state_view
144
144
  from .source_tracking import enable_source_tracking
145
145
  from .submachine import SubMachine
146
146
 
147
- __version__ = "0.129.7"
147
+ __version__ = "0.129.8"
148
148
 
149
149
  __all__ = [
150
150
  # Constructor functions
File without changes
File without changes
File without changes