• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / py-slang / 29571170123
87%

Build:
DEFAULT BRANCH: main
Ran 17 Jul 2026 09:52AM UTC
Jobs 1
Files 90
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

17 Jul 2026 09:46AM UTC coverage: 80.555% (-0.5%) from 81.011%
29571170123

push

github

web-flow
Add Module Loader  (#217)

* feat(cse): add data handler

* feat: add module interop

* fix: linting issues

* fix: arity calculation

* feat: add tests

* fix: make Gemini's changes

* fix: allow it to work with cse machine

* fix: use opaqueidentifier in opaquemap

* fix: wrap body in lambda

* fix: Gemini's changes

* fix: ptm(mtp(closure)) returns the same closure

* chore: update module loader package

* Fix module interop list/pair round-tripping and closure identity

pythonToModule's "list" case only ever built a DataType.ARRAY, so a
PAIR returned by one module call (e.g. a binary tree node) came back
as an ARRAY when passed into another module call, breaking anything
checking value.type against PAIR/LIST at every level of a chain.

Fixed by tagging genuine Python list literals at construction time
(InstrType.LIST, and the *args rest-parameter collection in
environment.ts - both build flat, arbitrary-length collections the
same way) in a listLiteralValues WeakSet, rather than trying to guess
from shape alone. Tagged values always reconstruct as a proper
PAIR/EMPTY_LIST chain regardless of length. Untagged values (from
pair()/llist(), or a module PAIR round-tripped through moduleToPython)
reconstruct as a single pair_make(head, tail) without requiring the
chain to terminate in None, since a module PAIR need not be a proper
list (e.g. sound's Sound is (wavesPair, duration), a dotted pair whose
second element is a number, not another list link). This closes the
exact gap raised in review: ptm(mtp(pairObject)) is now a fixpoint
regardless of whether the pair happens to be a proper list.

Also fix PyCseEvaluator's closureMap, which was keyed by the
TypedValue<DataType.CLOSURE> object itself rather than its
ClosureIdentifier. A closure that round-trips through Python gets a
freshly-constructed TypedValue with the same id, so a reference-keyed
map missed it silently (via optional chaining), returning undefined
where an AsyncGenerator was expected - su... (continued)

3361 of 4465 branches covered (75.27%)

Branch coverage included in aggregate %.

80 of 146 new or added lines in 10 files covered. (54.79%)

7356 of 8839 relevant lines covered (83.22%)

79349.24 hits per line

Uncovered Changes

Lines Coverage ∆ File
27
60.71
src/engines/cse/modules.ts
23
85.91
-4.9% src/engines/cse/interpreter.ts
12
68.21
-2.62% src/errors/errors.ts
3
92.64
-2.19% src/conductor/plugins/PyCseMachinePlugin.ts
1
96.0
-4.0% src/engines/cse/instrCreator.ts
Jobs
ID Job ID Ran Files Coverage
1 29571170123.1 17 Jul 2026 09:52AM UTC 90
80.55
GitHub Action Run
Source Files on build 29571170123
  • Tree
  • List 90
  • Changed 12
  • Source Changed 11
  • Coverage Changed 11
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #29571170123
  • 493814b9 on github
  • Prev Build on main (#29545691509)
  • Next Build on main (#29628807963)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc