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.
Files changed (119) hide show
  1. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/PKG-INFO +1 -1
  2. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/pyproject.toml +17 -1
  3. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/Cargo.lock +1 -1
  4. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/Cargo.toml +1 -1
  5. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/core_server.py +5 -2
  6. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/prepl_server.py +4 -2
  7. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/pytest/testrunner.py +4 -18
  8. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core.lpy +15 -10
  9. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/generator.py +2 -1
  10. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/map.py +8 -6
  11. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/runtime.py +16 -12
  12. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/set.py +10 -3
  13. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/project.py +4 -3
  14. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test.lpy +28 -4
  15. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/LICENSE +0 -0
  16. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/README.md +0 -0
  17. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/interfaces.rs +0 -0
  18. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/mod.rs +0 -0
  19. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/basilisp_native/seq.rs +0 -0
  20. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/rust/src/lib.rs +0 -0
  21. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/__init__.py +0 -0
  22. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/_lang/__init__.pyi +0 -0
  23. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/_lang/seq.pyi +0 -0
  24. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/cli.py +0 -0
  25. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/concurrent.lpy +0 -0
  26. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/concurrent_channel.py +0 -0
  27. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/__init__.py +0 -0
  28. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/attrs.lpy +0 -0
  29. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/bencode.lpy +0 -0
  30. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/dataclasses.lpy +0 -0
  31. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/nrepl_server.lpy +0 -0
  32. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/prepl.lpy +0 -0
  33. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/pytest/__init__.py +0 -0
  34. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/repl_session.py +0 -0
  35. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/__init__.py +0 -0
  36. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/autodoc.py +0 -0
  37. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/domain.py +0 -0
  38. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/contrib/sphinx/linkcode.py +0 -0
  39. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core/protocols.lpy +0 -0
  40. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/core/server.lpy +0 -0
  41. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/csv.lpy +0 -0
  42. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/data/csv.lpy +0 -0
  43. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/data.lpy +0 -0
  44. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/datafy.lpy +0 -0
  45. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/edn.lpy +0 -0
  46. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/importer.py +0 -0
  47. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/instant.lpy +0 -0
  48. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/io.lpy +0 -0
  49. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/java/process.lpy +0 -0
  50. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/json.lpy +0 -0
  51. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/__init__.py +0 -0
  52. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/agent.py +0 -0
  53. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/atom.py +0 -0
  54. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/attrs.py +0 -0
  55. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/__init__.py +0 -0
  56. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/analyzer.py +0 -0
  57. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/constants.py +0 -0
  58. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/exception.py +0 -0
  59. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/nodes.py +0 -0
  60. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/optimizer.py +0 -0
  61. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/compiler/utils.py +0 -0
  62. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/dataclass.py +0 -0
  63. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/delay.py +0 -0
  64. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/diagnostics.py +0 -0
  65. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/exception.py +0 -0
  66. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/futures.py +0 -0
  67. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/instant.py +0 -0
  68. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/interfaces.py +0 -0
  69. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/keyword.py +0 -0
  70. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/list.py +0 -0
  71. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/multifn.py +0 -0
  72. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/numbers.py +0 -0
  73. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/obj.py +0 -0
  74. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/promise.py +0 -0
  75. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/queue.py +0 -0
  76. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reader.py +0 -0
  77. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reduced.py +0 -0
  78. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/reference.py +0 -0
  79. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/regex.py +0 -0
  80. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/seq.py +0 -0
  81. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/source.py +0 -0
  82. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/spec.py +0 -0
  83. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/stm.py +0 -0
  84. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/symbol.py +0 -0
  85. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/tagged.py +0 -0
  86. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/typing.py +0 -0
  87. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/util.py +0 -0
  88. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/vector.py +0 -0
  89. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/lang/volatile.py +0 -0
  90. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/logconfig.py +0 -0
  91. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/main.py +0 -0
  92. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/math.lpy +0 -0
  93. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/portability.py +0 -0
  94. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/pprint.lpy +0 -0
  95. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/process.lpy +0 -0
  96. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/prompt.py +0 -0
  97. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/py.typed +0 -0
  98. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/reducers.lpy +0 -0
  99. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/reflect.lpy +0 -0
  100. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/repl.lpy +0 -0
  101. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/set.lpy +0 -0
  102. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/shell.lpy +0 -0
  103. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/sitecustomize.py +0 -0
  104. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/__init__.py +0 -0
  105. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/alpha.lpy +0 -0
  106. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/spec/test/alpha.lpy +0 -0
  107. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/stacktrace.lpy +0 -0
  108. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/stm.lpy +0 -0
  109. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/string.lpy +0 -0
  110. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/template.lpy +0 -0
  111. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test/fixtures.lpy +0 -0
  112. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/test/tap.lpy +0 -0
  113. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/tools/__init__.py +0 -0
  114. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/tools/cli.lpy +0 -0
  115. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/url.lpy +0 -0
  116. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/util.py +0 -0
  117. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/walk.lpy +0 -0
  118. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/xml.lpy +0 -0
  119. {baisilisp-0.5.2.dev1 → baisilisp-0.5.2.dev11}/src/basilisp/zip.lpy +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: baisilisp
