Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
38b4bdd
multi-dataset aware test analysis + local bundle build
Oct 6, 2026
2bcce98
renv.lock for R 4.6.1 + working bundle build (local jaspBase swapped in)
Oct 6, 2026
c689e39
fix testMultiDataSet.qml missing ./common import (ExplanationText is …
Oct 6, 2026
a1de1e6
multiDataSetFunc wrapped (hasWrapper): Internal entry point + generat…
Oct 6, 2026
b9a9998
NEWS: wrapped multi-dataset test analysis, headless test scripts, tes…
Oct 6, 2026
106030a
wrappers for the whole module: all analysis funcs renamed to <func>In…
Oct 7, 2026
736439c
remove 4 dead Description entries (+orphaned R files); two VariablesF…
Oct 7, 2026
2ef9f63
multiDataSet demo: index the encoded namespace directly
Oct 7, 2026
5b983c9
demo the syntax-mode dataset selection; twin gets its own form
Oct 7, 2026
2bc37b8
buildBundle QML gate: parse forms in-process with a dummy dataset sel…
Oct 7, 2026
08cc56a
TODO: mark plot decode + encoder-id hardening done (jasp-desktop d8ed…
Oct 7, 2026
631a92b
buildBundle installs the result into the local dev JASP automatically
Oct 7, 2026
2f66030
Crash 2026-10-08: root cause + fix + scripted RPC repro/verify
Oct 8, 2026
92d3795
TODO: pointer to the per-host FilterSelect refactor plan (linked-drop…
Oct 8, 2026
c2d59eb
module: route selected variables through the FORM'S OWN selection sli…
Oct 8, 2026
13a207a
RPC verifier drives the dropdown contract itself (filter-id options, …
Oct 8, 2026
11575e6
tables built as data.frames via setData (fixes invisible results: per…
Oct 8, 2026
944d60e
TODO: review-round resolutions (empty-tables root cause, pair provena…
Oct 8, 2026
0e85acd
TODO: pointer to the approved jaspTools bridge-parity plan
Oct 8, 2026
8e99bac
testMultiDataSet: paths 1+3 demand jaspTools bridge parity (RED)
Oct 8, 2026
1eddaa0
parity: paths 1+3 assert plain-name engine semantics through the bridge
Oct 9, 2026
3cd9540
buildBundle checklist drops getDataSetColumn (deleted, zero-export ro…
Oct 9, 2026
2dab3fe
reference analysis + wrapper + bundle check: zero-export contract
Oct 9, 2026
7daf195
Track C checks: loadDataSets ids, dataset-id selections, loud rejections
Oct 9, 2026
c639c33
make it compile on macos arm
JorisGoosen Oct 12, 2026
210673c
mds-plan C1/B1b: wrapper-body jaspBase ref check
Oct 13, 2026
ca0cbc6
mds-plan C3: VERIFY-live phantom-slice checks in RPC verifier (mid-se…
Oct 13, 2026
c1396e6
mds-plan C4: remove nonAware twin, RPC paths, untrack results artifac…
Oct 13, 2026
96779b6
mds-plan D2.2: testMultiDataSet.qml to list-level selection (C10)
Oct 15, 2026
e5a0fe9
mds-plan D3.3: metaDump audits the post-flip provenance contract; ver…
Oct 16, 2026
dcefb96
mds-plan D6.1/D6.2: the component zoo - testMultiDataSetControls exer…
Oct 17, 2026
6e88773
mds-plan D6.3/D6.4: verifier zoo runs - per-control distinct encoding…
Oct 17, 2026
8c516fa
mds-plan D8.3/D8.5: aware wrappers regenerated with the per-slice sel…
Oct 18, 2026
760c9cd
mds-plan D9.1: TODO-multidataset.md marked SUPERSEDED - it is the pre…
Oct 18, 2026
425b273
mds-plan post: lockfile regenerated for R 4.6.1 env (cloud.r-project.…
Oct 18, 2026
58b1393
mds-zoo: expand the zoo analysis (Zoo H-L) and make it results-rich
Oct 19, 2026
c03528a
mds-zoo: verifier expansion, 84 -> 177 checks, results-side assertions
Oct 19, 2026
8223eed
mds-zoo: the FactorsForm D3.2 hostless-panel deferral is closed - ver…
Oct 19, 2026
ac2e655
mds-zoo: origin-authoritative rebuild - every assigned list over a po…
Oct 21, 2026
54ce103
redact mds-plan references from comments (zoo R/qml headers, verifier…
Oct 22, 2026
5ad2979
Replace internal card-ID cross-references with self-contained prose
Oct 22, 2026
6207bab
Fix stale tool-library pointer in buildBundle.R
Oct 22, 2026
1d265ed
buildBundle.R: real pre-flight checks + printed setup instructions
Oct 22, 2026
5a767ea
Drop the multiDataSetAware declarations: awareness is derived from th…
Oct 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
.RData
.Ruserdata
_processedLockFile.lock
ModuleBundleBuildDir/
bundles_out/
results_multidataset.json
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
exportPattern('^[[:alpha:]]+')
import('jaspBase');
import('svglite');
import('stringi');
28 changes: 28 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,34 @@
---

# jaspTestModule (development version)
## Added
* "Test Multi-DataSet": analysis + form to exercise multi-dataset aware analyses
(`multiDataSetAware` Description entries, the VariablesForm dataset/filter selection,
the `datasets` handout and encoded-name routing of jaspBase, the readDataSet() guard,
the `.meta` dataSetId/filterId provenance and the non-aware counterpart as controls).
The aware analysis is wrapped (`hasWrapper: true`): body in `multiDataSetFuncInternal`,
generated `multiDataSetFunc(datasets = ...)` wrapper for R syntax use.
* `Tools/buildBundle.R`: builds an installable `bundles_out/jaspTestModule.JASPModule`
from this checkout with the local `jasp-desktop/Engine/jaspBase` (or any checkout via
`JASP_BASE_DIR`) packed into the bundle; no JASP cellar needed.
* `Tools/testMultiDataSet.R` (+ `_wrapper.R`): full headless test of the analysis over
engine-style queued slices, the wrapper in a clean session and a legacy non-aware run.
* `Tools/testdata/DataSetA.csv` / `DataSetB.csv`: two datasets with deliberately colliding
column names for the per-dataset routing test.

## Changed
* `renv.lock` re-resolved for R 4.6.1 (current CRAN, jaspBase/jaspGraphs from GitHub HEAD).
* `hasWrappers: true` for the module: every analysis body now lives in `<func>Internal`
and has a generated `R/<func>Wrapper.R` (via jaspSyntax/SyntaxInterface) exposing the
plain `<func>(data = ..., ...)` entry point for R syntax use - 38 of 43; the four
entries pointing at removed qml files (test.qml, TestPlotStatus.qml) can't generate
one, and filteredDataEntry crashes the syntax bridge headlessly (Filter without
DataSet assertion in CommonData/filter.cpp - a real bridge bug to fix).
* The non-aware twin (`multiDataSetNonAware` func/qml/wrapper) is removed again (mds-plan
C4/M8): its generated wrapper carried a stale qml pointer so its R entry point always
errored, and every other analysis in this module already is a plain single-dataset one.
Legacy path 3 of Tools/testMultiDataSet.R now runs through `testEncodingFunc` (whose R body
really calls `.readDataSetToEnd`).



Expand Down
103 changes: 103 additions & 0 deletions R/AnalysisUpgradeAWrapper.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#
# Copyright (C) 2013-2025 University of Amsterdam
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

# This is a generated file. Don't change it!

#' Analysis A
#'
#' @param stemAndLeaf, Create a Stem and leaf table.
#' Defaults to \code{FALSE}.
#' @param stemAndLeafScale, The scale parameter controls how much the table is expanded. For example, scale = 2 will cause the table to be roughly twice as long as the default (scale = 1).
AnalysisUpgradeA <- function(
data = NULL,
version = "1",
addSmooth = TRUE,
addSmoothCI = TRUE,
addSmoothCIValue = 0.95,
binWidthType = "sturges",
chartType = "_2barCharts",
chartValues = "_2percentages",
colorPalette = "colorblind",
descriptivesIntervalPlot = FALSE,
descriptivesPiechart = FALSE,
descriptivesQQPlot = FALSE,
distPlotDensity = FALSE,
distPlotRug = FALSE,
frequencyTables = FALSE,
frequencyTablesMaximumAmount = 10,
graphTypeAbove = "density",
graphTypeRight = "density",
iqr = FALSE,
kurtosis = FALSE,
mad = FALSE,
madrobust = FALSE,
maximum = TRUE,
mean = TRUE,
median = FALSE,
minimum = TRUE,
mode = FALSE,
numberOfBins = 30,
percentileValuesEqualGroups = FALSE,
percentileValuesEqualGroupsNo = 4,
percentileValuesPercentiles = FALSE,
percentileValuesQuartiles = FALSE,
plotCorrelationMatrix = FALSE,
plotHeight = 320,
plotVariables = FALSE,
plotWidth = 480,
range = FALSE,
regressionType = "smooth",
scatterPlot = FALSE,
shapiro = FALSE,
showLegend = TRUE,
skewness = FALSE,
splitPlotBoxplot = TRUE,
splitPlotColour = FALSE,
splitPlotJitter = FALSE,
splitPlotOutlierLabel = FALSE,
splitPlotViolin = FALSE,
splitPlots = FALSE,
splitby = list(types = list(), value = ""),
standardDeviation = TRUE,
standardErrorMean = FALSE,
statisticsValuesAreGroupMidpoints = FALSE,
stemAndLeaf = FALSE,
stemAndLeafScale = 1,
sum = FALSE,
variables = list(types = list(), value = list()),
variance = FALSE) {

defaultArgCalls <- formals(jaspTestModule::AnalysisUpgradeA)
defaultArgs <- lapply(defaultArgCalls, eval)
options <- as.list(match.call())[-1L]
options <- lapply(options, eval)
defaults <- setdiff(names(defaultArgs), names(options))
options[defaults] <- defaultArgs[defaults]
options[["data"]] <- NULL
options[["version"]] <- NULL


if (!jaspBase::jaspResultsCalledFromJasp() && !is.null(data)) {
jaspBase::storeDataSet(data)
}

optionsWithFormula <- c("binWidthType", "colorPalette", "splitby", "variables")
for (name in optionsWithFormula) {
if ((name %in% optionsWithFormula) && inherits(options[[name]], "formula")) options[[name]] = jaspBase::jaspFormula(options[[name]], data) }

return(jaspBase::runWrappedAnalysis("jaspTestModule", "AnalysisUpgradeA", "AnalysisUpgrade.qml", options, version, FALSE))
}
103 changes: 103 additions & 0 deletions R/AnalysisUpgradeBWrapper.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#
# Copyright (C) 2013-2025 University of Amsterdam
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

# This is a generated file. Don't change it!

#' Analysis B
#'
#' @param stemAndLeaf, Create a Stem and leaf table.
#' Defaults to \code{FALSE}.
#' @param stemAndLeafScale, The scale parameter controls how much the table is expanded. For example, scale = 2 will cause the table to be roughly twice as long as the default (scale = 1).
AnalysisUpgradeB <- function(
data = NULL,
version = "1",
addSmooth = TRUE,
addSmoothCI = TRUE,
addSmoothCIValue = 0.95,
binWidthType = "sturges",
chartType = "_1noCharts",
chartValues = "_1frequencies",
colorPalette = "colorblind",
descriptivesIntervalPlot = FALSE,
descriptivesPiechart = FALSE,
descriptivesQQPlot = FALSE,
distPlotDensity = FALSE,
distPlotRug = FALSE,
frequencyTables = FALSE,
frequencyTablesMaximumAmount = 10,
graphTypeAbove = "density",
graphTypeRight = "density",
iqr = FALSE,
kurtosis = FALSE,
mad = FALSE,
madrobust = FALSE,
maximum = TRUE,
mean = TRUE,
median = FALSE,
minimum = TRUE,
mode = FALSE,
numberOfBins = 30,
percentileValuesEqualGroups = FALSE,
percentileValuesEqualGroupsNo = 4,
percentileValuesPercentiles = FALSE,
percentileValuesQuartiles = FALSE,
plotCorrelationMatrix = FALSE,
plotHeight = 320,
plotVariables = FALSE,
plotWidth = 480,
range = FALSE,
regressionType = "smooth",
scatterPlot = FALSE,
shapiro = FALSE,
showLegend = TRUE,
skewness = FALSE,
splitPlotBoxplot = TRUE,
splitPlotColour = FALSE,
splitPlotJitter = FALSE,
splitPlotOutlierLabel = FALSE,
splitPlotViolin = FALSE,
splitPlots = FALSE,
splitby = list(types = list(), value = ""),
standardDeviation = TRUE,
standardErrorMean = FALSE,
statisticsValuesAreGroupMidpoints = FALSE,
stemAndLeaf = FALSE,
stemAndLeafScale = 1,
sum = FALSE,
variables = list(types = list(), value = list()),
variance = FALSE) {

defaultArgCalls <- formals(jaspTestModule::AnalysisUpgradeB)
defaultArgs <- lapply(defaultArgCalls, eval)
options <- as.list(match.call())[-1L]
options <- lapply(options, eval)
defaults <- setdiff(names(defaultArgs), names(options))
options[defaults] <- defaultArgs[defaults]
options[["data"]] <- NULL
options[["version"]] <- NULL


if (!jaspBase::jaspResultsCalledFromJasp() && !is.null(data)) {
jaspBase::storeDataSet(data)
}

optionsWithFormula <- c("binWidthType", "colorPalette", "splitby", "variables")
for (name in optionsWithFormula) {
if ((name %in% optionsWithFormula) && inherits(options[[name]], "formula")) options[[name]] = jaspBase::jaspFormula(options[[name]], data) }

return(jaspBase::runWrappedAnalysis("jaspTestModule", "AnalysisUpgradeB", "AnalysisUpgrade.qml", options, version, FALSE))
}
103 changes: 103 additions & 0 deletions R/AnalysisUpgradeIncompatibleAWrapper.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#
# Copyright (C) 2013-2025 University of Amsterdam
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

# This is a generated file. Don't change it!

#' Analysis A with incompatible to B
#'
#' @param stemAndLeaf, Create a Stem and leaf table.
#' Defaults to \code{FALSE}.
#' @param stemAndLeafScale, The scale parameter controls how much the table is expanded. For example, scale = 2 will cause the table to be roughly twice as long as the default (scale = 1).
AnalysisUpgradeIncompatibleA <- function(
data = NULL,
version = "1",
addSmooth = TRUE,
addSmoothCI = TRUE,
addSmoothCIValue = 0.95,
binWidthType = "sturges",
chartType = "_4histograms",
chartValues = "_2percentages",
colorPalette = "colorblind",
descriptivesIntervalPlot = FALSE,
descriptivesPiechart = FALSE,
descriptivesQQPlot = FALSE,
distPlotDensity = FALSE,
distPlotRug = FALSE,
frequencyTables = FALSE,
frequencyTablesMaximumAmount = 10,
graphTypeAbove = "density",
graphTypeRight = "density",
iqr = FALSE,
kurtosis = FALSE,
mad = FALSE,
madrobust = FALSE,
maximum = TRUE,
mean = TRUE,
median = FALSE,
minimum = TRUE,
mode = FALSE,
numberOfBins = 30,
percentileValuesEqualGroups = FALSE,
percentileValuesEqualGroupsNo = 4,
percentileValuesPercentiles = FALSE,
percentileValuesQuartiles = FALSE,
plotCorrelationMatrix = FALSE,
plotHeight = 320,
plotVariables = FALSE,
plotWidth = 480,
range = FALSE,
regressionType = "smooth",
scatterPlot = FALSE,
shapiro = FALSE,
showLegend = TRUE,
skewness = FALSE,
splitPlotBoxplot = TRUE,
splitPlotColour = FALSE,
splitPlotJitter = FALSE,
splitPlotOutlierLabel = FALSE,
splitPlotViolin = FALSE,
splitPlots = FALSE,
splitby = list(types = list(), value = ""),
standardDeviation = TRUE,
standardErrorMean = FALSE,
statisticsValuesAreGroupMidpoints = FALSE,
stemAndLeaf = FALSE,
stemAndLeafScale = 1,
sum = FALSE,
variables = list(types = list(), value = list()),
variance = FALSE) {

defaultArgCalls <- formals(jaspTestModule::AnalysisUpgradeIncompatibleA)
defaultArgs <- lapply(defaultArgCalls, eval)
options <- as.list(match.call())[-1L]
options <- lapply(options, eval)
defaults <- setdiff(names(defaultArgs), names(options))
options[defaults] <- defaultArgs[defaults]
options[["data"]] <- NULL
options[["version"]] <- NULL


if (!jaspBase::jaspResultsCalledFromJasp() && !is.null(data)) {
jaspBase::storeDataSet(data)
}

optionsWithFormula <- c("binWidthType", "colorPalette", "splitby", "variables")
for (name in optionsWithFormula) {
if ((name %in% optionsWithFormula) && inherits(options[[name]], "formula")) options[[name]] = jaspBase::jaspFormula(options[[name]], data) }

return(jaspBase::runWrappedAnalysis("jaspTestModule", "AnalysisUpgradeIncompatibleA", "AnalysisUpgrade.qml", options, version, FALSE))
}
Loading
Loading