laddercodec 0.2.1__tar.gz → 0.3.0__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.
- laddercodec-0.3.0/.github/scripts/check_public_site.py +80 -0
- laddercodec-0.3.0/.github/scripts/prune_public_site.py +45 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/docs.yml +13 -3
- {laddercodec-0.2.1 → laddercodec-0.3.0}/.gitignore +1 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/AGENTS.md +11 -5
- {laddercodec-0.2.1 → laddercodec-0.3.0}/CHANGELOG.md +38 -2
- {laddercodec-0.2.1 → laddercodec-0.3.0}/Makefile +11 -5
- laddercodec-0.3.0/PKG-INFO +97 -0
- laddercodec-0.3.0/README.md +75 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/dump_scr_tags.py +2 -1
- laddercodec-0.3.0/docs/gen_llms.py +95 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/gen_reference.py +21 -10
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/adding-instructions.md +64 -4
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/csv-format.md +42 -7
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/decoding.md +21 -2
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/encoding.md +1 -1
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/troubleshooting.md +1 -1
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/index.md +6 -4
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/internals/binary-format.md +71 -30
- laddercodec-0.3.0/docs/internals/instruction-blobs.md +206 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/internals/wire-rendering.md +14 -4
- laddercodec-0.3.0/docs/stylesheets/extra.css +12 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/mkdocs.yml +18 -15
- {laddercodec-0.2.1 → laddercodec-0.3.0}/pyproject.toml +2 -5
- laddercodec-0.3.0/scratchpad/click-v4/captures/.gitignore +2 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/README.md +61 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/drum_fix_stubs.py +84 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/expected/drum.csv +40 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/expected/loop.csv +105 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/expected/math.csv +70 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/expected/out.csv +55 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/expected/pins.csv +56 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/math_edge_stubs.py +175 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum.csv +40 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum_fix.csv +118 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum_fix_te.csv +60 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/loop.csv +105 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math.csv +70 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_edge.csv +92 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_neg2.csv +26 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_operands.csv +65 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_wide.csv +14 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/out.csv +55 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/pins.csv +47 -0
- laddercodec-0.3.0/scratchpad/click-v4/captures/v4_capture.py +539 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/__init__.py +9 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/_grid.py +2 -2
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/cell.py +8 -5
- laddercodec-0.3.0/src/laddercodec/compat.py +64 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/converter.py +172 -314
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/writer.py +100 -200
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/decode.py +10 -6
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/decode_program.py +206 -286
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/encode.py +4 -1
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/__init__.py +21 -4
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/coil.py +6 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/counter.py +33 -5
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/drum.py +184 -31
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/forloop.py +78 -11
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/math.py +124 -35
- laddercodec-0.3.0/src/laddercodec/instructions/out_variant.py +269 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/raw.py +3 -2
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/shift.py +18 -6
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/timer.py +18 -5
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/model.py +42 -2
- laddercodec-0.3.0/tests/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_converter.py +110 -0
- laddercodec-0.3.0/tests/csv/test_pinned_or_inputs.py +289 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_writer.py +2 -1
- laddercodec-0.3.0/tests/fixtures/coverage/golden/drum__v4.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/drum__v4.csv +40 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/loop__v4.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/loop__v4.csv +105 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/math__negative.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/math__negative.csv +58 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/math__v4.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/math__v4.csv +70 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/out__v4.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/out__v4.csv +55 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/pins__v4.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/coverage/golden/pins__v4.csv +56 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/verify_progress.log +7 -1
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +2 -2
- laddercodec-0.3.0/tests/fixtures/pinned_or/conf_counters_count_down.csv +22 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/README.md +33 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.csv +9 -9
- laddercodec-0.3.0/tests/fixtures/scr_captures/pins.scr +0 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.csv +4 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.scr +0 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.csv +11 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.png +0 -0
- laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.scr +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/drum.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/drum_jog.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/loop_exits.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/math.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/math_typed.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/out.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/out_debounce_example.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/pins.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_neg.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_wide.bin +0 -0
- laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_xd.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_program.py +311 -54
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_forloop.py +25 -1
- laddercodec-0.3.0/tests/ladder/test_math.py +147 -0
- laddercodec-0.3.0/tests/test_compat.py +75 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_public_api.py +5 -0
- laddercodec-0.3.0/tests/test_v4_captures.py +326 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/uv.lock +97 -354
- laddercodec-0.2.1/PKG-INFO +0 -96
- laddercodec-0.2.1/README.md +0 -74
- laddercodec-0.2.1/docs/internals/instruction-blobs.md +0 -69
- laddercodec-0.2.1/tests/ladder/test_math.py +0 -43
- {laddercodec-0.2.1 → laddercodec-0.3.0}/.claude/settings.local.json +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/ci.yml +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/publish.yml +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/CLAUDE.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/LICENSE +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/add-features-workflow.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/analyze_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/combine_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/compare_blobs.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/compare_csv.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/coverage_golden.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/create_mr_max_csv.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/diag_blob.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/gen_modbus_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/golden.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/inspect_bin.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/inspect_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/lint.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/pdf_to_png.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/test_decode_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/validate_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/walk_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/AGENTS.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/CLAUDE.md +0 -0
- /laddercodec-0.2.1/tests/__init__.py → /laddercodec-0.3.0/scratchpad/click-v4/captures/copyback/.gitkeep +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/binary_helpers.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/ast.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/bundle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/contract.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/token_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/empty_multirow.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/encode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/call.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/comparison.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/contact.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/copy.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/email.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/end.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/family.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/home.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/position.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/return_.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/search.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/send_receive.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/velocity.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/topology.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_bundle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_contract.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_token_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_writer_raw_validator.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/coverage.ckp +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_down.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_down.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/end.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/end.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__le.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__le.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/golden_io.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_counter.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_program_tumbler.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_rtf_oracle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_empty_multirow.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_encode.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_encode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_model.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_shift.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_verify_status.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_smoke.py +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Reject private sources and incomplete generated docs in the public site."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
BLOCKED_FILENAMES = {
|
|
11
|
+
"agents",
|
|
12
|
+
"agents.html",
|
|
13
|
+
"agents.md",
|
|
14
|
+
"claude",
|
|
15
|
+
"claude.html",
|
|
16
|
+
"claude.md",
|
|
17
|
+
"gen_llms.py",
|
|
18
|
+
"gen_reference.py",
|
|
19
|
+
"llms-full.txt",
|
|
20
|
+
}
|
|
21
|
+
BLOCKED_PATH_PARTS = {"__pycache__", "agents", "claude"}
|
|
22
|
+
EXPECTED_FILES = {
|
|
23
|
+
"index.html",
|
|
24
|
+
"llms.txt",
|
|
25
|
+
"reference/index.html",
|
|
26
|
+
"reference/api/codec/index.html",
|
|
27
|
+
"reference/api/csv/index.html",
|
|
28
|
+
"reference/api/instructions/index.html",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def ascii_text(value: object) -> str:
|
|
33
|
+
return str(value).encode("ascii", errors="backslashreplace").decode("ascii")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def main() -> int:
|
|
37
|
+
parser = argparse.ArgumentParser(description="Check generated public-site paths.")
|
|
38
|
+
parser.add_argument("site", type=Path, help="Generated site directory to inspect")
|
|
39
|
+
args = parser.parse_args()
|
|
40
|
+
|
|
41
|
+
site = args.site
|
|
42
|
+
if not site.is_dir():
|
|
43
|
+
print(f"ERROR: public site directory does not exist: {ascii_text(site)}")
|
|
44
|
+
return 2
|
|
45
|
+
|
|
46
|
+
violations: list[str] = []
|
|
47
|
+
actual_files = {
|
|
48
|
+
path.relative_to(site).as_posix()
|
|
49
|
+
for path in site.rglob("*")
|
|
50
|
+
if path.is_file()
|
|
51
|
+
}
|
|
52
|
+
for relative_path in actual_files:
|
|
53
|
+
path = Path(relative_path)
|
|
54
|
+
if path.name.lower() in BLOCKED_FILENAMES or any(
|
|
55
|
+
part.lower() in BLOCKED_PATH_PARTS for part in path.parts
|
|
56
|
+
):
|
|
57
|
+
violations.append(f"blocked public-site path: {relative_path}")
|
|
58
|
+
|
|
59
|
+
for missing in sorted(EXPECTED_FILES - actual_files):
|
|
60
|
+
violations.append(f"missing expected public-site path: {missing}")
|
|
61
|
+
|
|
62
|
+
for path in site.rglob("*"):
|
|
63
|
+
if path.suffix.lower() not in {".html", ".md", ".txt"} or not path.is_file():
|
|
64
|
+
continue
|
|
65
|
+
if "::: laddercodec." in path.read_text(encoding="utf-8", errors="replace"):
|
|
66
|
+
relative_path = path.relative_to(site).as_posix()
|
|
67
|
+
violations.append(f"unrendered API directive: {relative_path}")
|
|
68
|
+
|
|
69
|
+
if violations:
|
|
70
|
+
for violation in sorted(violations):
|
|
71
|
+
print(f"ERROR: {ascii_text(violation)}")
|
|
72
|
+
print(f"ERROR: public-site guard found {len(violations)} violation(s).")
|
|
73
|
+
return 1
|
|
74
|
+
|
|
75
|
+
print(f"OK: public-site guard passed: {ascii_text(site)}")
|
|
76
|
+
return 0
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Remove explicitly private source files copied by Zensical 0.0.57."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import shutil
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
PRIVATE_ROOT_NAMES = {
|
|
12
|
+
"__pycache__",
|
|
13
|
+
"agents",
|
|
14
|
+
"agents.md",
|
|
15
|
+
"claude",
|
|
16
|
+
"claude.md",
|
|
17
|
+
"gen_llms.py",
|
|
18
|
+
"gen_reference.py",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def main() -> int:
|
|
23
|
+
parser = argparse.ArgumentParser(description="Prune private public-site paths.")
|
|
24
|
+
parser.add_argument("site", type=Path, help="Generated site directory to prune")
|
|
25
|
+
args = parser.parse_args()
|
|
26
|
+
|
|
27
|
+
site = args.site.resolve()
|
|
28
|
+
if not site.is_dir():
|
|
29
|
+
raise RuntimeError(f"Public site directory does not exist: {site}")
|
|
30
|
+
|
|
31
|
+
for path in site.iterdir():
|
|
32
|
+
if path.name.lower() not in PRIVATE_ROOT_NAMES:
|
|
33
|
+
continue
|
|
34
|
+
resolved = path.resolve()
|
|
35
|
+
if resolved.parent != site:
|
|
36
|
+
raise RuntimeError(f"Refusing to prune path outside public site: {resolved}")
|
|
37
|
+
if resolved.is_dir():
|
|
38
|
+
shutil.rmtree(resolved)
|
|
39
|
+
else:
|
|
40
|
+
resolved.unlink()
|
|
41
|
+
return 0
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
raise SystemExit(main())
|
|
@@ -3,6 +3,8 @@ name: Docs
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: ["main"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main"]
|
|
6
8
|
workflow_dispatch:
|
|
7
9
|
|
|
8
10
|
permissions:
|
|
@@ -34,17 +36,25 @@ jobs:
|
|
|
34
36
|
- name: Install docs dependencies
|
|
35
37
|
run: uv sync --locked --group docs
|
|
36
38
|
|
|
39
|
+
- name: Cache-bust extra assets
|
|
40
|
+
run: |
|
|
41
|
+
sed -i -E "s#^(\s*- (stylesheets|javascripts)/[^?[:space:]]+)\$#\1?v=${GITHUB_SHA::8}#" mkdocs.yml
|
|
42
|
+
grep -E '\?v=' mkdocs.yml
|
|
43
|
+
|
|
37
44
|
- name: Build docs
|
|
38
|
-
run:
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
run: make docs-check
|
|
46
|
+
|
|
47
|
+
- name: Configure Pages
|
|
48
|
+
uses: actions/configure-pages@v5
|
|
41
49
|
|
|
42
50
|
- name: Upload Pages artifact
|
|
51
|
+
if: github.event_name != 'pull_request'
|
|
43
52
|
uses: actions/upload-pages-artifact@v4
|
|
44
53
|
with:
|
|
45
54
|
path: site
|
|
46
55
|
|
|
47
56
|
deploy:
|
|
57
|
+
if: github.event_name != 'pull_request'
|
|
48
58
|
needs: build
|
|
49
59
|
runs-on: ubuntu-latest
|
|
50
60
|
environment:
|
|
@@ -43,6 +43,7 @@ src/laddercodec/
|
|
|
43
43
|
├── binary_helpers.py # Shared binary primitives: UTF-16LE encode/decode, tagged fields
|
|
44
44
|
├── decode.py # Decoder: decode() + internal decode_rung(), decode_rungs()
|
|
45
45
|
├── decode_program.py # Program file decoder: decode_program() — Scr*.tmp to Program
|
|
46
|
+
├── compat.py # find_v4_only() / is_v4_only(): instructions an older CLICK would mangle
|
|
46
47
|
├── cell.py # Cell object builders: ClickCell, preamble, terminal, row
|
|
47
48
|
├── topology.py # Program header, rung preamble, cell offset math, wire flags
|
|
48
49
|
├── empty_multirow.py # Deterministic empty multi-row payload synthesis
|
|
@@ -52,6 +53,7 @@ src/laddercodec/
|
|
|
52
53
|
│ ├── contact.py # Contact (NO/NC/edge/immediate), build_blob(), cell_params(), parser
|
|
53
54
|
│ ├── comparison.py # CompareContact (==, !=, >, <, >=, <=), build_blob(), cell_params(), parser
|
|
54
55
|
│ ├── coil.py # Coil (out/latch/reset, range, immediate, oneshot), build_blob(), cell_params(), parser
|
|
56
|
+
│ ├── out_variant.py # OutVariant (CLICK v4 toggle/debounce/flasher/timed), build_blob(), cell_params(), parser
|
|
55
57
|
│ ├── timer.py # Timer (on_delay/off_delay, retentive), build_blob(), cell_params(), parser
|
|
56
58
|
│ ├── copy.py # Copy (single/block/fill), BlockCopy, Fill — build_blob(), cell_params(), parser
|
|
57
59
|
│ └── raw.py # RawInstruction (opaque blob passthrough), build_blob(), cell_params()
|
|
@@ -91,6 +93,7 @@ src/laddercodec/
|
|
|
91
93
|
tests/
|
|
92
94
|
├── test_smoke.py # Basic sanity check
|
|
93
95
|
├── test_coverage.py # Coverage golden fixture tests (instruction variants)
|
|
96
|
+
├── test_v4_captures.py # CLICK v4 captures: each rung decodes to its comment; native blob matching
|
|
94
97
|
├── golden_io.py # Golden CSV/BIN read/write helpers
|
|
95
98
|
├── ladder/
|
|
96
99
|
│ ├── test_encode.py # encode() pipeline, multi-row, comments, wires, NOP
|
|
@@ -112,10 +115,11 @@ tests/
|
|
|
112
115
|
└── fixtures/
|
|
113
116
|
├── ladder_captures/golden/ # Golden CSV/BIN fixtures
|
|
114
117
|
├── scr_captures/ # Scr program files + clipboard bins (decode_program)
|
|
115
|
-
|
|
118
|
+
├── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
|
|
119
|
+
└── v4_captures/ # CLICK v4 copy-backs of pyrung capture stubs (math, out, drum)
|
|
116
120
|
```
|
|
117
121
|
|
|
118
|
-
|
|
122
|
+
Ladder golden fixtures are verified through Click paste round-trip. In `scr_captures`, `time_drums.bin` is synthetic (see that directory's README); do not use its differences from SCR as evidence of native cleanup. The tumbler fixture pairs each Click internal program file (`.scr`) with a clipboard capture of the same program; `devtools/compare_csv.py <dir>` compares `<name>.csv` (scr decode) against `<name>.clipboard.csv` ground truth.
|
|
119
123
|
|
|
120
124
|
## Binary Format
|
|
121
125
|
|
|
@@ -127,7 +131,7 @@ Quick reference: three regions — program header (0x0254), payload region (0x02
|
|
|
127
131
|
|
|
128
132
|
Full spec: [`docs/internals/wire-rendering.md`](docs/internals/wire-rendering.md) — flag bytes, left-edge rendering, segment flag boundary rules.
|
|
129
133
|
|
|
130
|
-
Quick reference: three flag bytes per cell — segment (+0x19), right (+0x1D), down (+0x21). Wire tokens classified by (right, down) only. Segment flag boundary computed per-row.
|
|
134
|
+
Quick reference: three flag bytes per cell — segment (+0x19), right (+0x1D), down (+0x21). Wire tokens classified by (right, down) only. Segment flag boundary computed per-row. The encoder treats row 0 as exempt; native segment flags retain editing history.
|
|
131
135
|
|
|
132
136
|
## Instruction Blobs
|
|
133
137
|
|
|
@@ -160,7 +164,7 @@ All tested shapes pass Click round-trip (verified via paste → copy-back):
|
|
|
160
164
|
|
|
161
165
|
The clipboard decoder (`decode.py`) reads Click clipboard binaries back into structured data. Validated against a 37-rung native capture covering all basic instruction types.
|
|
162
166
|
|
|
163
|
-
The program file decoder (`decode_program.py`) reads Click's internal `Scr*.tmp` files. Returns a `Program` with name, index, and all rungs. Validated against the 114-rung coverage fixture, shift/counter/drum programs, and the 34-program tumbler fixture (byte-identical CSV vs clipboard captures). Row topology uses the uniform row-block framing documented in `docs/internals/binary-format.md` §"SCR row-topology blocks".
|
|
167
|
+
The program file decoder (`decode_program.py`) reads Click's internal `Scr*.tmp` files. Returns a `Program` with name, index, and all rungs. Validated against the 114-rung coverage fixture, shift/counter/drum programs, and the 34-program tumbler fixture (byte-identical CSV vs clipboard captures). SCR headers use counted numeric widths and independent display flags. Every counted topology row, including the special first row, is parsed without recovery; ordinary stored wire rows are preserved. Row topology uses the uniform row-block framing documented in `docs/internals/binary-format.md` §"SCR row-topology blocks".
|
|
164
168
|
|
|
165
169
|
**All standard Click instruction types decoded natively:**
|
|
166
170
|
- Contacts: NO, NC, edge (rise/fall), immediate (NO/NC)
|
|
@@ -209,8 +213,10 @@ When the user provides a `.bin` + `.csv` from a Click capture:
|
|
|
209
213
|
|
|
210
214
|
1. **Inspect the capture:** `uv run devtools/inspect_bin.py <file.bin>` — shows known instructions with `to_csv()` output, and RawInstruction/Unknown blobs with full tagged-field breakdown (tag IDs, sentinel types, values).
|
|
211
215
|
2. **Identify what's new:** RawInstruction means the class name is recognized but the func code isn't. The field breakdown shows exactly which func code / field values differ from existing support.
|
|
212
|
-
3. **Update the code:** add func codes, fields, or new instruction modules as needed
|
|
216
|
+
3. **Update the code:** add func codes, fields, or new instruction modules as needed; CSV parsing goes through the family `SPEC`'s `parse_csv_call`.
|
|
213
217
|
4. **Update coverage CSV:** `tests/fixtures/coverage/golden/<name>.csv` — use kwargs style for boolean flags (e.g. `oneshot=1`).
|
|
214
218
|
5. **Verify:** `make test` + `make lint`.
|
|
215
219
|
|
|
220
|
+
For CLICK v4 instructions captured from pyrung stubs (`tests/fixtures/v4_captures/`, `tests/test_v4_captures.py`), see "Capturing from CLICK v4" in the guide.
|
|
221
|
+
|
|
216
222
|
See [`docs/guides/adding-instructions.md`](docs/guides/adding-instructions.md) for the full guide.
|
|
@@ -8,7 +8,43 @@
|
|
|
8
8
|
Review and condense before release — entries accumulate during development and
|
|
9
9
|
should be edited into shape before moving from Unreleased to a version heading. -->
|
|
10
10
|
|
|
11
|
-
## 0.
|
|
11
|
+
## 0.3.0 (2026-11-01)
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- **CLICK v4 Out variants**: `toggle(C1)`, `debounce(...)`, `flasher(...)` and `timed(...)` decode and encode as `OutVariant`, exported from the root package, matching Click-written blobs byte for byte.
|
|
15
|
+
- **CLICK v4 Time & Event drum**: `time_event_drum(outputs=[...],presets=[1000,None,DS1],events=[None,C1,C2],unit=Tms,...)` decodes and encodes as `Drum(drum_kind="time_event")`, with `None` marking a step without a preset or event.
|
|
16
|
+
- **CLICK v4 Break and Continue**: `break()` and `continue()` decode and encode as `Break` and `Continue`, exported from the root package; both used to decode as `next()`.
|
|
17
|
+
- **CLICK v4 Math**: wide ranges encode up to CLICK's limit of 5000 interior addresses, where more than 500 used to raise `ValueError`, and `XD`/`YD` registers are recognized as operands, including `XD0u` and its place inside a range.
|
|
18
|
+
- **CLICK v4 check**: `find_v4_only(rungs)` lists the instructions an older CLICK would silently change or may not hold (Break/Continue, Out variants, Time & Event drums, time drums with a duration from a register, v4 math functions, SUM over bits, Math ranges past 500 interior addresses), and `is_v4_only()` checks one.
|
|
19
|
+
- **Pin OR legs**: OR legs under a counter, shift or drum pin push the later pins down and grow the box as CLICK does, in clipboard and SCR, exposed as `pin_rows`.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **CSV read**: a blank-AF row directly under `count_down` is an OR leg of its Down input rather than the bridge row.
|
|
23
|
+
- **CSV errors**: pins out of order or repeated raise `ConvertError` instead of being dropped, a pin a timer does not have (e.g. `.down()`) raises `ConvertError` instead of reading as a blank row, and `write_csv` refuses a leg drawn onto an unused pin's row, which CSV cannot express.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- **Math encode**: formulas and constants are written the way Click's editor writes them (`ABS(x)*2` → `ABS ( x ) * 2`, `RAND` in its infix form, range interiors listed, `Ah` → `UH10`, `-5` → `H-5`, `-2.5` → `F-2.5`), so pasted formulas no longer raise Math instruction errors or fail CLICK v4's syntax check.
|
|
27
|
+
- **Math encode**: `show_nicknames=True` wraps each operand once, where repeated or overlapping addresses (`DS10 + DS1 + DS1`) came out corrupted.
|
|
28
|
+
- **Math decode**: `XD`/`YD` formulas keep their display constants, instead of `XD0 AND 1h` reading back as `XD0 AND UH1`.
|
|
29
|
+
- **Drum encode**: with Jump off, Jog takes the func code Jump would have, so CLICK v4 no longer rejects a pasted drum with C000A ("all inputs of the box instruction must originate from the same branch").
|
|
30
|
+
- **Unknown coils and drums**: an Out coil with an unknown func code or a drum with an unknown base decodes as `raw(...)`, instead of silently decoding as a plain `out(...)` or `time_drum`.
|
|
31
|
+
- **Raw multi-part instructions**: a `raw(...)` token with part count 2+ rebuilds Click's part bytes, so `write_csv` no longer fails its round-trip check on raw drums and SCR raw blobs carry the right bytes.
|
|
32
|
+
- **CSV read, OR inputs on boxes**: OR legs under any timer, counter, shift or drum input push its later pins down, so a `count_down` fed by a 3+ row OR no longer raises and a retentive timer fed by a 2+ row OR keeps its `.reset()`.
|
|
33
|
+
- **CSV writer**: a box's empty pin rows and a `count_down`'s empty top row stay in place when a blank-AF row or a `count_down` follows, where `write_csv` used to fail its round-trip check.
|
|
34
|
+
|
|
35
|
+
## 0.2.2 (2026-09-10)
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- **SCR decode**: parse counted column widths, independent display flags, and all stored rows so valid populated special rows no longer trigger recovery, and malformed records fail without silently skipping a rung.
|
|
39
|
+
- **SCR decode**: preserve branch wiring above a later rail-connected row instead of deleting the branch and shifting the lower wire upward.
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
- **Native drum regression fixtures**: preserve the original NOP's wire row and a branch above it after row insertion and drum placement, with native SCR/clipboard and CSV comparisons.
|
|
43
|
+
|
|
44
|
+
### Documentation
|
|
45
|
+
- Correct SCR flag meanings and fixture provenance, and distinguish native persisted flags from the encoder's construction conventions.
|
|
46
|
+
|
|
47
|
+
## 0.2.1 (2026-08-25)
|
|
12
48
|
|
|
13
49
|
### Fixed
|
|
14
50
|
- **SCR decode**: a Modbus `Send` at `device_id=0` no longer decodes as `device_id=1` — SCR blobs elide fields at their class default, and Send's device_id default (0) differs from Receive's (1).
|
|
@@ -23,7 +59,7 @@
|
|
|
23
59
|
### Fixed
|
|
24
60
|
- **SCR decode**: correct the row-topology block framing — every row (including row 0) uses one uniform block format, fixing branch rungs whose wires (`T`/`|`/`-`) were silently dropped whenever a continuation row's first right-wired cell carried segment flag 1.
|
|
25
61
|
- **SCR decode**: accept placement-ordered flag-table entries — native captures store columns out of order (e.g. `[6,1,0,3,2,4,5]`), which the old sorted-order validation rejected.
|
|
26
|
-
- **SCR decode**:
|
|
62
|
+
- **SCR decode**: introduced deletion of presumed orphan wire rows above a later rail-connected row; the claimed native clipboard agreement was based on a synthetic fixture, and this behavior is reversed in 0.2.2.
|
|
27
63
|
|
|
28
64
|
### Changed
|
|
29
65
|
- **SCR decode**: replace the heuristic topology parser (leading-row guessing, count_down special cases, end-marker scanning) with a deterministic parser derived from the verified format — see `docs/internals/binary-format.md` §"SCR row-topology blocks" for the spec.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
.DEFAULT_GOAL := default
|
|
5
5
|
|
|
6
|
-
.PHONY: default install lint test golden coverage-golden upgrade build clean docs-serve docs-build docs-check
|
|
6
|
+
.PHONY: default install lint test golden coverage-golden upgrade build clean docs-generate docs-serve docs-build docs-check
|
|
7
7
|
|
|
8
8
|
default: install lint test
|
|
9
9
|
|
|
@@ -29,11 +29,17 @@ upgrade:
|
|
|
29
29
|
build:
|
|
30
30
|
uv build
|
|
31
31
|
|
|
32
|
-
docs-
|
|
33
|
-
|
|
32
|
+
docs-generate:
|
|
33
|
+
uv run --group docs python docs/gen_reference.py
|
|
34
34
|
|
|
35
|
-
docs-
|
|
36
|
-
|
|
35
|
+
docs-serve: docs-generate
|
|
36
|
+
uv run --group docs zensical serve
|
|
37
|
+
|
|
38
|
+
docs-build: docs-generate
|
|
39
|
+
uv run --group docs zensical build --clean --strict
|
|
40
|
+
uv run --group docs python .github/scripts/prune_public_site.py site
|
|
41
|
+
uv run --group docs python docs/gen_llms.py site
|
|
42
|
+
uv run --group docs python .github/scripts/check_public_site.py site
|
|
37
43
|
|
|
38
44
|
docs-check: docs-build
|
|
39
45
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: laddercodec
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Binary codec for AutomationDirect CLICK PLC ladder clipboard format
|
|
5
|
+
Project-URL: Repository, https://github.com/ssweber/laddercodec
|
|
6
|
+
Project-URL: Documentation, https://pyrung.com/laddercodec/
|
|
7
|
+
Author-email: ssweber <57631333+ssweber@users.noreply.github.com>
|
|
8
|
+
License-Expression: MPL-2.0
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Python: <4.0,>=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
# laddercodec
|
|
24
|
+
|
|
25
|
+
**The compatibility layer for CLICK ladder data.** laddercodec reads and writes CLICK's native representations and enables reliable round-tripping between CLICK and the pyrung/ClickNick toolchain. Tested against v2.60 to v3.9x captures. Zero runtime dependencies.
|
|
26
|
+
|
|
27
|
+
It's the layer [ClickNick](https://pyrung.com/clicknick/) pastes through, and it's useful on its own to convert between CLICK ladder data, Python objects, and CSV.
|
|
28
|
+
|
|
29
|
+
- Documentation: https://pyrung.com/laddercodec/
|
|
30
|
+
- LLM docs index: https://pyrung.com/laddercodec/llms.txt
|
|
31
|
+
- LLM full context: https://pyrung.com/laddercodec/llms-full.txt
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
uv add laddercodec
|
|
37
|
+
# or
|
|
38
|
+
pip install laddercodec
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Requires Python 3.11+.
|
|
42
|
+
|
|
43
|
+
## Quick example
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from laddercodec import read_csv, encode, decode
|
|
47
|
+
|
|
48
|
+
# CSV → binary (ready to paste into Click)
|
|
49
|
+
rungs = read_csv("my_rung.csv")
|
|
50
|
+
binary = encode(rungs[0])
|
|
51
|
+
|
|
52
|
+
# Binary → structured data
|
|
53
|
+
rung = decode(binary)
|
|
54
|
+
print(rung.logical_rows)
|
|
55
|
+
print(rung.instructions)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## What's included
|
|
59
|
+
|
|
60
|
+
**[Encoder](https://pyrung.com/laddercodec/guides/encoding/)** — `encode()` takes `Rung` objects or canonical CSV and produces clipboard binary ready to paste into Click. Supports all standard instruction types, wire topologies, and styled comments.
|
|
61
|
+
|
|
62
|
+
**[Decoder](https://pyrung.com/laddercodec/guides/decoding/)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads ladder data from native CLICK program files.
|
|
63
|
+
|
|
64
|
+
**[CSV I/O](https://pyrung.com/laddercodec/guides/csv-format/)** — `read_csv()` and `write_csv()` convert between the 33-column canonical CSV format and `Rung` objects. Multi-file program bundles supported.
|
|
65
|
+
|
|
66
|
+
**[CLICK format reference](https://pyrung.com/laddercodec/internals/binary-format/)** — Technical reference for CLICK's native clipboard and program representations, including binary layouts and instruction records.
|
|
67
|
+
|
|
68
|
+
## Status
|
|
69
|
+
|
|
70
|
+
`laddercodec` is **beta** for clipboard encode/decode, CSV I/O, and `decode_program()`.
|
|
71
|
+
|
|
72
|
+
`Email`, `Home`, `Position`, and `Velocity` still intentionally surface as `raw(...)` passthroughs so clipboard and program data round-trips stay lossless while those families remain opaque.
|
|
73
|
+
|
|
74
|
+
## Learn more
|
|
75
|
+
|
|
76
|
+
| | |
|
|
77
|
+
|---|---|
|
|
78
|
+
| [Encoding guide](https://pyrung.com/laddercodec/guides/encoding/) | Encode, decode, and round-trip your first rung |
|
|
79
|
+
| [Decoding guide](https://pyrung.com/laddercodec/guides/decoding/) | Structured decode, program files, round-trip identity |
|
|
80
|
+
| [CSV format](https://pyrung.com/laddercodec/guides/csv-format/) | 33-column canonical format, bundle layout, topology rules |
|
|
81
|
+
| [Adding instructions](https://pyrung.com/laddercodec/guides/adding-instructions/) | Extend the codec with new instruction types |
|
|
82
|
+
| [API reference](https://pyrung.com/laddercodec/reference/) | Auto-generated from docstrings |
|
|
83
|
+
|
|
84
|
+
## Development
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
make install # uv sync --all-extras --dev
|
|
88
|
+
make test # pytest
|
|
89
|
+
make lint # ruff + ty
|
|
90
|
+
make golden # regenerate .bin from .csv fixtures
|
|
91
|
+
make docs-serve # local docs dev server
|
|
92
|
+
make # all of the above
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## License
|
|
96
|
+
|
|
97
|
+
[MPL-2.0](LICENSE)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# laddercodec
|
|
2
|
+
|
|
3
|
+
**The compatibility layer for CLICK ladder data.** laddercodec reads and writes CLICK's native representations and enables reliable round-tripping between CLICK and the pyrung/ClickNick toolchain. Tested against v2.60 to v3.9x captures. Zero runtime dependencies.
|
|
4
|
+
|
|
5
|
+
It's the layer [ClickNick](https://pyrung.com/clicknick/) pastes through, and it's useful on its own to convert between CLICK ladder data, Python objects, and CSV.
|
|
6
|
+
|
|
7
|
+
- Documentation: https://pyrung.com/laddercodec/
|
|
8
|
+
- LLM docs index: https://pyrung.com/laddercodec/llms.txt
|
|
9
|
+
- LLM full context: https://pyrung.com/laddercodec/llms-full.txt
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv add laddercodec
|
|
15
|
+
# or
|
|
16
|
+
pip install laddercodec
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Requires Python 3.11+.
|
|
20
|
+
|
|
21
|
+
## Quick example
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from laddercodec import read_csv, encode, decode
|
|
25
|
+
|
|
26
|
+
# CSV → binary (ready to paste into Click)
|
|
27
|
+
rungs = read_csv("my_rung.csv")
|
|
28
|
+
binary = encode(rungs[0])
|
|
29
|
+
|
|
30
|
+
# Binary → structured data
|
|
31
|
+
rung = decode(binary)
|
|
32
|
+
print(rung.logical_rows)
|
|
33
|
+
print(rung.instructions)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## What's included
|
|
37
|
+
|
|
38
|
+
**[Encoder](https://pyrung.com/laddercodec/guides/encoding/)** — `encode()` takes `Rung` objects or canonical CSV and produces clipboard binary ready to paste into Click. Supports all standard instruction types, wire topologies, and styled comments.
|
|
39
|
+
|
|
40
|
+
**[Decoder](https://pyrung.com/laddercodec/guides/decoding/)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads ladder data from native CLICK program files.
|
|
41
|
+
|
|
42
|
+
**[CSV I/O](https://pyrung.com/laddercodec/guides/csv-format/)** — `read_csv()` and `write_csv()` convert between the 33-column canonical CSV format and `Rung` objects. Multi-file program bundles supported.
|
|
43
|
+
|
|
44
|
+
**[CLICK format reference](https://pyrung.com/laddercodec/internals/binary-format/)** — Technical reference for CLICK's native clipboard and program representations, including binary layouts and instruction records.
|
|
45
|
+
|
|
46
|
+
## Status
|
|
47
|
+
|
|
48
|
+
`laddercodec` is **beta** for clipboard encode/decode, CSV I/O, and `decode_program()`.
|
|
49
|
+
|
|
50
|
+
`Email`, `Home`, `Position`, and `Velocity` still intentionally surface as `raw(...)` passthroughs so clipboard and program data round-trips stay lossless while those families remain opaque.
|
|
51
|
+
|
|
52
|
+
## Learn more
|
|
53
|
+
|
|
54
|
+
| | |
|
|
55
|
+
|---|---|
|
|
56
|
+
| [Encoding guide](https://pyrung.com/laddercodec/guides/encoding/) | Encode, decode, and round-trip your first rung |
|
|
57
|
+
| [Decoding guide](https://pyrung.com/laddercodec/guides/decoding/) | Structured decode, program files, round-trip identity |
|
|
58
|
+
| [CSV format](https://pyrung.com/laddercodec/guides/csv-format/) | 33-column canonical format, bundle layout, topology rules |
|
|
59
|
+
| [Adding instructions](https://pyrung.com/laddercodec/guides/adding-instructions/) | Extend the codec with new instruction types |
|
|
60
|
+
| [API reference](https://pyrung.com/laddercodec/reference/) | Auto-generated from docstrings |
|
|
61
|
+
|
|
62
|
+
## Development
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
make install # uv sync --all-extras --dev
|
|
66
|
+
make test # pytest
|
|
67
|
+
make lint # ruff + ty
|
|
68
|
+
make golden # regenerate .bin from .csv fixtures
|
|
69
|
+
make docs-serve # local docs dev server
|
|
70
|
+
make # all of the above
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## License
|
|
74
|
+
|
|
75
|
+
[MPL-2.0](LICENSE)
|
|
@@ -31,7 +31,8 @@ def main() -> None:
|
|
|
31
31
|
row = data[cursor]
|
|
32
32
|
col = data[cursor + 1]
|
|
33
33
|
blob_start = cursor + 8
|
|
34
|
-
cls, typ, end_off,
|
|
34
|
+
cls, typ, end_off, part_rows = blob
|
|
35
|
+
m1 = len(part_rows)
|
|
35
36
|
next_pos = end_off + 2 + data[end_off] # trailer-aware advance
|
|
36
37
|
|
|
37
38
|
# Parse tagged fields
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Generate a concise llms.txt index for the rendered Zensical site."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import fnmatch
|
|
7
|
+
from collections.abc import Iterator, Sequence
|
|
8
|
+
from pathlib import Path, PurePosixPath
|
|
9
|
+
from urllib.parse import urljoin
|
|
10
|
+
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
15
|
+
CONFIG_PATH = ROOT / "mkdocs.yml"
|
|
16
|
+
DOCS_DIR = ROOT / "docs"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _navigation_titles(nav: list[object]) -> dict[str, str]:
|
|
20
|
+
titles: dict[str, str] = {}
|
|
21
|
+
|
|
22
|
+
def visit(items: Sequence[object]) -> None:
|
|
23
|
+
for item in items:
|
|
24
|
+
if not isinstance(item, dict):
|
|
25
|
+
continue
|
|
26
|
+
for title, target in item.items():
|
|
27
|
+
if isinstance(target, str):
|
|
28
|
+
titles[target] = str(title)
|
|
29
|
+
elif isinstance(target, list):
|
|
30
|
+
visit(target)
|
|
31
|
+
|
|
32
|
+
visit(nav)
|
|
33
|
+
return titles
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _source_uris(pattern: str) -> Iterator[str]:
|
|
37
|
+
candidates = sorted(
|
|
38
|
+
path.relative_to(DOCS_DIR).as_posix() for path in DOCS_DIR.rglob("*.md")
|
|
39
|
+
)
|
|
40
|
+
yield from fnmatch.filter(candidates, pattern)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _destination_uri(source_uri: str) -> str:
|
|
44
|
+
source = PurePosixPath(source_uri)
|
|
45
|
+
if source.name == "index.md":
|
|
46
|
+
parent = source.parent.as_posix()
|
|
47
|
+
else:
|
|
48
|
+
parent = source.with_suffix("").as_posix()
|
|
49
|
+
return "" if parent == "." else f"{parent}/"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def main() -> int:
|
|
53
|
+
parser = argparse.ArgumentParser(description="Generate the LLM documentation index.")
|
|
54
|
+
parser.add_argument("site", type=Path, help="Rendered Zensical site directory")
|
|
55
|
+
args = parser.parse_args()
|
|
56
|
+
|
|
57
|
+
config = yaml.safe_load(CONFIG_PATH.read_text(encoding="utf-8"))
|
|
58
|
+
site_dir = args.site.resolve()
|
|
59
|
+
if not site_dir.is_dir():
|
|
60
|
+
raise RuntimeError(f"Rendered site directory does not exist: {site_dir}")
|
|
61
|
+
|
|
62
|
+
base_url = config["site_url"]
|
|
63
|
+
if not base_url.endswith("/"):
|
|
64
|
+
base_url += "/"
|
|
65
|
+
titles = _navigation_titles(config["nav"])
|
|
66
|
+
|
|
67
|
+
output = f"# {config['site_name']}\n\n"
|
|
68
|
+
if description := config.get("site_description"):
|
|
69
|
+
output += f"> {description}\n\n"
|
|
70
|
+
|
|
71
|
+
seen: set[str] = set()
|
|
72
|
+
for section, patterns in config["extra"]["llmstxt"]["sections"].items():
|
|
73
|
+
output += f"## {section}\n\n"
|
|
74
|
+
for pattern in patterns:
|
|
75
|
+
matches = list(_source_uris(pattern)) if "*" in pattern else [pattern]
|
|
76
|
+
for source_uri in matches:
|
|
77
|
+
if source_uri in seen:
|
|
78
|
+
continue
|
|
79
|
+
seen.add(source_uri)
|
|
80
|
+
title = titles.get(source_uri)
|
|
81
|
+
if title is None:
|
|
82
|
+
raise RuntimeError(f"Navigation title not found for {source_uri}")
|
|
83
|
+
destination_uri = _destination_uri(source_uri)
|
|
84
|
+
html_path = site_dir / Path(destination_uri) / "index.html"
|
|
85
|
+
if not html_path.is_file():
|
|
86
|
+
raise RuntimeError(f"Rendered page not found: {html_path}")
|
|
87
|
+
output += f"- [{title}]({urljoin(base_url, destination_uri)})\n"
|
|
88
|
+
output += "\n"
|
|
89
|
+
|
|
90
|
+
(site_dir / "llms.txt").write_text(output, encoding="utf-8")
|
|
91
|
+
return 0
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
raise SystemExit(main())
|