3
- Version: 0.5.2.dev1
3
+ Version: 0.5.2.dev11
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python
@@ -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.dev1"
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.*",
@@ -4,7 +4,7 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "basilisp-native"
7
- version = "0.5.2-dev.1"
7
+ version = "0.5.2-dev.11"
8
8
  dependencies = [
9
9
  "parking_lot",
10
10
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "basilisp-native"
3
- version = "0.5.2-dev.1"
3
+ version = "0.5.2-dev.11"
4
4
  edition = "2021"
5
5
 
6
6
  [lib]
@@ -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 = (threading.RLock(), {})
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("connect-timeout must be a finite positive number when supplied")
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( # pylint: disable=arguments-differ,too-many-arguments
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
- (let [current (deref atom)
1028
- new-val (apply f current args)]
1029
- (if (compare-and-set! atom current new-val)
1030
- new-val
1031
- (recur atom f args))) )
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
- (let [current (deref atom)
1040
- new-val (apply f current args)]
1041
- (if (compare-and-set! atom current new-val)
1042
- [new-val current]
1043
- (recur atom f args))))
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 = (ast.AsyncFunctionDef if is_async else ast.FunctionDef)(
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(lambda left, right: compare(left[0], right[0])),
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 print_fn(value) -> str | None:
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
- kwargs = dict(
2176
- human_readable=human_readable,
2177
- print_dup=print_dup,
2178
- print_length=core_ns.find( # type: ignore
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=core_ns.find( # type: ignore
2185
+ "print_level": core_ns.find( # type: ignore
2182
2186
  sym.symbol(PRINT_LEVEL_VAR_NAME)
2183
2187
  ).value,
2184
- print_meta=core_ns.find(sym.symbol(PRINT_META_VAR_NAME)).value, # type: ignore
2185
- print_namespace_maps=core_ns.find(sym.symbol(PRINT_NAMESPACE_MAPS_VAR_NAME)).value, # type: ignore
2186
- print_readably=core_ns.find( # type: ignore
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=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(self._inner.keys(), key=functools.cmp_to_key(_comparator_fn(self._comparator)))
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], *members: T, meta: IPersistentMap | None = None
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(_Map((member, member) for member in members), comparator, meta=meta)
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
- try:
10
+ if sys.version_info >= (3, 11):
10
11
  import tomllib
11
- except ModuleNotFoundError: # pragma: no cover - Python 3.10 only
12
- import tomli as tomllib # type: ignore[import-not-found, no-redef]
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 (and (symbol? maybe-f)
199
- (or (= 'basilisp.core/= maybe-f)
200
- (#{'thrown-with-msg? 'thrown?} (symbol maybe-f))))
201
- (symbol (name maybe-f))
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