Changes for version 0.017.1 - 2026-10-25

  • Bug Fixes
    • script/database-bi: shebang is perl again; the script starts morbo itself when given no arguments. 0.017.0's morbo shebang caused each worker to spawn another morbo, growing PERL5LIB until exec failed with E2BIG.
    • GET /map: HTML::OSM older than 0.12 now produces a warning page instead of a 500. 0.017.0 passed search => 0 and max_zoom unconditionally; older HTML::OSM rejected the unknown keys.
    • GET /map: ?agg= removed (it was accepted and ignored).
    • /join: schema-type mismatch warnings now fire correctly. DataSource delegates schema() to its inner backend; the controller compares types across join steps and reports differing columns.
    • data_dir may be absolute. A relative value is still resolved against the application home; an absolute one was previously appended to it.
    • Database::BI::Extract: removed unused _get_or_build_extract; corrected class docs (the web app does not materialise extracts).
    • script/bi-alert: corrected docs -- it writes to STDOUT, not email. --dry-run is accepted for compatibility only.
    • Parallel test runs (HARNESS_OPTIONS=j10) are now deterministic. Upload staging moved to a per-deployment uploads_dir config key (.uploads by default); test files each use their own temp directory.
    • Browser fixture: selector quoting no longer depends on the JSON backend's allow_nonref setting.
    • t/integration.t: %INC restored after Test::Without::Module block, eliminating "Subroutine ... redefined" noise.
    • Every page now sets <html lang> from the resolved language. 36 render calls were missing the stash key.
    • Geo::Coder::Free minimum raised to 0.48 throughout (floor constant, error messages, docs). The floor was 0.47, but 0.48 introduced the per-lookup read counts the application uses.
    • _resolve_language now falls back to the default language when the resolved code has no template directory, as documented.
  • New Features
    • GET /map: ?size=<col> draws bubble markers scaled 6-30 px.
    • GET /map: ?series=<col>&scheme=<name> colours markers by category with a legend. Mutually exclusive with ?color=.
  • Documentation
    • Complete /map parameter reference; HTML::OSM 0.12 floor; Nominatim search always suppressed.
    • "Command-line tools" section covering all three scripts.
    • Canvas, analyses API, sharing/embedding, catalog, insights, ask, summary and geo endpoints (previously README-only).
  • Tests
    • t/launcher.t: asserts perl shebang on every shipped script.
    • t/map.t and t/integration.t: drive both renderer states via the controller's _map_renderer_version probe.
    • t/edge_cases.t: covers uploads_dir resolution (absolute, relative, unset).
    • t/map.t: covers the canvas in both renderer states.
    • Every test file now gives the app its own model_dir temp directory.
    • t/browser-canvas-map-degraded.t: browser test for the degraded map card.
    • Map-rendering assertions in t/map.t, t/integration.t and t/unit.t now require HTML::OSM 0.12 (not merely installed).
    • browser.yml: no-renderer, no-renderer-canvas, no-geocoder and renderer jobs added; each pins or verifies one optional module.
    • BI::Test::Browser: config keys written before app startup; fixture builds a language home for non-shipped locales; app_setup coderef supported.
    • t/browser-fixture.t: checks fixture behaviour without a browser.
    • t/browser-map-page-renderer.t, t/browser-map-geocoder.t, t/browser-canvas-map-geocoder.t: browser coverage for optional-module degraded states.
    • t/browser-offline-assets.t: skips map assertions below HTML::OSM 0.12; adds D3-drawn bar assertions.
    • t/recommended-versions.t: asserts tests and application code gate recommended modules at the declared version floor.
    • t/browser-language.t: browser coverage for configured, default and fallback languages.
    • .github/workflows/actionlint.yml: lints all workflows on push/PR (pinned actionlint 1.7.12 + shellcheck 0.10.0); fixed 24 shellcheck findings in existing workflows.
    • browser.yml: keyboard job handles missing HTML::OSM without failing; browser-map-panel.t no longer dies when a card has no script.
    • Every browser job publishes a coverage report to the job summary.
    • t/workflow-browser.t: guards the renderer job's file list.

Documentation

Modules

Web-based Business Intelligence viewer for data files
Natural language to analysis spec
Safe recursive-descent expression evaluator for Database::BI
Home picker, filesystem browser, table viewer, left-join engine, result filter, export, and file upload
SQLite materialisation cache for Database::BI
Automatic statistical insights for Database::BI (Phase 5.2)
Table-agnostic adapter around Database::Abstraction
Resolve a location column to coordinates, once per distinct value
Narrative summary generation for an analysis result
the chapters of the in-application tutorial
Shared utility functions for Database::BI modules