From 8b8360cfa60e62d1b5aa78f41607acfed87a7e7f Mon Sep 17 00:00:00 2001 From: Nico Matentzoglu Date: Sat, 10 Aug 2024 09:45:22 +0300 Subject: [PATCH] Refresh ODK (includes 1.5.2 migration) --- .github/workflows/qc.yml | 6 +- docs/odk-workflows/ManageDocumentation.md | 1 + docs/odk-workflows/RepoManagement.md | 2 +- src/ontology/Makefile | 164 +++++++++++++++------- src/ontology/run.sh | 38 ++++- src/scripts/run-command.sh | 4 + src/scripts/update_repo.sh | 5 +- src/sparql/class-count-by-prefix.sparql | 2 +- 8 files changed, 163 insertions(+), 59 deletions(-) create mode 100755 src/scripts/run-command.sh diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml index 21966a7c..ec0efec4 100644 --- a/.github/workflows/qc.yml +++ b/.github/workflows/qc.yml @@ -19,15 +19,15 @@ jobs: ontology_qc: # The type of runner that the job will run on runs-on: ubuntu-latest - container: obolibrary/odkfull:v1.3.0 + container: obolibrary/odkfull:v1.5.2 # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Run ontology QC checks env: DEFAULT_BRANCH: master - run: cd src/ontology && make ROBOT_ENV='ROBOT_JAVA_ARGS=-Xmx6G' test IMP=false PAT=false + run: cd src/ontology && make ROBOT_ENV='ROBOT_JAVA_ARGS=-Xmx6G' test IMP=false PAT=false MIR=false diff --git a/docs/odk-workflows/ManageDocumentation.md b/docs/odk-workflows/ManageDocumentation.md index 7840c1f7..17f986a1 100644 --- a/docs/odk-workflows/ManageDocumentation.md +++ b/docs/odk-workflows/ManageDocumentation.md @@ -44,3 +44,4 @@ The documentation is _not_ automatically updated from the Markdown, and needs to Just make sure you give GitHub 2-5 minutes to build the pages! + diff --git a/docs/odk-workflows/RepoManagement.md b/docs/odk-workflows/RepoManagement.md index 2934798a..4e4082b7 100644 --- a/docs/odk-workflows/RepoManagement.md +++ b/docs/odk-workflows/RepoManagement.md @@ -2,7 +2,7 @@ ## Updating your ODK repository -Your ODK repositories configuration is managed in `src/ontology/pato-odk.yaml`. Once you have made your changes, you can run the following to apply your changes to the repository: +Your ODK repositories configuration is managed in `src/ontology/pato-odk.yaml`. The [ODK Project Configuration Schema](https://github.com/INCATools/ontology-development-kit/blob/master/docs/project-schema.md) defines all possible parameters that can be used in this config YAML. Once you have made your changes, you can run the following to apply your changes to the repository: ``` diff --git a/src/ontology/Makefile b/src/ontology/Makefile index a898f8a2..47e44918 100644 --- a/src/ontology/Makefile +++ b/src/ontology/Makefile @@ -1,7 +1,7 @@ # ---------------------------------------- # Makefile for pato # Generated using ontology-development-kit -# ODK Version: v1.4 +# ODK Version: v1.5.2 # ---------------------------------------- # IMPORTANT: DO NOT EDIT THIS FILE. To override default make goals, use pato.Makefile instead @@ -9,6 +9,9 @@ # ---------------------------------------- # More information: https://github.com/INCATools/ontology-development-kit/ +# Fingerprint of the configuration file when this Makefile was last generated +CONFIG_HASH= 8c38f556f1076ce2a46088cd083451de27b8553932affe92d72c22f02b6e92e4 + # ---------------------------------------- # Standard Constants @@ -44,7 +47,7 @@ REPORT_PROFILE_OPTS = --profile $(ROBOT_PROFILE) OBO_FORMAT_OPTIONS = SPARQL_VALIDATION_CHECKS = equivalent-classes owldef-self-reference properties-as-annotation-and-object missing-label illegal-annotation-property orcid-contributor iri-range SPARQL_EXPORTS = basic-report -ODK_VERSION_MAKEFILE = v1.4 +ODK_VERSION_MAKEFILE = v1.5.2 TODAY ?= $(shell date +%Y-%m-%d) OBODATE ?= $(shell date +'%d:%m:%Y %H:%M') @@ -59,6 +62,11 @@ FORMATS = $(sort owl obo json owl) FORMATS_INCL_TSV = $(sort $(FORMATS) tsv) RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-simple $(ONT)-full ) +ifeq ($(ODK_DEBUG),yes) +ODK_DEBUG_FILE = debug.log +SHELL = $(SCRIPTSDIR)/run-command.sh +endif + # ---------------------------------------- # Top-level targets # ---------------------------------------- @@ -69,12 +77,16 @@ RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-simple $(ONT)-full ) all: all_odk .PHONY: all_odk -all_odk: odkversion test all_assets +all_odk: odkversion config_check test custom_reports all_assets .PHONY: test test: odkversion reason_test sparql_test robot_reports $(REPORTDIR)/validate_profile_owl2dl_$(ONT).owl.txt echo "Finished running all tests successfully." +.PHONY: test +test_fast: + $(MAKE_FAST) test + .PHONY: release_diff release_diff: $(REPORTDIR)/release-diff.md @@ -85,13 +97,52 @@ reason_test: $(EDIT_PREPROCESSED) .PHONY: odkversion odkversion: - echo "ODK Makefile version: $(ODK_VERSION_MAKEFILE) (this is the version of the ODK with which this Makefile was generated, \ - not the version of the ODK you are running)" &&\ - echo "ROBOT version (ODK): " && $(ROBOT) --version + @echo "ODK Makefile $(ODK_VERSION_MAKEFILE)" + @odk-info --tools +.PHONY: config_check +config_check: + @if [ "$$(sha256sum $(ONT)-odk.yaml | cut -c1-64)" = "$(CONFIG_HASH)" ]; then \ + echo "Repository is up-to-date." ; else \ + echo "Your ODK configuration has changed since this Makefile was generated. You may need to run 'make update_repo'." ; fi + $(TMPDIR) $(REPORTDIR) $(MIRRORDIR) $(IMPORTDIR) $(COMPONENTSDIR) $(SUBSETDIR): mkdir -p $@ +# ---------------------------------------- +# ODK-managed ROBOT plugins +# ---------------------------------------- + +# Make sure ROBOT knows where to find plugins +export ROBOT_PLUGINS_DIRECTORY=$(TMPDIR)/plugins + +# Override this rule in pato.Makefile to install custom plugins +.PHONY: custom_robot_plugins +custom_robot_plugins: + + +.PHONY: extra_robot_plugins +extra_robot_plugins: + + +# Install all ROBOT plugins to the runtime plugins directory +.PHONY: all_robot_plugins +all_robot_plugins: $(foreach plugin,$(notdir $(wildcard /tools/robot-plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \ + $(foreach plugin,$(notdir $(wildcard ../../plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \ + custom_robot_plugins extra_robot_plugins \ + +# Default rule to install plugins +$(ROBOT_PLUGINS_DIRECTORY)/%.jar: + @mkdir -p $(ROBOT_PLUGINS_DIRECTORY) + @if [ -f ../../plugins/$*.jar ]; then \ + ln ../../plugins/$*.jar $@ ; \ + elif [ -f /tools/robot-plugins/$*.jar ]; then \ + cp /tools/robot-plugins/$*.jar $@ ; \ + fi + +# Specific rules for supplementary plugins defined in configuration + + # ---------------------------------------- # Release assets # ---------------------------------------- @@ -137,7 +188,7 @@ all_subsets: $(SUBSET_FILES) # ---------------------------------------- -MAPPINGS = +MAPPINGS = pato-to-qudt-quantitykind MAPPING_FILES = $(patsubst %, $(MAPPINGDIR)/%.sssom.tsv, $(MAPPINGS)) @@ -181,12 +232,12 @@ validate_profile_%: $(REPORTDIR)/validate_profile_owl2dl_%.txt SPARQL_VALIDATION_QUERIES = $(foreach V,$(SPARQL_VALIDATION_CHECKS),$(SPARQLDIR)/$(V)-violation.sparql) -sparql_test: $(EDIT_PREPROCESSED) pato-base.owl catalog-v001.xml | $(REPORTDIR) +sparql_test: $(EDIT_PREPROCESSED) pato-base.owl | $(REPORTDIR) ifneq ($(SPARQL_VALIDATION_QUERIES),) - $(ROBOT) verify --catalog catalog-v001.xml -i $(EDIT_PREPROCESSED) --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR) + $(ROBOT) verify -i $(EDIT_PREPROCESSED) --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR) - $(ROBOT) verify --catalog catalog-v001.xml -i pato-base.owl --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR) + $(ROBOT) verify -i pato-base.owl --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR) endif # ---------------------------------------- @@ -199,6 +250,14 @@ $(REPORTDIR)/$(SRC)-obo-report.tsv: $(SRCMERGED) | $(REPORTDIR) $(REPORTDIR)/%-obo-report.tsv: % | $(REPORTDIR) $(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --base-iri http://purl.obolibrary.org/obo/PATO_ --base-iri http://purl.obolibrary.org/obo/pato# --print 5 -o $@ +check_for_robot_updates: + @cut -f2 "/tools/robot_report_profile.txt" | sort > $(TMPDIR)/sorted_tsv2.txt + @cut -f2 "$(ROBOT_PROFILE)" | sort > $(TMPDIR)/sorted_tsv1.txt + @comm -23 $(TMPDIR)/sorted_tsv2.txt $(TMPDIR)/sorted_tsv1.txt > $(TMPDIR)/missing.txt + @echo "Missing tests:" + @cat $(TMPDIR)/missing.txt + @rm $(TMPDIR)/sorted_tsv1.txt $(TMPDIR)/sorted_tsv2.txt $(TMPDIR)/missing.txt $(TMPDIR)/report_profile_robot.txt + # ---------------------------------------- # Release assets # ---------------------------------------- @@ -215,7 +274,7 @@ RELEASE_ASSETS = \ $(SUBSET_FILES) .PHONY: all_assets -all_assets: $(ASSETS) +all_assets: $(ASSETS) check_rdfxml_assets .PHONY: show_assets show_assets: @@ -223,7 +282,7 @@ show_assets: du -sh $(ASSETS) check_rdfxml_%: % - @check-rdfxml $< + @check-rdfxml $< .PHONY: check_rdfxml_assets check_rdfxml_assets: $(foreach product,$(MAIN_PRODUCTS),check_rdfxml_$(product).owl) @@ -318,6 +377,7 @@ $(IMPORTDIR)/merged_import.owl: $(MIRRORDIR)/merged.owl $(IMPORTDIR)/merged_term if [ $(IMP) = true ]; then $(ROBOT) merge -i $< \ remove --select "" remove --select "" remove --select "" remove --select "" remove --select "" \ extract -T $(IMPORTDIR)/merged_terms_combined.txt --force true --copy-ontology-annotations true --individuals exclude --method BOT \ + remove $(patsubst %, --term %, $(ANNOTATION_PROPERTIES)) -T $(IMPORTDIR)/merged_terms_combined.txt --select complement --select annotation-properties \ query --update ../sparql/inject-subset-declaration.ru --update ../sparql/inject-synonymtype-declaration.ru --update ../sparql/postprocess-module.ru \ $(ANNOTATE_CONVERT_FILE); fi @@ -380,9 +440,9 @@ recreate-%: no-mirror-recreate-%: $(MAKE) COMP=true IMP=false IMP_LARGE=false MIR=false PAT=true $(COMPONENTSDIR)/$*.owl -B -$(COMPONENTSDIR)/%: | $(COMPONENTSDIR) - touch $@ -.PRECIOUS: $(COMPONENTSDIR)/% +$(COMPONENTSDIR)/%.owl: | $(COMPONENTSDIR) + test -f $@ || touch $@ +.PRECIOUS: $(COMPONENTSDIR)/%.owl # ---------------------------------------- @@ -393,87 +453,87 @@ IMP=true # Global parameter to bypass import generation MIR=true # Global parameter to bypass mirror generation IMP_LARGE=true # Global parameter to bypass handling of large imports +ifeq ($(strip $(MIR)),true) ## ONTOLOGY: ro .PHONY: mirror-ro .PRECIOUS: $(MIRRORDIR)/ro.owl mirror-ro: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/ro/ro-base.owl --create-dirs -o $(MIRRORDIR)/ro.owl --retry 4 --max-time 400 &&\ - $(ROBOT) convert -i $(MIRRORDIR)/ro.owl -o $@.tmp.owl && mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + curl -L $(OBOBASE)/ro/ro-base.owl --create-dirs -o $(TMPDIR)/ro-download.owl --retry 4 --max-time 400 && \ + $(ROBOT) convert -i $(TMPDIR)/ro-download.owl -o $(TMPDIR)/$@.owl ## ONTOLOGY: chebi .PHONY: mirror-chebi .PRECIOUS: $(MIRRORDIR)/chebi.owl mirror-chebi: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) convert -I https://raw.githubusercontent.com/obophenotype/chebi_obo_slim/main/chebi_slim.owl -o $@.tmp.owl && \ - $(ROBOT) remove -i $@.tmp.owl --base-iri $(URIBASE)/CHEBI --axioms external --preserve-structure false --trim false -o $@.tmp.owl &&\ - mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + $(ROBOT) remove -I https://raw.githubusercontent.com/obophenotype/chebi_obo_slim/main/chebi_slim.owl --base-iri $(OBOBASE)/CHEBI --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl ## ONTOLOGY: go .PHONY: mirror-go .PRECIOUS: $(MIRRORDIR)/go.owl mirror-go: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/go/go-base.owl --create-dirs -o $(MIRRORDIR)/go.owl --retry 4 --max-time 400 &&\ - $(ROBOT) convert -i $(MIRRORDIR)/go.owl -o $@.tmp.owl && mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + curl -L $(OBOBASE)/go/go-base.owl --create-dirs -o $(TMPDIR)/go-download.owl --retry 4 --max-time 400 && \ + $(ROBOT) convert -i $(TMPDIR)/go-download.owl -o $(TMPDIR)/$@.owl ## ONTOLOGY: pco .PHONY: mirror-pco .PRECIOUS: $(MIRRORDIR)/pco.owl mirror-pco: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/pco.owl --create-dirs -o $(MIRRORDIR)/pco.owl --retry 4 --max-time 400 &&\ - $(ROBOT) convert -i $(MIRRORDIR)/pco.owl -o $@.tmp.owl && \ - $(ROBOT) remove -i $@.tmp.owl --base-iri $(URIBASE)/PCO --axioms external --preserve-structure false --trim false -o $@.tmp.owl &&\ - mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + curl -L $(OBOBASE)/pco.owl --create-dirs -o $(TMPDIR)/pco-download.owl --retry 4 --max-time 400 && \ + $(ROBOT) remove -i $(TMPDIR)/pco-download.owl --base-iri $(OBOBASE)/PCO --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl ## ONTOLOGY: uberon .PHONY: mirror-uberon .PRECIOUS: $(MIRRORDIR)/uberon.owl mirror-uberon: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/uberon/uberon-base.owl --create-dirs -o $(MIRRORDIR)/uberon.owl --retry 4 --max-time 400 &&\ - $(ROBOT) convert -i $(MIRRORDIR)/uberon.owl -o $@.tmp.owl && mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + curl -L $(OBOBASE)/uberon/uberon-base.owl --create-dirs -o $(TMPDIR)/uberon-download.owl --retry 4 --max-time 400 && \ + $(ROBOT) convert -i $(TMPDIR)/uberon-download.owl -o $(TMPDIR)/$@.owl ## ONTOLOGY: cl .PHONY: mirror-cl .PRECIOUS: $(MIRRORDIR)/cl.owl mirror-cl: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/cl/cl-base.owl --create-dirs -o $(MIRRORDIR)/cl.owl --retry 4 --max-time 400 &&\ - $(ROBOT) convert -i $(MIRRORDIR)/cl.owl -o $@.tmp.owl && mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + curl -L $(OBOBASE)/cl/cl-base.owl --create-dirs -o $(TMPDIR)/cl-download.owl --retry 4 --max-time 400 && \ + $(ROBOT) convert -i $(TMPDIR)/cl-download.owl -o $(TMPDIR)/$@.owl ## ONTOLOGY: ncbitaxon .PHONY: mirror-ncbitaxon .PRECIOUS: $(MIRRORDIR)/ncbitaxon.owl mirror-ncbitaxon: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) convert -I http://purl.obolibrary.org/obo/ncbitaxon/subsets/taxslim.owl -o $@.tmp.owl &&\ - mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + $(ROBOT) convert -I http://purl.obolibrary.org/obo/ncbitaxon/subsets/taxslim.owl -o $(TMPDIR)/$@.owl ## ONTOLOGY: pr .PHONY: mirror-pr .PRECIOUS: $(MIRRORDIR)/pr.owl mirror-pr: | $(TMPDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) convert -I https://raw.githubusercontent.com/obophenotype/pro_obo_slim/master/pr_slim.owl -o $@.tmp.owl && \ - $(ROBOT) remove -i $@.tmp.owl --base-iri $(URIBASE)/PR --axioms external --preserve-structure false --trim false -o $@.tmp.owl &&\ - mv $@.tmp.owl $(TMPDIR)/$@.owl; fi + $(ROBOT) remove -I https://raw.githubusercontent.com/obophenotype/pro_obo_slim/master/pr_slim.owl --base-iri $(OBOBASE)/PR --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl ALL_MIRRORS = $(patsubst %, $(MIRRORDIR)/%.owl, $(IMPORTS)) MERGE_MIRRORS = true +ifeq ($(strip $(MERGE_MIRRORS)),true) $(MIRRORDIR)/merged.owl: $(ALL_MIRRORS) - if [ $(IMP) = true ] && [ $(MERGE_MIRRORS) = true ]; then $(ROBOT) merge $(patsubst %, -i %, $^) -o $@; fi + $(ROBOT) merge $(patsubst %, -i %, $^) -o $@ .PRECIOUS: $(MIRRORDIR)/merged.owl +endif $(MIRRORDIR)/%.owl: mirror-% | $(MIRRORDIR) - if [ $(IMP) = true ] && [ $(MIR) = true ] && [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\ + if [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\ cp $(TMPDIR)/mirror-$*.owl $@; fi; fi +else # MIR=false +$(MIRRORDIR)/%.owl: + @echo "Not refreshing $@ because the mirrorring pipeline is disabled (MIR=$(MIR))." +endif @@ -562,9 +622,13 @@ ROBOT_RELEASE_IMPORT_MODE=$(ROBOT) merge --input $< # ROBOT pipeline that removes imports, then merges components. This is for release artefacts that start from "base" ROBOT_RELEASE_IMPORT_MODE_BASE=$(ROBOT) remove --input $< --select imports --trim false merge $(patsubst %, -i %, $(OTHER_SRC)) -# base: All the axioms as they are editted by the editors, excluding reasoning -$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) - $(ROBOT_RELEASE_IMPORT_MODE_BASE) \ +# base: A version of the ontology that does not include any externally imported axioms. +$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES) + $(ROBOT_RELEASE_IMPORT_MODE) \ + reason --reasoner ELK --equivalent-classes-allowed asserted-only --exclude-tautologies structural --annotate-inferred-axioms False \ + relax \ + reduce -r ELK \ + remove --base-iri http://purl.obolibrary.org/obo/PATO_ --base-iri http://purl.obolibrary.org/obo/pato# --axioms external --preserve-structure false --trim false \ $(SHARED_ROBOT_COMMANDS) \ annotate --link-annotation http://purl.org/dc/elements/1.1/type http://purl.obolibrary.org/obo/IAO_8000001 \ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ @@ -581,7 +645,7 @@ $(ONT)-full.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES) # remove --select imports --trim false $(ONT)-simple.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(SIMPLESEED) $(IMPORT_FILES) $(ROBOT_RELEASE_IMPORT_MODE) \ - reason --reasoner ELK --equivalent-classes-allowed asserted-only --exclude-tautologies structural \ + reason --reasoner ELK --equivalent-classes-allowed asserted-only --exclude-tautologies structural --annotate-inferred-axioms False \ relax \ remove --axioms equivalent \ relax \ @@ -648,13 +712,16 @@ update_repo: update_docs: mkdocs gh-deploy --config-file ../../mkdocs.yaml -# Note to future generations: prepending ./ is a safety measure to ensure that -# the environment does not malicously set `CLEANFILES` to `\`. +# Note to future generations: computing the real path relative to the +# current directory is a way to ensure we only clean up directories that +# are located below the current directory, regardless of the contents of +# the *DIR variables. .PHONY: clean clean: - [ -n "$(MIRRORDIR)" ] && [ $(MIRRORDIR) != "." ] && [ $(MIRRORDIR) != "/" ] && [ $(MIRRORDIR) != ".." ] && [ -d ./$(MIRRORDIR) ] && rm -rf ./$(MIRRORDIR)/* - [ -n "$(TMPDIR)" ] && [ $(TMPDIR) != "." ] && [ $(TMPDIR) != "/" ] && [ $(TMPDIR) != ".." ] && [ -d ./$(TMPDIR) ] && rm -rf ./$(TMPDIR)/* - [ -n "$(UPDATEREPODIR)" ] && [ $(UPDATEREPODIR) != "." ] && [ $(UPDATEREPODIR) != "/" ] && [ $(UPDATEREPODIR) != ".." ] && [ -d ./$(UPDATEREPODIR) ] && rm -rf ./$(UPDATEREPODIR)/* + for dir in $(MIRRORDIR) $(TMPDIR) $(UPDATEREPODIR) ; do \ + reldir=$$(realpath --relative-to=$$(pwd) $$dir) ; \ + case $$reldir in .*|"") ;; *) rm -rf $$reldir/* ;; esac \ + done rm -f $(CLEANFILES) .PHONY: help @@ -673,6 +740,7 @@ Core commands: * prepare_release_fast: Run the entire release pipeline without refreshing imports, recreating components or recompiling patterns. * update_repo: Update the ODK repository setup using the config file pato-odk.yaml * test: Running all validation tests +* test_fast: Runs the test suite, but without updating imports or components * odkversion: Show the current version of the ODK Makefile and ROBOT. * clean: Delete all temporary files * help: Print ODK Usage information @@ -690,8 +758,8 @@ Imports management: Editor utilities: * validate_idranges: Make sure your ID ranges file is formatted correctly -* normalize_src: Load and safe your pato-edit file after you to make sure its serialised correctly -* normalize_obo_src: Load and safe your pato-edit.obo file after you to merge duplicate annotation assertions +* normalize_src: Load and save your pato-edit file after you to make sure its serialised correctly +* normalize_obo_src: Load and save your pato-edit.obo file after you to merge duplicate annotation assertions * explain_unsat: If you have unsatisfiable classes, this command will create a markdown file (tmp/explain_unsat.md) which will explain all your unsatisfiable classes * validate-all-tsv: Check all your tsv files for possible problems in syntax. Use ALL_TSV_FILES variable to list files * validate-tsv: Check a tsv file for syntactic problems with tsvalid. Use TSV variable to pass filepath, e.g. make TSV=../my.tsv validate-tsv. diff --git a/src/ontology/run.sh b/src/ontology/run.sh index cebc839b..833f7e6c 100755 --- a/src/ontology/run.sh +++ b/src/ontology/run.sh @@ -14,6 +14,8 @@ # # See README-editors.md for more details. +set -e + if [ -f run.sh.conf ]; then . ./run.sh.conf fi @@ -29,6 +31,22 @@ elif [ -f "$HOME/Library/Application Support/ontology-development-kit/github/tok GH_TOKEN=$(cat "$HOME/Library/Application Support/ontology-development-kit/github/token") fi +# SSH agent socket +# On macOS, we cannot use $SSH_AUTH_SOCK directly, +# we need to use a "magic" socket instead. +case "$(uname)" in +Darwin) + ODK_SSH_AUTH_SOCKET=/run/host-services/ssh-auth.sock + ;; +*) + ODK_SSH_AUTH_SOCKET=$SSH_AUTH_SOCK + ;; +esac +ODK_SSH_BIND= +if [ -n "$ODK_SSH_AUTH_SOCKET" ]; then + ODK_SSH_BIND=",$ODK_SSH_AUTH_SOCKET:/run/host-services/ssh-auth.sock" +fi + ODK_IMAGE=${ODK_IMAGE:-odkfull} TAG_IN_IMAGE=$(echo $ODK_IMAGE | awk -F':' '{ print $2 }') if [ -n "$TAG_IN_IMAGE" ]; then @@ -40,16 +58,28 @@ ODK_TAG=${ODK_TAG:-latest} ODK_JAVA_OPTS=${ODK_JAVA_OPTS:--Xmx12G} ODK_DEBUG=${ODK_DEBUG:-no} +ODK_USER_ID=${ODK_USER_ID:-$(id -u)} +ODK_GROUP_ID=${ODK_GROUP_ID:-$(id -g)} + +# Convert OWLAPI_* environment variables to the OWLAPI as Java options +# See http://owlcs.github.io/owlapi/apidocs_4/org/semanticweb/owlapi/model/parameters/ConfigurationOptions.html +# for a list of allowed options +OWLAPI_OPTIONS_NAMESPACE=org.semanticweb.owlapi.model.parameters.ConfigurationOptions +for owlapi_var in $(env | sed -n s/^OWLAPI_//p) ; do + ODK_JAVA_OPTS="$ODK_JAVA_OPTS -D$OWLAPI_OPTIONS_NAMESPACE.${owlapi_var%=*}=${owlapi_var#*=}" +done + TIMECMD= if [ x$ODK_DEBUG = xyes ]; then # If you wish to change the format string, take care of using # non-breaking spaces (U+00A0) instead of normal spaces, to # prevent the shell from tokenizing the format string. - echo "Running ${IMAGE} with ${ODK_JAVA_OPTS} of memory for ROBOT and Java-based pipeline steps." + echo "Running obolibrary/${ODK_IMAGE}:${ODK_TAG} with '${ODK_JAVA_OPTS}' as options for ROBOT and other Java-based pipeline steps." TIMECMD="/usr/bin/time -f ### DEBUG STATS ###\nElapsed time: %E\nPeak memory: %M kb" fi +rm -f tmp/debug.log -VOLUME_BIND=$PWD/../../:/work +VOLUME_BIND=$PWD/../../:/work$ODK_SSH_BIND WORK_DIR=/work/src/ontology if [ -n "$ODK_BINDS" ]; then @@ -59,14 +89,14 @@ fi if [ -n "$USE_SINGULARITY" ]; then singularity exec --cleanenv $ODK_SINGULARITY_OPTIONS \ - --env "ROBOT_JAVA_ARGS=$ODK_JAVA_OPTS,JAVA_OPTS=$ODK_JAVA_OPTS" \ + --env "ROBOT_JAVA_ARGS=$ODK_JAVA_OPTS,JAVA_OPTS=$ODK_JAVA_OPTS,SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock,ODK_USER_ID=$ODK_USER_ID,ODK_GROUP_ID=$ODK_GROUP_ID,ODK_DEBUG=$ODK_DEBUG" \ --bind $VOLUME_BIND \ -W $WORK_DIR \ docker://obolibrary/$ODK_IMAGE:$ODK_TAG $TIMECMD "$@" else BIND_OPTIONS="-v $(echo $VOLUME_BIND | sed 's/,/ -v /')" docker run $ODK_DOCKER_OPTIONS $BIND_OPTIONS -w $WORK_DIR \ - -e ROBOT_JAVA_ARGS="$ODK_JAVA_OPTS" -e JAVA_OPTS="$ODK_JAVA_OPTS" \ + -e ROBOT_JAVA_ARGS="$ODK_JAVA_OPTS" -e JAVA_OPTS="$ODK_JAVA_OPTS" -e SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock -e ODK_USER_ID=$ODK_USER_ID -e ODK_GROUP_ID=$ODK_GROUP_ID -e ODK_DEBUG=$ODK_DEBUG \ --rm -ti obolibrary/$ODK_IMAGE:$ODK_TAG $TIMECMD "$@" fi diff --git a/src/scripts/run-command.sh b/src/scripts/run-command.sh new file mode 100755 index 00000000..45d431d1 --- /dev/null +++ b/src/scripts/run-command.sh @@ -0,0 +1,4 @@ +#!/bin/sh +ODK_DEBUG_FILE=${ODK_DEBUG_FILE:-debug.log} +echo "Command: sh $@" >> $ODK_DEBUG_FILE +/usr/bin/time -a -o $ODK_DEBUG_FILE -f "Elapsed time: %E\nPeak memory: %M kb" /bin/sh "$@" diff --git a/src/scripts/update_repo.sh b/src/scripts/update_repo.sh index 42278403..085abe4d 100644 --- a/src/scripts/update_repo.sh +++ b/src/scripts/update_repo.sh @@ -26,7 +26,8 @@ cp target/$OID/src/ontology/run.sh $SRCDIR/ontology/ cp -r target/$OID/src/sparql/* $SRCDIR/sparql/ mkdir -p $ROOTDIR/.github mkdir -p $ROOTDIR/.github/workflows -cp -n target/$OID/.github/workflows/qc.yml $ROOTDIR/.github/workflows/qc.yml +cp target/$OID/.github/workflows/qc.yml $ROOTDIR/.github/workflows/qc.yml + cp target/$OID/.github/workflows/docs.yml $ROOTDIR/.github/workflows/docs.yml @@ -35,5 +36,5 @@ cp target/$OID/.github/workflows/docs.yml $ROOTDIR/.github/workflows/docs.yml cp -n target/$OID/mkdocs.yaml $ROOTDIR/ echo "WARNING: These files should be manually migrated: mkdocs.yaml, .gitignore, src/ontology/catalog.xml (if you added a new import or component)" -echo "WARNING: Your QC workflows have not been updated automatically. Please update the ODK version number(s) in .github/workflows/qc.yml." + echo "Ontology repository update successfully completed." \ No newline at end of file diff --git a/src/sparql/class-count-by-prefix.sparql b/src/sparql/class-count-by-prefix.sparql index 0c4d2844..a6a4851e 100644 --- a/src/sparql/class-count-by-prefix.sparql +++ b/src/sparql/class-count-by-prefix.sparql @@ -7,4 +7,4 @@ SELECT ?prefix (COUNT(DISTINCT ?cls) AS ?numberOfClasses) WHERE FILTER (!isBlank(?cls)) BIND( STRBEFORE(STRAFTER(str(?cls),"http://purl.obolibrary.org/obo/"), "_") AS ?prefix) } -GROUP BY ?prefix +GROUP BY ?prefix \ No newline at end of file