Repository navigation
Conversation
…cel drivers - extract cell_result.py (xlwings cell / spill observation into CaseResult) and case_sheet.py (sheet naming, merges, error triggers, print-block helpers) from macos_excel.py and windows_excel.py - split windows_excel.py into windows_com.py (COM primitives), windows_pivot.py (PivotTable build and readout) and windows_page_setup.py (PageSetup readers) - keep the old private names reachable from the driver modules as aliases - list the new modules in the tools/oracle README layout tree - behavior-preserving move
- move the C header parser, ABI baseline, declaration, Python and shape checks from check_binding_drift.py into tools/dev/binding_drift/ modules - keep check_binding_drift.py as the entrypoint that imports and runs the checks, still re-exporting c_abi_declarations for gen_c_abi_baseline.py - behavior-preserving move
…ontributor modules - move the targets.yaml loader and host label to targets_manifest.py, the per-target host checks behind setup to preflight.py, and the contributor flow to contribute.py - keep cli.py as the list / setup / gen / contribute dispatcher - update the cli.py references in the _locale.py and oracle_gen.py comments - list the new modules in the tools/oracle README layout tree - behavior-preserving move
…oracle_gen - move the DataBar / IconSet match computation (threshold resolution, population, per-cell matches) into cf_visual_semantics.py - add cf_visual_semantics_test.py and register it as formulon_cf_visual_semantics_unit in tests/oracle/CMakeLists.txt, since these payloads are computed rather than captured - cf_oracle_gen.py calls the new module; generated output is unchanged
- move invoke_lambda, parameter binding, the arity and lambda-depth rules, callable resolution and reference resolution through a lambda body into tree_walker/lambda_invoke.cpp - register lambda_invoke.cpp in CMakeLists.txt - update the file-layout comments in dispatch.h, walker.cpp, depth_guard.h and lambda_value.h - behavior-preserving move
…ut of forecast_ets_lazy
- move series sorting/aggregation, step detection, grid resampling and seasonality detection into ets_series.{h,cpp}
- move the Holt-Winters smoothing fit into holt_winters.{h,cpp}
- expose Series, AggregationMode, sort_and_aggregate, median_delta, resample_to_grid, detect_seasonality, HoltWintersFit and fit_holt_winters in namespace formulon::eval::ets
- forecast_ets_lazy.cpp keeps argument reading, preprocessing and the four impls; register the new TUs in CMakeLists.txt
- behavior-preserving move
- move binding-name validation and the parse_let_call / parse_lambda_call Parser members out of parser_reference.cpp - register parser_let_lambda.cpp in CMakeLists.txt - update the file-layout comments in parser.cpp and parser_detail.h - behavior-preserving move
- move sheet_name_needs_quoting and format_a1 from ast.cpp into reference.cpp, matching the parser/reference.h header - drop the includes ast.cpp no longer needs and register reference.cpp in CMakeLists.txt - behavior-preserving move
…e prefixes
- move spell_storage_operators and its SINGLE / ANCHORARRAY call helpers from ast_format.{h,cpp} into formula_prefix.{h,cpp}
- include formula_prefix.h from ast_format_test.cpp and register formula_prefix.cpp in CMakeLists.txt
- behavior-preserving move
…k_bin_reader
- move the sheet bundle, date system, protection, BrtName, supporting-book and BrtExternSheet decoding out of reader.cpp into workbook_bin_reader.{h,cpp}
- reader.cpp keeps the package-level orchestration and consumes the new header
- register workbook_bin_reader.cpp in FORMULON_CORE_SOURCES
- behavior-preserving move, no logic changes
…ut of the writers
- move the workbook.bin globals, sheet bundle, BrtExternSheet and BrtName encoding from writer.cpp into workbook_bin_writer.{h,cpp}
- move the collect_* name and sheet-range passes from ptg_writer.cpp into ptg_declarations.cpp; their declarations stay in ptg_writer.h
- add ptg_targets.h for the primitives shared by the encoder and the collection pass: IsFutureFunction, UsesHiddenNameRoute, resolve_ixti
- kXtiNoSheet now has a single inline constexpr definition in ptg_targets.h (previously defined twice)
- register ptg_declarations.cpp and workbook_bin_writer.cpp in FORMULON_CORE_SOURCES
- behavior-preserving move, no encoding changes
…y_reader
- move the merge, hyperlink, data-validation and related overlay readers from sheet_reader.{h,cpp} into sheet_overlay_reader.{h,cpp}
- include sheet_overlay_reader.h from ooxml_reader.cpp and the io roundtrip/diagnostics tests
- register sheet_overlay_reader.cpp in CMakeLists.txt
- point the xml_utils.h comment at read_xsd_bool in io/xsd_bool.h
- behavior-preserving move; no logic changes
- move the style-table mutation entry points from c_api/parts/styles.cpp into styles_mutate.cpp - move effective_num_fmt to the model layer (styles.h / styles.cpp) beside builtin_num_fmt so both files share it - register styles_mutate.cpp in CMakeLists.txt - behavior-preserving move; no logic changes
…les.cpp - move the _xlnm.Print_Area / _xlnm.Print_Titles setters and getters out of print_settings.cpp - add print_area_titles.cpp with its own A1 token helpers and register it in CMakeLists.txt - divide the 17 KB size budget into 12 KB (print_settings) and 5 KB (print_area_titles) - behavior-preserving move; no logic changes
… sources - cells.cc takes cell mutation and read (including phonetic), ad-hoc eval and lambda text from lifecycle.cc, which keeps calc policy, recalc, dispose, save and diagnostics - sheet_ui.cc takes merges, comments, hyperlinks and validations from sheet_view.cc, which keeps view, protection and column/row layout - register the new parts in addon.cc and cmake/FormulonNodeAddon.cmake - mirrors the WASM parts layout (workbook_cells / workbook_ui); behavior-preserving move
…l recalc - detail::SpillWaveBudget in spill_release owns the spill release/dependency wave ceilings and no-progress tracking for the full, partial and parallel drivers; each driver keeps deciding when it counts - private SerialEvalPass + evaluate_formula_cell_locked replace four copies of the single-cell evaluate block - evaluate_cyclic_component_locked replaces the duplicated cyclic-component branch - error messages are unchanged - recalc_engine.h docs now describe the current SCC/cycle handling: dirty-subgraph Tarjan, components settled by reads, the iterative solver, or #REF!
…rd.{h,cpp}
- split the wildcard matcher bodies from eval/criteria.cpp into eval/wildcard.cpp, declared in eval/wildcard.h
- SEARCH/MATCH/XLOOKUP callers (text.cpp, text_dbcs.cpp, lookups/classic.cpp, lookups/xlookup.cpp) include eval/wildcard.h instead of criteria.h
- move the wildcard tests from criteria_test.cpp to wildcard_test.cpp and register both new sources in CMake
- fix the `?` doc comment to say it matches one code point, as the code does
- list the new files in tools/dev/coverage_report.py and run_mutation.sh
- move the A1/R1C1 parsing bodies from reference/common.cpp to eval/a1_parse.cpp next to the existing a1_parse.h - reference/common.cpp keeps the INDIRECT/OFFSET shared resolution - rephrase a TODO comment in reference/common.h and indirect.h as the constraint it records - register eval/a1_parse.cpp in CMakeLists.txt
- split formulon_c_cf_test.cpp into cf_authoring, cf_evaluation, cf_overlay, cf_validation and cf_visual_payload files - split formulon_c_pivot_test.cpp into pivot_authoring, filters, grouping, lifecycle and read files - split formulon_c_styles_test.cpp into styles_alignment, cell_xf, dxf, fills_borders, fonts, lifetime, mutation and num_formats files - move save and value cases out of formulon_c_test.cpp into formulon_c_save_test.cpp and formulon_c_values_test.cpp - add shared formulon_c_*_test_helpers.h headers; update tests/c_api/CMakeLists.txt - test cases are unchanged, only moved
- split cli_test.cpp into cli_atomic_paths, cli_commands_version_eval, cli_dump_paginate and cli_recalc_semantics tests
- add cli_test_support.{h,cpp} for the shared fixtures and helpers
- update tests/cli/CMakeLists.txt; test cases are unchanged, only moved
- split scheduler_test.cpp into scheduler_layers, scheduler_reliability and scheduler_stress tests - add scheduler_test_helpers.h for shared helpers - SchedulerSlow.* now lives in scheduler_stress_test.cpp, the only file compiled into the stress executable - test cases are unchanged, only moved
- split sheet_ops_test.cpp into 3d_structural_recalc, name_rename, remove_move_defined_names and row_col_edits files with sheet_ops_test_support.h - move ooxml_corpus_test.cpp helpers into ooxml_corpus_support.h, ooxml_corpus_package_support.cpp and ooxml_corpus_cases.cpp - update tests/integration/CMakeLists.txt; test cases are unchanged, only moved
- move pivot and print builders out of workbook_builder.cpp into workbook_builder_pivot.cpp and workbook_builder_print.cpp - add workbook_builder_internal.h for the shared declarations - move the skip registry cases into oracle_skip_registry_test.cpp with oracle_test_support.h - update tests/oracle/CMakeLists.txt; test cases are unchanged, only moved
- split cf_evaluator_test.cpp into cf_evaluator_context, population and range test files - register the new files in tests/CMakeLists.txt; test cases are unchanged, only moved
- split builtins_datetime_test.cpp into 1904, calendar, clock and months files with builtins_datetime_test_helpers.h - split builtins_distributions, builtins_financial, builtins_lookup, builtins_pivotby and builtins_references tests into topic files, each family with a *_test_helpers.h header - split dep_extractor_test.cpp into names, structured_refs and 3d_dynamic files with dep_extractor_test_helpers.h - register the new files in tests/CMakeLists.txt; test cases are unchanged, only moved
- split pivot_table_reader_test.cpp into attributes, corruption and filters files with a shared helpers header - split xlsb/ptg_codec_test.cpp, xlsb/reader_test.cpp and xlsb/writer_test.cpp into topic files, each with a *_test_helpers.h header - split xlsb_roundtrip_symmetry_test.cpp into defined_names and numeric_layout files with a helpers header - register the new files in tests/CMakeLists.txt; test cases are unchanged, only moved
- split pivot_evaluator_test.cpp into aggregation, filter, grouping, ordering and totals files - split pivot_filter_test.cpp into date, label, page and value files with pivot_filter_test_helpers.h - split pivot_layout_test.cpp into axes, page and subtotals files with pivot_layout_test_helpers.h - register the new files in tests/CMakeLists.txt; test cases are unchanged, only moved
- split sheet_spill_test.cpp into sheet_spill_validation, sheet_read_range, sheet_spill_lifetime and sheet_spill_scale test files - finalize the unit test source list in tests/CMakeLists.txt; test cases are unchanged, only moved
- split packages/npm/test/smoke.test.mjs into smoke_cf_validation_roundtrip, smoke_pivot_mutators_status, smoke_print_recalc_callbacks, smoke_result_contracts and smoke_surface_log_eval modules - add smoke_support.mjs for the shared helpers; test cases are unchanged, only moved
- split packages/npm-native/test/smoke.test.mjs into callbacks_cf, cells_io_catalog, layout_styles, lifecycle_recalc, pivot_mutators_status, pivot_surfaces, regressions, result_contracts and surface_log_eval_print modules - add smoke_support.mjs for the shared helpers; test cases are unchanged, only moved
- erase DataValidation entries whose range list is empty after ShiftRangeList in Sheet::shift_sheet_metadata - add a structural_edit_matrix_test case for a validation fully covered by a deleted row/col
…er a value filter - store the custom subtotal aggregation on RowSubtotal (pivot_result.h) when the subtotal is built in evaluate - ReaggregateTotalsAfterValueFilter uses subtotal.aggregation, falling back to the data field aggregation - add a pivot_evaluator_filter_test case for a custom subtotal under a value filter
…ystem - replace WithoutXlPrefix with TargetRelativeToWorkbook, emitting ../customXml/... for package-root parts in OOXML and XLSB workbook rels - TargetRelativeToWorksheet prefixes ../../ for package-root parts - add SynchronizedWorkbookPr in workbook_xml_builder.cpp: align retained <workbookPr> date1904 and legacy 1904 attributes with the model flag - return an already-matching or unparseable fragment byte-for-byte so no-op saves do not drift - update Workbook::set_date1904 docs in workbook.h - cover with ooxml_output_contract_test and xlsb writer_metadata_test
- flag ISO date payloads with ParsedCell::is_iso_date in decode_cell_payload, which stays on the 1900 serial axis - ApplyParsedCell subtracts date_time::kDate1904EpochGap once at the shared storage boundary for literals and formula caches - plain numeric cells with the same serial remain unchanged - cover with cell_parser_test and sheet_reader_lexing_parity_test
… surfaces - node_addon/parts: guard positional arguments with TypeError/RangeError before entering native code - wasm/parts: reject coercing values before embind enters a native method; catch caller-owned getter failures in JS - add tools/codegen/gen_wasm_positional_guards.py to generate src/wasm/generated/checked_arguments.pre.js from the N-API registration table - wire the generated pre-js into FormulonWasm.cmake as a custom command and link dependency - update index.d.ts and formulon.d.ts - add node validation tests and tests/wasm positional/layout/cell/style/pivot regressions
…al_format.cc - move the conditional-format surface, including EvaluateCfRange, out of parts/styles.cc - update the addon.cc file map and FormulonNodeAddon.cmake source list - pure move, no behaviour change
- fold month >= 13 into the year before computing days (was off by two days) - accept wide day offsets without overflowing intermediate values - add tests/unit/utils/date_time_test.cpp and register it in tests/CMakeLists.txt
- iso_date.cpp parses Z / +hh:mm suffixes on date-only values - bound the offset hours and minutes to valid ranges - extend iso_date_test.cpp
- cap TIME components at 32767 as Excel does - add int-range guards before integer conversion - return #NUM! for non-finite or huge inputs - extend builtins_datetime_test.cpp
…display - route TEXT/display of bool and non-numeric text through the text section; a text-only section shows numbers as General - validate formats fully: more than 4 sections, condition in section 3+, @ mixed with numeric/date tokens, unterminated quote/bracket/escape/_/* - dispatch conditional sections with implicit sign arms and Excel sign rules; a value no two-section arm accepts is #VALUE! in TEXT and ##### in display - rewrite the fraction renderer: continued-fraction search, fixed/zero-prefixed denominators, % applied first - add scientific engineering grouping and comma-before-point scaling - make non-finite/overflow output safe with atomic output - render dates from one rounded second with midnight carry and exact fractional seconds - fix the FIXED/DOLLAR decimals range - add Cell::has_explicit_xf so an explicit style 0 stays distinct from a storage gap and overrides row/column styles; round-trip it in OOXML and XLSB - xlsx writer forces s="0" only on observable blank, formula-less cells; spill phantoms take their effective style in both writers - CELL() and display text read the effective cell/row/column XF - move into own TUs: sheet_layout_reader.* (outline-level parser to xsd_int.h), parser/parse_error.cpp, tree_walker/binding_source.cpp - move numeric aggregate kernels to src/numeric_aggregate_kernels.* shared with pivot; algorithms unchanged; add Excel-measured overflow and last-bit tests - oracle-diff: 147 TEXT cases on Mac Excel 365 ja-JP all match except backslash-escape cases that differ only via the Windows profile backslash-to-yen mapping; AVERAGE/VAR/STDEV last-bit and overflow results re-measured and match the kept algorithms
- clamp drawing anchor shifts in drawing_edit.cpp so an insert near the last row/column cannot overflow - add drawing_edit_test.cpp coverage
…ructural and option edits - formulas referencing a missing sheet re-register when it is added or renamed into existence - partial recalc admits uncommitted spill producers for static and runtime reads - iteration option changes dirty all formulas; a #REF! cached by a disabled-iteration cycle is reset only on the disabled->enabled transition - profile, 1904 and pinned-clock changes clear pivot results and dirty formulas - bulk set_defined_names re-registers formulas; set_defined_name_hidden takes the lock - bookViews activeTab/firstSheet remap on sheet remove/move - row/col edits rewrite defined names and unowned tables/pivot caches with the owning sheet's transform, dirty committed spill anchors, and drop ranges pushed wholly off the grid - add_merge/remove_merges_intersecting normalise reversed ranges and reject off-grid ranges - oracle-diff: no Excel-observable formula result changes beyond the above state handling; covered by unit and integration tests
…filters and GETPIVOTDATA - pivot authoring edits dirty dependent formulas so GETPIVOTDATA refreshes - guard pivot cache auto-id overflow - share a date-serial validity domain (src/pivot/date_serial.h) between grouping and filters - catch-all and raw bands keep invalid serials from merging with group keys - GETPIVOTDATA matches items by typed identity (date-grouped items by label only) and rejects ambiguous field names - reject value filters on an unknown field at authoring - pivot aggregates use the shared numeric aggregate kernels - document the affected C API entry points in formulon_c.h - oracle-diff: pivot creation cannot be captured on the Mac host, so these changes rest on unit and C API tests
- Node string fields are strict (string or one-byte buffer), matching WASM - getCellsInRange reads its range the same way as the merge methods - 64-bit cursor bound is Number.MAX_SAFE_INTEGER on both surfaces - WASM nested-field rejections throw TypeError/RangeError, or rethrow the getter's exception, via the generated pre-js wrapper - build the generated pre-js into the build directory and stop committing it; gen_wasm_positional_guards.py now requires --output - extend Node and WASM validation tests
- Reduce multi-line step comments to one line each, keeping the Excel rules they state (sign treatment, fraction alignment, engineering groups) - No code change
- Add find_unique_field_by_name, which treats a name shared by distinct fields as no match, and use it from GETPIVOTDATA and resolve_field_by_any_name - Filters and C API calls naming an ambiguous field are now rejected without mutation, like an unknown name; GETPIVOTDATA keeps #REF! - Not checked against Excel: pivots cannot be authored on the Mac oracle
- Row/column inserts now remove a pivot whose anchor leaves the grid, matching merges, hyperlinks and validations; a pivot only partly pushed off is still clipped - A GETPIVOTDATA reading the dropped pivot becomes #REF! through the reference rewrite - Not checked against Excel: pivots cannot be authored on the Mac oracle
- Spill collision probes and covering lookups visit only regions in the queried row bands instead of every committed spill; very tall regions stay on a list every query visits - Loading a sheet with many dynamic-array anchors is no longer quadratic - Results are unchanged; a test compares every query against a brute-force scan
- Range-watcher dirty marking revisits only owners added since its last visit in the current dirty-set generation, removing the quadratic cost of adding formulas under whole-column watchers - Partial recalc admits a potential spill producer only when no stored formula or value sits between it and the blank target, for static closure cells and small runtime read rectangles - A partial pass now marks dependents outside its closure dirty before unmarking the cells it evaluated, so a later full recalc refreshes them - No Excel-observable change beyond refreshing stale dependents
- SUMIF and AVERAGEIF share one criteria driver, like the SUMIFS family - run the ten pairwise statistics (CORREL, COVARIANCE.P/S, SLOPE, INTERCEPT, RSQ, STEYX, SUMX2PY2, SUMX2MY2, SUMXMY2) through one driver keyed by an enum - WORKDAY, NETWORKDAYS and their .INTL forms share one driver - REDUCE and SCAN share their argument prelude - IRR and XIRR share the optional-guess reader - PRICE and YIELD share read_coupon_bond in financial_clean_price.h - REGEXTEST and REGEXEXTRACT reuse their per-subject lambda for the scalar path - behaviour unchanged; oracle diff: fast tier including oracle suites passes unchanged - WASM: raw about -8.7 KB, Brotli neutral
- Print_Area and Print_Titles resolution share one lookup, comma-split and clean helper in print_area.cpp - error codes and message strings unchanged - a formula containing both an empty and a malformed token now reports the empty-token error first
- add utils/number_text with snprintf-compatible %f/%e/%g and integer/hex formatting - take float digits from double-conversion, rounding exact binary ties to even as printf does (double-conversion alone rounds them up) - move every engine snprintf and std::to_string(double) onto it - route pugixml XPath number formatting through a WASM-only --wrap=snprintf in FormulonWasm.cmake, next to the existing strtod wrap - musl's printf machinery leaves the module - output is byte-identical: number_text_test.cpp checks parity against host snprintf over hand-picked values, random magnitudes, exact ties and random bit patterns - oracle diff: fast tier passes unchanged - WASM: 3,293,540 -> 3,292,036 raw, Brotli -2.1 KB (901,702)
- extract deleteAfterLifecycleProbe(wb, lifecycle) in run_positional.mjs and call it from the two lifecycle-guard tests - a cleanup failure no longer rethrows from inside finally, which Biome lint/correctness/noUnsafeFinally rejected in the CI format check - behaviour unchanged; the WASM smoke suite passes
- the split-out file relied on a transitive include that libstdc++ does not provide, so the Linux native build failed
- Bump the version to 0.13.0 in CMakeLists.txt, src/version.h, both npm package.json files, pyproject.toml and uv.lock - Close the CHANGELOG release section, adding the fixes, behaviour changes and performance work landed since the section was drafted - Add v0.13.0 to the release index and list the new UI-facing APIs in the README non-goals table
- GCC's -Wrange-loop-construct rejected the by-value structured binding over std::pair, failing the Linux native build under -Werror
- GCC's -Wfloat-conversion rejected the integer literal 123456789012345678 converting to double under -Werror - the double literal rounds to the same value, so expectations are unchanged
- the variable-denominator search ran its continued-fraction expansion in long double, which is wider than double on x86-64 and aarch64 Linux and on WASM; there 1/0.1 became 9.99... instead of 10, so TEXT(0.1,"?/?") rendered 1/9 while macOS rendered 0/1 - expand in double so every platform takes Excel's terms; candidate comparison is unchanged - oracle diff: Mac Excel 365 ja-JP returns 0/1, 0/1, 1/9, 2/7 for TEXT(0.1/0.09/0.11/0.3,"?/?"); a standalone harness of the search gives identical results under clang on arm64 and GCC on x86-64
Owner
Author
|
Closing: releases advance main by fast-forwarding develop, not through a PR. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release v0.13.0. The full change list is in the
[0.13.0]section ofCHANGELOG.md.Highlights:
fm_cell_xfandfm_row_layout_tgrow,fm_styles_set_cell_styletakes a record, and the Node addon and WASM reject wrongly typed arguments instead of coercing them.printf.