baisilisp 0.5.2.dev1__tar.gz → 0.5.2.dev11__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.
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/PKG-INFO +1 -1
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/pyproject.toml +17 -1
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/Cargo.lock +1 -1
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/Cargo.toml +1 -1
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/core_server.py +5 -2
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/prepl_server.py +4 -2
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/pytest/testrunner.py +4 -18
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core.lpy +15 -10
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/generator.py +2 -1
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/map.py +8 -6
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/runtime.py +16 -12
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/set.py +10 -3
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/project.py +4 -3
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test.lpy +28 -4
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/LICENSE +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/README.md +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/interfaces.rs +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/mod.rs +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/seq.rs +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/lib.rs +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/_lang/__init__.pyi +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/_lang/seq.pyi +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/cli.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/concurrent.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/concurrent_channel.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/attrs.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/bencode.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/dataclasses.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/nrepl_server.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/prepl.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/pytest/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/repl_session.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/autodoc.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/domain.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/linkcode.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core/protocols.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core/server.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/csv.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/data/csv.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/data.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/datafy.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/edn.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/importer.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/instant.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/io.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/java/process.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/json.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/agent.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/atom.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/attrs.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/analyzer.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/constants.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/exception.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/nodes.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/optimizer.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/utils.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/dataclass.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/delay.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/diagnostics.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/exception.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/futures.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/instant.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/interfaces.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/keyword.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/list.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/multifn.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/numbers.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/obj.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/promise.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/queue.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reader.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reduced.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reference.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/regex.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/seq.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/source.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/spec.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/stm.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/symbol.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/tagged.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/typing.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/util.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/vector.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/volatile.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/logconfig.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/main.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/math.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/portability.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/pprint.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/process.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/prompt.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/py.typed +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/reducers.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/reflect.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/repl.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/set.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/shell.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/sitecustomize.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/alpha.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/test/alpha.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/stacktrace.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/stm.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/string.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/template.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test/fixtures.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test/tap.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/tools/__init__.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/tools/cli.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/url.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/util.py +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/walk.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/xml.lpy +0 -0
- {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/zip.lpy +0 -0
|
@@ -3,7 +3,7 @@ name = "baisilisp"
|
|
|
3
3
|
# The declared version is the next stable release. Successful main builds use
|
|
4
4
|
# a CI-generated ``.devN`` version; a published GitHub release must use this
|
|
5
5
|
# exact value without its leading ``v``.
|
|
6
|
-
version = "0.5.2.
|
|
6
|
+
version = "0.5.2.dev11"
|
|
7
7
|
description = "BaisiLisp: a compatibility-focused Basilisp fork hosted on Python 3 with seamless Python interop."
|
|
8
8
|
authors = [
|
|
9
9
|
{ name = "Christopher Rink", email = "chris@crink.dev" },
|
|
@@ -203,15 +203,21 @@ logging-format-style = "new"
|
|
|
203
203
|
[tool.pylint."messages control"]
|
|
204
204
|
disable = [
|
|
205
205
|
"bad-inline-option",
|
|
206
|
+
"abstract-class-instantiated",
|
|
207
|
+
"broad-exception-caught",
|
|
208
|
+
"consider-merging-isinstance",
|
|
206
209
|
"consider-using-assignment-expr",
|
|
207
210
|
"deprecated-pragma",
|
|
208
211
|
"docstring-first-line-empty",
|
|
209
212
|
"duplicate-code",
|
|
213
|
+
"exec-used",
|
|
210
214
|
"file-ignored",
|
|
211
215
|
"fixme",
|
|
212
216
|
"global-statement",
|
|
213
217
|
"implicit-str-concat",
|
|
218
|
+
"import-private-name",
|
|
214
219
|
"import-outside-toplevel",
|
|
220
|
+
"inconsistent-return-statements",
|
|
215
221
|
"invalid-name",
|
|
216
222
|
"len-as-condition",
|
|
217
223
|
"line-too-long",
|
|
@@ -225,6 +231,7 @@ disable = [
|
|
|
225
231
|
"no-else-continue",
|
|
226
232
|
"no-else-raise",
|
|
227
233
|
"no-else-return",
|
|
234
|
+
"no-value-for-parameter",
|
|
228
235
|
"protected-access",
|
|
229
236
|
"raw-checker-failed",
|
|
230
237
|
"redefined-outer-name",
|
|
@@ -232,10 +239,18 @@ disable = [
|
|
|
232
239
|
"suppressed-message",
|
|
233
240
|
"too-few-public-methods",
|
|
234
241
|
"too-many-ancestors",
|
|
242
|
+
"too-many-arguments",
|
|
243
|
+
"too-many-boolean-expressions",
|
|
244
|
+
"too-many-branches",
|
|
235
245
|
"too-many-public-methods",
|
|
236
246
|
"too-many-instance-attributes",
|
|
247
|
+
"too-many-locals",
|
|
248
|
+
"too-many-nested-blocks",
|
|
237
249
|
"too-many-positional-arguments",
|
|
250
|
+
"too-many-return-statements",
|
|
251
|
+
"too-many-statements",
|
|
238
252
|
"trailing-whitespace",
|
|
253
|
+
"unidiomatic-typecheck",
|
|
239
254
|
"unnecessary-lambda-assignment",
|
|
240
255
|
"unspecified-encoding",
|
|
241
256
|
"useless-import-alias",
|
|
@@ -254,6 +269,7 @@ warn_unused_ignores = true
|
|
|
254
269
|
|
|
255
270
|
[[tool.mypy.overrides]]
|
|
256
271
|
module = [
|
|
272
|
+
"_pytest.*",
|
|
257
273
|
"prompt_toolkit.*",
|
|
258
274
|
"pygments.*",
|
|
259
275
|
"pytest.*",
|
|
@@ -7,9 +7,12 @@ import socketserver
|
|
|
7
7
|
import threading
|
|
8
8
|
|
|
9
9
|
if not hasattr(builtins, "_basilisp_core_server_registry"):
|
|
10
|
-
builtins._basilisp_core_server_registry = (
|
|
10
|
+
builtins._basilisp_core_server_registry = ( # type: ignore[attr-defined]
|
|
11
|
+
threading.RLock(),
|
|
12
|
+
{},
|
|
13
|
+
)
|
|
11
14
|
|
|
12
|
-
_LOCK, _SERVERS = builtins._basilisp_core_server_registry
|
|
15
|
+
_LOCK, _SERVERS = builtins._basilisp_core_server_registry # type: ignore[attr-defined]
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
def register_and_start(
|
|
@@ -56,7 +56,7 @@ class SeekableTextReader(io.TextIOBase):
|
|
|
56
56
|
self._position += len(value)
|
|
57
57
|
return value
|
|
58
58
|
|
|
59
|
-
def readline(self, size: int | None = -1) -> str:
|
|
59
|
+
def readline(self, size: int | None = -1) -> str: # type: ignore[override]
|
|
60
60
|
"""Read one bounded line while preserving the seekable input view.
|
|
61
61
|
|
|
62
62
|
``TextIOBase``'s default implementation raises ``UnsupportedOperation``.
|
|
@@ -131,7 +131,9 @@ def forward_remote_prepl(
|
|
|
131
131
|
or not math.isfinite(connect_timeout)
|
|
132
132
|
or connect_timeout <= 0
|
|
133
133
|
):
|
|
134
|
-
raise ValueError(
|
|
134
|
+
raise ValueError(
|
|
135
|
+
"connect-timeout must be a finite positive number when supplied"
|
|
136
|
+
)
|
|
135
137
|
|
|
136
138
|
client = socket.create_connection((host, port), timeout=connect_timeout)
|
|
137
139
|
client.settimeout(None)
|
|
@@ -8,9 +8,10 @@ from collections.abc import Callable, Iterable, Iterator
|
|
|
8
8
|
from functools import cache
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from types import GeneratorType
|
|
11
|
-
from typing import cast
|
|
11
|
+
from typing import Any, cast
|
|
12
12
|
|
|
13
13
|
import pytest
|
|
14
|
+
from _pytest.nodes import Node
|
|
14
15
|
from _pytest.runner import runtestprotocol
|
|
15
16
|
|
|
16
17
|
from basilisp import main as basilisp
|
|
@@ -435,25 +436,10 @@ class BasilispTestItem(pytest.Item):
|
|
|
435
436
|
self._fixture_manager = fixture_manager
|
|
436
437
|
|
|
437
438
|
@classmethod
|
|
438
|
-
def from_parent(
|
|
439
|
-
cls,
|
|
440
|
-
parent: "BasilispFile",
|
|
441
|
-
name: str,
|
|
442
|
-
run_test: TestFunction,
|
|
443
|
-
namespace: runtime.Namespace,
|
|
444
|
-
filename: str,
|
|
445
|
-
fixture_manager: FixtureManager,
|
|
446
|
-
):
|
|
439
|
+
def from_parent(cls, parent: Node, **kwargs: Any) -> "BasilispTestItem":
|
|
447
440
|
"""Create a new BasilispTestItem from the parent Node."""
|
|
448
441
|
# https://github.com/pytest-dev/pytest/pull/6680
|
|
449
|
-
return super().from_parent(
|
|
450
|
-
parent,
|
|
451
|
-
name=name,
|
|
452
|
-
run_test=run_test,
|
|
453
|
-
namespace=namespace,
|
|
454
|
-
filename=filename,
|
|
455
|
-
fixture_manager=fixture_manager,
|
|
456
|
-
)
|
|
442
|
+
return super().from_parent(parent, **kwargs)
|
|
457
443
|
|
|
458
444
|
def setup(self) -> None:
|
|
459
445
|
if not self._fixture_manager.requires_wrapped_execution:
|
|
@@ -1024,11 +1024,15 @@
|
|
|
1024
1024
|
current-value args)``\\. The function ``f`` may be called multiple times while
|
|
1025
1025
|
swapping, so should be free of side effects. Return the new value."
|
|
1026
1026
|
[atom f & args]
|
|
1027
|
-
(
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
new-val
|
|
1031
|
-
|
|
1027
|
+
(loop []
|
|
1028
|
+
(let [current (deref atom)
|
|
1029
|
+
new-val (apply f current args)]
|
|
1030
|
+
(if (compare-and-set! atom current new-val)
|
|
1031
|
+
new-val
|
|
1032
|
+
;; `args` is already the variadic tail. Recurring with it as one
|
|
1033
|
+
;; argument changes a zero-argument update into a one-argument update
|
|
1034
|
+
;; after a contested compare-and-set.
|
|
1035
|
+
(recur)))))
|
|
1032
1036
|
|
|
1033
1037
|
(defn swap-vals!
|
|
1034
1038
|
"Atomically swap the value of an atom to the return value of ``(apply f
|
|
@@ -1036,11 +1040,12 @@
|
|
|
1036
1040
|
swapping, so should be free of side effects. Return a vector containing the new
|
|
1037
1041
|
value and the old value in that order."
|
|
1038
1042
|
[atom f & args]
|
|
1039
|
-
(
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1043
|
+
(loop []
|
|
1044
|
+
(let [current (deref atom)
|
|
1045
|
+
new-val (apply f current args)]
|
|
1046
|
+
(if (compare-and-set! atom current new-val)
|
|
1047
|
+
[new-val current]
|
|
1048
|
+
(recur)))))
|
|
1044
1049
|
|
|
1045
1050
|
(defn atom
|
|
1046
1051
|
"Return an Atom containing ``v``\\. The value of an Atom at any point in time may be
|
|
@@ -2705,7 +2705,7 @@ def _loop_to_py_ast(ctx: GeneratorContext, node: Loop) -> GeneratedPyAST:
|
|
|
2705
2705
|
loop_body_ast = list(map(statementize, body_ast.dependencies))
|
|
2706
2706
|
loop_body_ast.append(ast.Return(value=body_ast.node))
|
|
2707
2707
|
|
|
2708
|
-
loop_fn = (
|
|
2708
|
+
loop_fn = _fn_node(
|
|
2709
2709
|
name=loop_fn_name,
|
|
2710
2710
|
args=ast.arguments(
|
|
2711
2711
|
posonlyargs=[],
|
|
@@ -2721,6 +2721,7 @@ def _loop_to_py_ast(ctx: GeneratorContext, node: Loop) -> GeneratedPyAST:
|
|
|
2721
2721
|
_ASYNC_TRAMPOLINE_FN_NAME if is_async else _TRAMPOLINE_FN_NAME
|
|
2722
2722
|
],
|
|
2723
2723
|
returns=None,
|
|
2724
|
+
is_async=is_async,
|
|
2724
2725
|
)
|
|
2725
2726
|
loop_call = ast.Call(
|
|
2726
2727
|
func=ast.Name(id=loop_fn_name, ctx=ast.Load()),
|
|
@@ -207,7 +207,7 @@ def map_lrepr( # pylint: disable=too-many-locals
|
|
|
207
207
|
return f"{ns_prefix}{start}{seq_lrepr}{end}"
|
|
208
208
|
|
|
209
209
|
|
|
210
|
-
@lrepr.register(dict)
|
|
210
|
+
@lrepr.register(dict) # type: ignore[attr-defined, untyped-decorator]
|
|
211
211
|
def _lrepr_py_dict(o: dict, **kwargs: Unpack[PrintSettings]) -> str:
|
|
212
212
|
return f"#py {map_lrepr(o.items, '{', '}', **kwargs)}"
|
|
213
213
|
|
|
@@ -411,11 +411,15 @@ class PersistentSortedMap(PersistentMap[K, V]):
|
|
|
411
411
|
def comparator(self):
|
|
412
412
|
return self._comparator
|
|
413
413
|
|
|
414
|
-
def _sorted_items(self):
|
|
414
|
+
def _sorted_items(self) -> list[tuple[K, V]]:
|
|
415
415
|
compare = _comparator_fn(self._comparator)
|
|
416
|
+
|
|
417
|
+
def compare_entries(left: tuple[K, V], right: tuple[K, V]) -> int:
|
|
418
|
+
return compare(left[0], right[0])
|
|
419
|
+
|
|
416
420
|
return sorted(
|
|
417
421
|
self._inner.items(),
|
|
418
|
-
key=functools.cmp_to_key(
|
|
422
|
+
key=functools.cmp_to_key(compare_entries),
|
|
419
423
|
)
|
|
420
424
|
|
|
421
425
|
def _new(self, m: "_Map[K, V]", meta: IPersistentMap | None = None):
|
|
@@ -474,9 +478,7 @@ class PersistentSortedMap(PersistentMap[K, V]):
|
|
|
474
478
|
def seq(self) -> ISeq[IMapEntry[K, V]] | None:
|
|
475
479
|
if len(self._inner) == 0:
|
|
476
480
|
return None
|
|
477
|
-
return iterator_sequence(
|
|
478
|
-
(MapEntry.of(k, v) for k, v in self._sorted_items())
|
|
479
|
-
)
|
|
481
|
+
return iterator_sequence((MapEntry.of(k, v) for k, v in self._sorted_items()))
|
|
480
482
|
|
|
481
483
|
def reduce_kv(self, f: ReduceKVFunction, init: T_reduce) -> T_reduce:
|
|
482
484
|
for k, v in self._sorted_items():
|
|
@@ -1152,6 +1152,7 @@ def local_var(name: sym.Symbol) -> Var:
|
|
|
1152
1152
|
_LOCAL_VAR_NS = Namespace(sym.symbol("basilisp.local-vars"))
|
|
1153
1153
|
return Var(_LOCAL_VAR_NS, name, dynamic=True)
|
|
1154
1154
|
|
|
1155
|
+
|
|
1155
1156
|
T = TypeVar("T")
|
|
1156
1157
|
|
|
1157
1158
|
|
|
@@ -2145,7 +2146,6 @@ def lrepr(
|
|
|
2145
2146
|
core_ns = Namespace.get(CORE_NS_SYM)
|
|
2146
2147
|
assert core_ns is not None
|
|
2147
2148
|
print_dup = core_ns.find(sym.symbol(PRINT_DUP_VAR_NAME)).value # type: ignore
|
|
2148
|
-
print_fn = None
|
|
2149
2149
|
if print_methods:
|
|
2150
2150
|
print_method = core_ns.find(sym.symbol(PRINT_METHOD_VAR_NAME)).value # type: ignore
|
|
2151
2151
|
print_dup_method = core_ns.find(sym.symbol(PRINT_DUP_METHOD_VAR_NAME)).value # type: ignore
|
|
@@ -2158,7 +2158,7 @@ def lrepr(
|
|
|
2158
2158
|
multifn.default
|
|
2159
2159
|
)
|
|
2160
2160
|
|
|
2161
|
-
def
|
|
2161
|
+
def _custom_print_fn(value) -> str | None:
|
|
2162
2162
|
writer = io.StringIO()
|
|
2163
2163
|
if print_dup:
|
|
2164
2164
|
method, default = selected_method(print_dup_method, value)
|
|
@@ -2172,22 +2172,26 @@ def lrepr(
|
|
|
2172
2172
|
print_method(value, writer)
|
|
2173
2173
|
return writer.getvalue()
|
|
2174
2174
|
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2175
|
+
custom_print_fn = _custom_print_fn
|
|
2176
|
+
else:
|
|
2177
|
+
custom_print_fn = None
|
|
2178
|
+
|
|
2179
|
+
kwargs = {
|
|
2180
|
+
"human_readable": human_readable,
|
|
2181
|
+
"print_dup": print_dup,
|
|
2182
|
+
"print_length": core_ns.find( # type: ignore
|
|
2179
2183
|
sym.symbol(PRINT_LENGTH_VAR_NAME)
|
|
2180
2184
|
).value,
|
|
2181
|
-
print_level
|
|
2185
|
+
"print_level": core_ns.find( # type: ignore
|
|
2182
2186
|
sym.symbol(PRINT_LEVEL_VAR_NAME)
|
|
2183
2187
|
).value,
|
|
2184
|
-
print_meta
|
|
2185
|
-
print_namespace_maps
|
|
2186
|
-
print_readably
|
|
2188
|
+
"print_meta": core_ns.find(sym.symbol(PRINT_META_VAR_NAME)).value, # type: ignore
|
|
2189
|
+
"print_namespace_maps": core_ns.find(sym.symbol(PRINT_NAMESPACE_MAPS_VAR_NAME)).value, # type: ignore
|
|
2190
|
+
"print_readably": core_ns.find( # type: ignore
|
|
2187
2191
|
sym.symbol(PRINT_READABLY_VAR_NAME)
|
|
2188
2192
|
).value,
|
|
2189
|
-
print_fn
|
|
2190
|
-
|
|
2193
|
+
"print_fn": custom_print_fn,
|
|
2194
|
+
}
|
|
2191
2195
|
if skip_root_custom:
|
|
2192
2196
|
return lobj._lrepr(o, **kwargs) # pylint: disable=protected-access
|
|
2193
2197
|
return lobj.lrepr(o, **kwargs)
|
|
@@ -215,7 +215,10 @@ class PersistentSortedSet(PersistentSet[T]):
|
|
|
215
215
|
return self._comparator
|
|
216
216
|
|
|
217
217
|
def _sorted_members(self):
|
|
218
|
-
return sorted(
|
|
218
|
+
return sorted(
|
|
219
|
+
self._inner.keys(),
|
|
220
|
+
key=functools.cmp_to_key(_comparator_fn(self._comparator)),
|
|
221
|
+
)
|
|
219
222
|
|
|
220
223
|
def _new(self, m: "_Map[T, T]", meta: IPersistentMap | None = None):
|
|
221
224
|
return PersistentSortedSet(
|
|
@@ -271,7 +274,11 @@ def s(*members: T, meta: IPersistentMap | None = None) -> PersistentSet[T]:
|
|
|
271
274
|
|
|
272
275
|
|
|
273
276
|
def sorted_set(
|
|
274
|
-
comparator: Callable[[T, T], int | bool],
|
|
277
|
+
comparator: Callable[[T, T], int | bool],
|
|
278
|
+
*members: T,
|
|
279
|
+
meta: IPersistentMap | None = None,
|
|
275
280
|
) -> PersistentSortedSet[T]:
|
|
276
281
|
"""Create a persistent set whose iteration order follows ``comparator``."""
|
|
277
|
-
return PersistentSortedSet(
|
|
282
|
+
return PersistentSortedSet(
|
|
283
|
+
_Map((member, member) for member in members), comparator, meta=meta
|
|
284
|
+
)
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import sys
|
|
5
6
|
from dataclasses import dataclass
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any, Mapping
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
if sys.version_info >= (3, 11):
|
|
10
11
|
import tomllib
|
|
11
|
-
|
|
12
|
-
import tomli as tomllib
|
|
12
|
+
else: # pragma: no cover - Python 3.10 only
|
|
13
|
+
import tomli as tomllib
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
_COMPILER_OPTIONS = frozenset(
|
|
@@ -195,10 +195,17 @@
|
|
|
195
195
|
(cond
|
|
196
196
|
(vector? expr) :default
|
|
197
197
|
(sequential? expr) (let [maybe-f (first expr)]
|
|
198
|
-
(if (
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
198
|
+
(if (symbol? maybe-f)
|
|
199
|
+
(cond
|
|
200
|
+
(= 'basilisp.core/= maybe-f) (symbol (name maybe-f))
|
|
201
|
+
(#{'thrown-with-msg? 'thrown?} (symbol maybe-f))
|
|
202
|
+
(symbol (name maybe-f))
|
|
203
|
+
;; clojure-test-suite defines this portable assertion
|
|
204
|
+
;; method with Basilisp's pre-0.5 argument order.
|
|
205
|
+
;; Dispatch it to our compatible implementation instead
|
|
206
|
+
;; of evaluating ``p/thrown?`` as a regular function.
|
|
207
|
+
(= 'p/thrown? maybe-f) 'portable-thrown?
|
|
208
|
+
:else maybe-f)
|
|
202
209
|
maybe-f))
|
|
203
210
|
:else :default)))
|
|
204
211
|
|
|
@@ -277,6 +284,23 @@
|
|
|
277
284
|
:actual e#
|
|
278
285
|
:expected ~exc-type})))))
|
|
279
286
|
|
|
287
|
+
(defmethod assert-expr 'portable-thrown?
|
|
288
|
+
[msg expr]
|
|
289
|
+
"Support clojure-test-suite's portable ``p/thrown?`` assertion form.
|
|
290
|
+
|
|
291
|
+
Unlike :lpy:fn:`thrown?`, this form accepts no exception class and succeeds
|
|
292
|
+
for any ordinary Python exception."
|
|
293
|
+
(let [body (rest expr)]
|
|
294
|
+
`(try
|
|
295
|
+
(let [result# (do ~@body)]
|
|
296
|
+
(do-report {:type :fail
|
|
297
|
+
:message ~msg
|
|
298
|
+
:expr (quote ~expr)
|
|
299
|
+
:actual result#
|
|
300
|
+
:expected (quote ~expr)}))
|
|
301
|
+
(catch python/Exception e#
|
|
302
|
+
e#))))
|
|
303
|
+
|
|
280
304
|
(defmethod assert-expr :default
|
|
281
305
|
[msg expr]
|
|
282
306
|
`(let [computed# ~expr]
|
|
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
|