diff --git a/kb/kb_test.go b/kb/kb_test.go index a5b612c..501666f 100644 --- a/kb/kb_test.go +++ b/kb/kb_test.go @@ -203,6 +203,43 @@ func TestRailsHasTaxonomy(t *testing.T) { } } +func TestResearchToolTaxonomy(t *testing.T) { + base := loadKB(t) + want := map[string][]string{ + "Jupyter": {"role:application", "function:interactive-computing", "function:literate-programming", "technology:jupyter"}, + "Quarto": {"function:documentation", "function:literate-programming", "function:report-generation", "function:site-generation", "technology:quarto"}, + "Nextflow": {"role:orchestrator", "function:workflow-orchestration", "domain:research", "domain:scientific-computing", "technology:nextflow"}, + "Snakemake": {"role:orchestrator", "function:workflow-orchestration", "domain:research", "domain:scientific-computing", "technology:snakemake"}, + "nf-core": {"role:build-tool", "function:automation", "domain:bioinformatics", "domain:scientific-computing", "audience:researcher", "technology:nextflow"}, + "nf-test": {"role:testing-framework", "function:testing", "domain:scientific-computing", "audience:researcher", "technology:nextflow"}, + "MultiQC": {"role:cli-tool", "function:report-generation", "function:visualization", "domain:bioinformatics", "domain:scientific-computing", "audience:researcher"}, + "Dockstore": {"role:registry", "layer:infrastructure", "domain:scientific-computing", "audience:researcher"}, + "DVC": {"role:cli-tool", "function:data-provenance", "function:data-version-control", "domain:data-science", "audience:data-scientist", "audience:researcher"}, + "BenchmarkTools.jl": {"role:testing-framework", "function:benchmarking", "domain:scientific-computing", "audience:researcher", "technology:julia"}, + "Documenter.jl": {"function:documentation", "function:site-generation", "technology:julia"}, + "JuliaFormatter": {"role:formatter", "technology:julia"}, + "Runic": {"role:formatter", "technology:julia"}, + "Fortitude": {"role:linter", "technology:fortran"}, + "targets": {"role:build-tool", "role:orchestrator", "function:workflow-orchestration", "domain:data-science", "domain:research", "domain:scientific-computing", "audience:data-scientist", "audience:researcher"}, + "R Markdown": {"function:documentation", "function:literate-programming", "function:report-generation"}, + "knitr": {"function:documentation", "function:literate-programming", "function:report-generation"}, + } + for name, tags := range want { + tool := base.ByName[name] + if tool == nil { + t.Errorf("%s not found in KB", name) + continue + } + got := slices.Clone(tool.Taxonomy.Tags()) + wantTags := slices.Clone(tags) + sort.Strings(got) + sort.Strings(wantTags) + if !slices.Equal(got, wantTags) { + t.Errorf("%s taxonomy = %v, want %v", name, got, wantTags) + } + } +} + func TestPriorityNicheLanguagesHaveSinks(t *testing.T) { base := loadKB(t) for _, name := range []string{ diff --git a/kb/testdata/oss-taxonomy-terms.txt b/kb/testdata/oss-taxonomy-terms.txt index cd49167..0eaf7f0 100644 --- a/kb/testdata/oss-taxonomy-terms.txt +++ b/kb/testdata/oss-taxonomy-terms.txt @@ -12,6 +12,7 @@ audience:security-professional audience:student audience:sysadmin audience:writer +domain:bioinformatics domain:blockchain domain:cloud-computing domain:content-management @@ -25,11 +26,13 @@ domain:finance domain:game-development domain:geospatial domain:healthcare +domain:high-performance-computing domain:machine-learning domain:mobile-development domain:multimedia domain:natural-language-processing domain:networking +domain:research domain:robotics domain:scientific-computing domain:security @@ -49,7 +52,10 @@ function:configuration function:connection-pooling function:containerization function:coverage +function:data-analysis function:data-mapping +function:data-provenance +function:data-version-control function:database-management function:database-migrations function:dependency-injection @@ -65,8 +71,10 @@ function:graph-database function:gui-toolkit function:http-client function:image-processing +function:interactive-computing function:internationalization function:language-server +function:literate-programming function:logging function:messaging function:mocking @@ -78,6 +86,7 @@ function:parsing function:payments function:process-execution function:release-management +function:report-generation function:routing function:rpc function:runtime-management @@ -99,9 +108,11 @@ function:text-processing function:tui function:type-checking function:validation +function:version-control function:visualization function:webhooks function:websocket +function:workflow-orchestration layer:application-layer layer:backend layer:data-layer @@ -131,6 +142,7 @@ role:native-extension role:orchestrator role:package-manager role:plugin +role:registry role:runtime role:sdk role:server @@ -156,6 +168,7 @@ technology:express technology:fastapi technology:flask technology:flutter +technology:fortran technology:git technology:github-actions technology:go @@ -166,12 +179,15 @@ technology:java technology:javascript technology:jenkins technology:jquery +technology:julia +technology:jupyter technology:kotlin technology:kubernetes technology:laravel technology:linux technology:mongodb technology:mysql +technology:nextflow technology:nextjs technology:nginx technology:nix @@ -180,6 +196,7 @@ technology:objective-c technology:php technology:postgresql technology:python +technology:quarto technology:r technology:rails technology:react @@ -188,6 +205,7 @@ technology:ruby technology:rust technology:sass technology:scala +technology:snakemake technology:spring-boot technology:sqlite technology:svelte diff --git a/knowledge/_shared/dockstore.toml b/knowledge/_shared/dockstore.toml index ce82fa1..4af35f4 100644 --- a/knowledge/_shared/dockstore.toml +++ b/knowledge/_shared/dockstore.toml @@ -13,8 +13,7 @@ files = [".dockstore.yml", ".dockstore.yaml", ".github/.dockstore.yml", ".github files = [".dockstore.yml", ".dockstore.yaml", ".github/.dockstore.yml", ".github/.dockstore.yaml"] [taxonomy] -role = ["cli-tool"] +role = ["registry"] layer = ["infrastructure"] -function = ["deployment"] domain = ["scientific-computing"] audience = ["researcher"] diff --git a/knowledge/_shared/dvc.toml b/knowledge/_shared/dvc.toml index 3fd78c5..22b1c7f 100644 --- a/knowledge/_shared/dvc.toml +++ b/knowledge/_shared/dvc.toml @@ -20,6 +20,6 @@ lockfile = "dvc.lock" [taxonomy] role = ["cli-tool"] -function = ["file-management"] +function = ["data-provenance", "data-version-control"] domain = ["data-science"] audience = ["data-scientist", "researcher"] diff --git a/knowledge/_shared/jupyter.toml b/knowledge/_shared/jupyter.toml index 7021742..eab1a4d 100644 --- a/knowledge/_shared/jupyter.toml +++ b/knowledge/_shared/jupyter.toml @@ -20,3 +20,5 @@ files = ["jupyter_server_config.py", "jupyter_notebook_config.py", "jupyter_lab_ [taxonomy] role = ["application"] +function = ["interactive-computing", "literate-programming"] +technology = ["jupyter"] diff --git a/knowledge/_shared/multiqc.toml b/knowledge/_shared/multiqc.toml index 75e631b..4ab610b 100644 --- a/knowledge/_shared/multiqc.toml +++ b/knowledge/_shared/multiqc.toml @@ -18,6 +18,6 @@ files = ["multiqc_config.yml", "multiqc_config.yaml", ".multiqc_config.yml", ".m [taxonomy] role = ["cli-tool"] -function = ["visualization"] -domain = ["scientific-computing"] +function = ["report-generation", "visualization"] +domain = ["bioinformatics", "scientific-computing"] audience = ["researcher"] diff --git a/knowledge/_shared/nextflow.toml b/knowledge/_shared/nextflow.toml index d9585ca..3e77442 100644 --- a/knowledge/_shared/nextflow.toml +++ b/knowledge/_shared/nextflow.toml @@ -17,5 +17,6 @@ files = ["nextflow.config"] [taxonomy] role = ["orchestrator"] -function = ["automation"] -domain = ["scientific-computing"] +function = ["workflow-orchestration"] +domain = ["research", "scientific-computing"] +technology = ["nextflow"] diff --git a/knowledge/_shared/nf-core.toml b/knowledge/_shared/nf-core.toml index cbbccfb..6272807 100644 --- a/knowledge/_shared/nf-core.toml +++ b/knowledge/_shared/nf-core.toml @@ -20,5 +20,6 @@ files = [".nf-core.yml", ".nf-core.yaml"] [taxonomy] role = ["build-tool"] function = ["automation"] -domain = ["scientific-computing"] +domain = ["bioinformatics", "scientific-computing"] audience = ["researcher"] +technology = ["nextflow"] diff --git a/knowledge/_shared/nf-test.toml b/knowledge/_shared/nf-test.toml index fb4bc5e..a5833ce 100644 --- a/knowledge/_shared/nf-test.toml +++ b/knowledge/_shared/nf-test.toml @@ -21,3 +21,4 @@ role = ["testing-framework"] function = ["testing"] domain = ["scientific-computing"] audience = ["researcher"] +technology = ["nextflow"] diff --git a/knowledge/_shared/quarto.toml b/knowledge/_shared/quarto.toml index 4005268..01704e6 100644 --- a/knowledge/_shared/quarto.toml +++ b/knowledge/_shared/quarto.toml @@ -19,4 +19,5 @@ alternatives = ["quarto preview"] files = ["_quarto.yml", "_quarto.yaml"] [taxonomy] -function = ["documentation", "site-generation"] +function = ["documentation", "literate-programming", "report-generation", "site-generation"] +technology = ["quarto"] diff --git a/knowledge/_shared/snakemake.toml b/knowledge/_shared/snakemake.toml index d91675e..918a70b 100644 --- a/knowledge/_shared/snakemake.toml +++ b/knowledge/_shared/snakemake.toml @@ -19,5 +19,6 @@ files = ["Snakefile", "**/Snakefile", "*.smk", "**/*.smk"] [taxonomy] role = ["orchestrator"] -function = ["automation"] -domain = ["scientific-computing"] +function = ["workflow-orchestration"] +domain = ["research", "scientific-computing"] +technology = ["snakemake"] diff --git a/knowledge/fortran/fortitude.toml b/knowledge/fortran/fortitude.toml index 5ae2e32..7b6dd36 100644 --- a/knowledge/fortran/fortitude.toml +++ b/knowledge/fortran/fortitude.toml @@ -24,3 +24,4 @@ files = ["fortitude.toml", ".fortitude.toml", "fpm.toml", "pyproject.toml"] [taxonomy] role = ["linter"] +technology = ["fortran"] diff --git a/knowledge/julia/benchmarktools.toml b/knowledge/julia/benchmarktools.toml index 6d955f0..1711dd6 100644 --- a/knowledge/julia/benchmarktools.toml +++ b/knowledge/julia/benchmarktools.toml @@ -19,3 +19,4 @@ role = ["testing-framework"] function = ["benchmarking"] domain = ["scientific-computing"] audience = ["researcher"] +technology = ["julia"] diff --git a/knowledge/julia/documenter.toml b/knowledge/julia/documenter.toml index 699e6ca..66e4fb9 100644 --- a/knowledge/julia/documenter.toml +++ b/knowledge/julia/documenter.toml @@ -22,3 +22,4 @@ files = ["docs/Project.toml", "docs/make.jl"] [taxonomy] function = ["documentation", "site-generation"] +technology = ["julia"] diff --git a/knowledge/julia/juliaformatter.toml b/knowledge/julia/juliaformatter.toml index e61d137..f2666b9 100644 --- a/knowledge/julia/juliaformatter.toml +++ b/knowledge/julia/juliaformatter.toml @@ -20,3 +20,4 @@ files = [".JuliaFormatter.toml"] [taxonomy] role = ["formatter"] +technology = ["julia"] diff --git a/knowledge/julia/runic.toml b/knowledge/julia/runic.toml index 016416a..5d445e9 100644 --- a/knowledge/julia/runic.toml +++ b/knowledge/julia/runic.toml @@ -13,3 +13,4 @@ ecosystems = ["julia"] [taxonomy] role = ["formatter"] +technology = ["julia"] diff --git a/knowledge/r/knitr.toml b/knowledge/r/knitr.toml index 85d4056..b19fe73 100644 --- a/knowledge/r/knitr.toml +++ b/knowledge/r/knitr.toml @@ -14,4 +14,4 @@ ecosystems = ["r"] "DESCRIPTION" = ["VignetteBuilder: knitr"] [taxonomy] -function = ["documentation"] +function = ["documentation", "literate-programming", "report-generation"] diff --git a/knowledge/r/rmarkdown.toml b/knowledge/r/rmarkdown.toml index 183b988..531df75 100644 --- a/knowledge/r/rmarkdown.toml +++ b/knowledge/r/rmarkdown.toml @@ -13,4 +13,4 @@ dev_dependencies = ["rmarkdown"] ecosystems = ["r"] [taxonomy] -function = ["documentation"] +function = ["documentation", "literate-programming", "report-generation"] diff --git a/knowledge/r/targets.toml b/knowledge/r/targets.toml index 32c11df..ca7bd4d 100644 --- a/knowledge/r/targets.toml +++ b/knowledge/r/targets.toml @@ -21,6 +21,6 @@ files = ["_targets.R"] [taxonomy] role = ["build-tool", "orchestrator"] -function = ["automation"] -domain = ["data-science", "scientific-computing"] +function = ["workflow-orchestration"] +domain = ["data-science", "research", "scientific-computing"] audience = ["data-scientist", "researcher"]