From f24ff17e8c6850b0c7f73daaebc0de1ce64aed11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Thu, 6 Feb 2025 13:04:45 +0100 Subject: [PATCH 01/28] Update dependencies --- docs/conf.py | 2 +- requirements.txt | 66 +++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b58427b..b0738bf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -62,7 +62,7 @@ 'sidebar-item-spacing-horizontal': '.75rem', }, 'sidebar_hide_name': True, - 'top_of_page_button': None, + 'top_of_page_buttons': [], } html_css_files = ['custom.css'] html_js_files = ['custom.js'] diff --git a/requirements.txt b/requirements.txt index 2a8c72f..0b56f96 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,43 +1,45 @@ -alabaster==0.7.16 -attrs==23.2.0 -Babel==2.14.0 -beautifulsoup4==4.12.3 -certifi==2024.2.2 -charset-normalizer==3.3.2 -deepmerge==1.1.1 -docutils==0.21.1 -furo==2024.1.29 -idna==3.7 +alabaster==1.0.0 +attrs==25.1.0 +babel==2.17.0 +beautifulsoup4==4.13.3 +certifi==2025.1.31 +charset-normalizer==3.4.1 +deepmerge==2.0 +docutils==0.21.2 +furo==2024.8.6 +idna==3.10 imagesize==1.4.1 -Jinja2==3.1.3 -jsonschema==4.21.1 -jsonschema-specifications==2023.12.1 +Jinja2==3.1.5 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 latexcodec==3.0.0 -MarkupSafe==2.1.5 -mistune==2.0.5 -packaging==24.0 +MarkupSafe==3.0.2 +mistune==3.1.1 +packaging==24.2 picobox==4.0.0 pybtex==0.24.0 pybtex-docutils==1.0.3 -Pygments==2.17.2 -PyYAML==6.0.1 -referencing==0.34.0 -requests==2.31.0 -rpds-py==0.18.0 -six==1.16.0 +Pygments==2.19.1 +PyYAML==6.0.2 +referencing==0.36.2 +requests==2.32.3 +rpds-py==0.22.3 +setuptools==75.8.0 +six==1.17.0 snowballstemmer==2.2.0 -soupsieve==2.5 -Sphinx==7.3.7 +soupsieve==2.6 +Sphinx==8.1.3 sphinx-basic-ng==1.0.0b2 sphinx-copybutton==0.5.2 -sphinx_mdinclude==0.5.4 -sphinxcontrib-applehelp==1.0.8 -sphinxcontrib-bibtex==2.6.2 -sphinxcontrib-devhelp==1.0.6 -sphinxcontrib-htmlhelp==2.0.5 +sphinx_mdinclude==0.6.2 +sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-bibtex==2.6.3 +sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-httpdomain==1.8.1 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-openapi==0.8.4 -sphinxcontrib-qthelp==1.0.7 -sphinxcontrib-serializinghtml==1.1.10 -urllib3==2.2.1 +sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 +typing_extensions==4.12.2 +urllib3==2.3.0 From 3e9613b209ee9c592e3a79ba651fe77516ca9c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Thu, 6 Feb 2025 13:28:53 +0100 Subject: [PATCH 02/28] Fix code style --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index 53a78eb..be794c1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,6 +12,7 @@ max_line_length = off indent_size = 4 [*.bat] +indent_style = tab end_of_line = crlf [*.{yaml,yml}] @@ -25,3 +26,6 @@ indent_size = 2 [*.js] indent_size = 2 + +[Makefile] +indent_style = tab From 1511223ed4bf6136c5460db17f1863408e6fa892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Thu, 6 Feb 2025 13:29:10 +0100 Subject: [PATCH 03/28] Update structure --- docs/architecture/dmp_if.rst | 4 ++++ docs/architecture/fair_if.rst | 4 ++++ docs/architecture/intro.rst | 4 ++++ docs/architecture/skg_if.rst | 4 ++++ docs/commons/governance.rst | 4 ++++ docs/commons/intro.rst | 6 ++++++ docs/commons/resources.rst | 4 ++++ docs/index.rst | 19 +++++++++++++++++++ 8 files changed, 49 insertions(+) create mode 100644 docs/architecture/dmp_if.rst create mode 100644 docs/architecture/fair_if.rst create mode 100644 docs/architecture/intro.rst create mode 100644 docs/architecture/skg_if.rst create mode 100644 docs/commons/governance.rst create mode 100644 docs/commons/intro.rst create mode 100644 docs/commons/resources.rst diff --git a/docs/architecture/dmp_if.rst b/docs/architecture/dmp_if.rst new file mode 100644 index 0000000..e00f927 --- /dev/null +++ b/docs/architecture/dmp_if.rst @@ -0,0 +1,4 @@ +Architecture: DMP IF +==================== + +*To be specified* diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst new file mode 100644 index 0000000..8c05806 --- /dev/null +++ b/docs/architecture/fair_if.rst @@ -0,0 +1,4 @@ +Architecture: FAIR IF +===================== + +*To be specified* diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst new file mode 100644 index 0000000..23b0fd9 --- /dev/null +++ b/docs/architecture/intro.rst @@ -0,0 +1,4 @@ +Architecture: Introduction +========================== + +*To be specified* diff --git a/docs/architecture/skg_if.rst b/docs/architecture/skg_if.rst new file mode 100644 index 0000000..51bbf1e --- /dev/null +++ b/docs/architecture/skg_if.rst @@ -0,0 +1,4 @@ +Architecture: SKG IF +==================== + +*To be specified* diff --git a/docs/commons/governance.rst b/docs/commons/governance.rst new file mode 100644 index 0000000..e64d544 --- /dev/null +++ b/docs/commons/governance.rst @@ -0,0 +1,4 @@ +Commons: Governance +=================== + +*To be specified* diff --git a/docs/commons/intro.rst b/docs/commons/intro.rst new file mode 100644 index 0000000..91d02e3 --- /dev/null +++ b/docs/commons/intro.rst @@ -0,0 +1,6 @@ +Commons: Introduction +===================== + +.. page-authors:: Marek Suchánek + +*To be specified* diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst new file mode 100644 index 0000000..4ed950a --- /dev/null +++ b/docs/commons/resources.rst @@ -0,0 +1,4 @@ +Commons: Resources +================== + +*To be specified* diff --git a/docs/index.rst b/docs/index.rst index 81fe531..92ff83e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,6 +13,25 @@ Documentation Structure *This documentation is currently under development...* +.. toctree:: + :maxdepth: 2 + :caption: Architecture + + Introduction + DMP IF + SKG IF + FAIR IF + + +.. toctree:: + :maxdepth: 2 + :caption: Commons + + Introduction + Governance + Resources + + .. toctree:: :maxdepth: 2 :caption: Other From f98e00adae8c2f6e101b592837d5ec3b154b55e3 Mon Sep 17 00:00:00 2001 From: TomMiksa Date: Thu, 6 Feb 2025 15:41:39 +0100 Subject: [PATCH 04/28] Architecture introduction and DMP-IF descriptions added (#2) * Update intro.rst Added section on architecture * Architecture diagam added * Update dmp_if.rst DMP-IF description added --- docs/architecture/OSTrails-architecture.png | Bin 0 -> 54766 bytes docs/architecture/dmp_if.rst | 29 +++++++++++++- docs/architecture/intro.rst | 42 +++++++++++++++++++- 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 docs/architecture/OSTrails-architecture.png diff --git a/docs/architecture/OSTrails-architecture.png b/docs/architecture/OSTrails-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6aa865ecd9d73e007a7437df500b311c8e2e0f GIT binary patch literal 54766 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 literal 0 HcmV?d00001 diff --git a/docs/architecture/dmp_if.rst b/docs/architecture/dmp_if.rst index e00f927..a61ca1b 100644 --- a/docs/architecture/dmp_if.rst +++ b/docs/architecture/dmp_if.rst @@ -1,4 +1,31 @@ Architecture: DMP IF ==================== -*To be specified* +An **interoperability framework** refers to a set of guidelines, standards, and protocols that ensure the ability of different systems, applications, or organizations to work together effectively, exchanging data and functions seamlessly despite differences in their underlying technologies. The framework typically addresses the technical, semantic, and organizational aspects needed to facilitate collaboration and integration between disparate systems. + +The **DMP-IF** consists of: + * RDA DMP **common standard** for machine-actionable DMPs (DCS), + * OSTrails **application profile** for maDMPs, + * maDMP Application Programming Interface (**API**). + +The DMP-IF follows this definition and is designed with DMP Platforms in mind but can be used by any service or tool that exchanges maDMPs. The IF does not prescribe internal organisation of services, e.g. their architecture or how they represent information internally. The IF focuses on how the information is exchanged with other services, i.e. defines concepts and models to represent the information, as well as actions that can be performed to get or modify information in a service implementing the DMP-IF. For example, listing all datasets described by a DMP, including their identifiers and licences, is performed in a unified way, independent of the underlying implementation. The DMP-IF addresses the technical and semantic layers only. + +The **common standard** is an RDA recommendation. It defines a minimum set of concepts used to model information in DMPs common for most use cases. The **application profile** builds on top of the common standard. It provides additional concepts and constraints necessary to support the interactions identified in the pathways and reference architecture. Thus, it provides more concepts and more constraints that reflect the needs of OSTrails as whole and eventually EOSC. While both focus on establishing a common language on how information contained in DMPs is expressed in a machine-actionable way, the API provides a set of methods that can be used to perform specific actions on DMPs. The structure of messages exchanged with the use of the API is based on the common language defined by the common standard and the application profile. + +The DMP-IF is **relevant to software engineers and service operators** who want to standardise how information on DMPs is exchanged. End-users, i.e. researchers, are not supposed to be aware of the DMP-IF. The DMP-IF facilitates the reuse and exchange of information so that typical RDM tasks can be automated, and DMPs are a place where all the information relevant to data management, e.g. type of data, storage location, access permissions, etc., are kept. DMP platforms should thus become a source of up-to-date information for other services that depend on them, e.g. researchers involved in a project described by a DMP should automatically get access to relevant equipment and repositories described by the DMP. As a result, creating the DMP should primarily benefit researchers by facilitating data management of their typical tasks and become less a one-time exercise to meet formal requirements. + +**Adopting the DMP-IF** can be performed gradually and tailored to the needs of the specific use case. Yet, full interoperability can only be achieved when the specific service implements the complete maDMP API. This is because the API reflects the community agreement on the common language used to describe the DMP contents and makes technical decisions that leave less room for interpretation, e.g. choice of communication protocol, such as HTTP, and ways to serialise the exchanged messages, for instance, using JSON. + +Ongoing and future work +****** +Together with the RDA DMP Common Standards WG we perform the maintenance of the recommendation. The RDA DMP Common Standards working group will be able to accept only minor and small changes to the recommendation. These will be mostly refinements bringing clarity or changes that are backward-compatible. As a result, we will have a stable and up-to-date set of concepts shared across the whole DMP community. Any major changes that could considerably influence the design of the recommendation need to be performed by a new working group – this is an RDA requirement. For this reason, OSTrails develops the OSTrails application profile to incorporate bigger changes that also cover the project-specific needs, which may not be shared across the whole RDA community. + +By defining one application profile, we want to mitigate a situation when every use case owner defines their own set of extensions. For example, we will define a set of concepts that support the requirements of most funders instead of having extensions per funder. This should prevent situations in which overlapping concepts are represented differently, and hence, the interoperability is lower. While the DCS is an official recommendation of RDA and must leave many decisions open, e.g., which type of controlled vocabulary to use for identifier types, the OSTrails application profile imposes additional constraints on the RDA recommendation that are relevant within the OSTrails and EOSC contexts. For example, the application profile may have stricter requirements regarding the use of persistent identifiers (rather than URLs) or may require the use of specific controlled vocabularies. + +The broader objectives of the maDMP API are as follows: + * Enable interoperability and interchangeability of DMP platforms: Ensure that any DMP tool can be utilised in diverse contexts without compatibility concerns. + * Reduce reliance on static text documents: Shift away from narrative DMP formats, such as PDFs, towards enhanced use of persistent identifiers where appropriate. + * Promote the reuse of information from DMPs: Facilitate the transfer of information from DMPs to inform and drive actions within other RDM systems. + * Enhance the quality and timeliness of DMPs: Improve accuracy by sourcing data directly from systems where RDM activities are conducted. + +This approach aims to establish a robust framework for seamless integration and automation in the RDM ecosystem, significantly advancing the utility and efficiency of DMPs. The maDMP API does not replace existing APIs offered by DMP Platforms. There are still operations that are specific to each platform. The maDMP API standardises typical interactions with maDMPs in a similar fashion as the DCS, which represents consensus on most common DMP elements in most settings, but not all of them. diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst index 23b0fd9..40297da 100644 --- a/docs/architecture/intro.rst +++ b/docs/architecture/intro.rst @@ -1,4 +1,42 @@ -Architecture: Introduction +Architecture ========================== -*To be specified* +The OSTrails reference architecture provides guidance on realising interactions between key components identified in the OSTrails pathways: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. + +A key objective of this architecture is to prevent vendor lock-in, ensuring tools and services can be used interchangeably in typical scenarios outlined by the pathways. For instance, any SKG conforming to the SKG-IF can seamlessly integrate with DMP tools to provide additional insights into reused datasets. This architecture emphasises harmonising the modelling and exchange of information across research data management services while allowing diverse implementation choices tailored to specific use cases. + +The architecture also supports both current well-known and potential future patterns of interactions between components, fostering innovative use cases that enhance automation and machine-actionability of digital object information exchange. For example, while it is yet uncommon for data repositories to update DMPs, the architecture anticipates and accommodates such potential pathways. + +.. image:: OSTrails-architecture.png + +We use colour coding in the diagram: + * Orange represents the components and communications that are subject to standardisation within the DMP-IF. + * Blue represents the components and communications that are subject to standardisation within the SKG-IF. + * Green represents the components and communications that are subject to standardisation within the FAIR-IF. + * Gray represents the components and communications that are relevant for delivering the pathways identified by the project but are not subject to any of the interoperability frameworks, e.g. standards may already be in place, under development by other projects, or simply be based on custom interfaces provided by specific services. + +The reference architecture consists of the following conceptual components: + * DMP Platform – Platform, tool, or service (software system) for planning data management, producing data management plans (DMPs), including machine-actionable data management plans (maDMPs). + * SKG - For the purposes of the OSTrails project, an SKG is defined as any database/repository with information pertaining to research products, processes and actors & agents which can present a graph-type view of this information via a suitable API. + * FAIR Assessment Tool – Software that applies a set of FAIR Tests to the metadata/data of a digital object (such as datasets), presents the output as a FAIR Test Result Set, and provides assistance on how to interpret and improve the results. FAIR Assessment tools may also include additional functionalities such as searching for and/or authoring Metrics and searching for and/or authoring Benchmarks. + * DMP Evaluation Service - A service that takes a DMP as input and gives as a result measurements indicating if the DMP meets given compliance requirements. These requirements depend on the evaluation scenario but in general consist of measurements for subsets of information contained in a DMP. Such measurements can be the FAIRness of digital objects included in the DMP, compliance of the DMP with the RDA maDMP standard, or automated measurements of funder requirements such as the existence of relevant information and their allowed values. To provide these measurements, the DMP Evaluator coordinates the inclusion of the results of other evaluators and resolves information contained in a DMP through SKGs and other sources. + * Data Repository – any service that stores and provides access to data. Usually, it provides a means for persistent identification and ensures that data is accompanied by metadata. Examples include zenodo.org, institutional repositories, etc. + * Other SKG – same definition as for the SKG. This element is introduced in the reference architecture to indicate that the SKG-IF can be used for communication between different SKGs. + +The reference architecture says that a *DMP Platform* must provide a DMP API that can be used by other services. SKGs and data repositories use this API to interact with the DMP Platform. The specific operations of the API will be described elsewhere. For the time being, one can imagine that a data repository can use the DMP API to e.g. add information about a specific licence assigned to a dataset described by the DMP. + +The *SKGs* must provide an SKG API so that other SKGs can interact with them. DMP Platforms use SKG API to access information in SKGs, e.g. to search for datasets, or to fetch information using identifiers. DMP Evaluation Service and FAIR assessment tools use the SKG API to get additional information needed during assessment. Data repositories also use this API. + +*FAIR Assessment Tools* have APIs that are only partially defined by the OSTrails reference architecture; that is, while the input required by a FAIR assessment tool cannot be predicted, the output structures from all FAIR assessment tools (namely, the “FAIR Test Result Set” data structure) have been specified by the FAIR Reference Architecture (Deliverable D1.2). Further discussion regarding this appears in the chapter 5 of this document. DMP Platforms, DMP Evaluation Services, and SKGs can thus expect a standardised response when interacting with FAIR assessment tools that comply with the FAIR-IF. + +The *DMP Evaluation Service* provides an interface that the DMP Platform uses to interact with it, i.e. send maDMPs for evaluation and fetch the results. This interface will be designed as part of the DMP Evaluation Service and described in a separate deliverable. Yet, it will be specific to this service and does not belong to any of the interoperability frameworks, i.e. in case other similar services exist, they can define their own interfaces. + +In a similar way, *Data Repositories* may have custom APIs that are used by FAIR Assessment tools or DMP Platforms. OSTrails does not attempt to standardise this communication because it is already a subject of the work by the EOSC Future project on standardising access to content via PID. + +Additional information +******************* +Check our deliverables for more information: + * Reichmann, S., Rey Mazón, M., Hasani-Mavriqi, I., Thaci, L., & Eckhard, D. (2024). **D1.1: Plan-Track-Assess Pathways**. Zenodo. https://doi.org/10.5281/zenodo.13145788 + * Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 + * Suchánek, M., Martínková, J., Shepherdson, J., Miksa, T., Jirka, J., Knaisl, V., Moilanen, K., Sansone, S.-A., & Stavropoulos, T. (2025). **D2.5 OSTrails Commons Specifications**. Zenodo. https://doi.org/10.5281/zenodo.14795060 + From 052efc2a8aea8dc12ac36c2cf9feab0124ec7ad7 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Thu, 6 Feb 2025 18:30:31 +0100 Subject: [PATCH 05/28] added FAIR-IF resources --- docs/architecture/fair_if.rst | 66 ++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index 8c05806..d36a20b 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -1,4 +1,68 @@ Architecture: FAIR IF ===================== -*To be specified* + +FAIR Test Results specification and SHACL shapes: +****** +FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as [DCAT](https://www.w3.org/TR/vocab-dcat-3/), [DQV](https://www.w3.org/TR/vocab-dqv/) and [PROV](https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. + +The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. + +- Persistent identifier: https://w3id.org/ftr/1.0.0 +- Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ +- Version: 1.0.0 +- Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 + + +FAIR Champion +****** +FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. + +- Persistent identifier: https://tools.ostrails.eu/champion/sets/ +- Code repository: https://github.com/OSTrails/FAIR-Champion +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 + + +FAIR Champion Tests +****** +A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) + +- Persistent identifier: https://tests.ostrails.eu/tests +- Code repository: https://github.com/OSTrails/FAIR-Core-Tests +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 + + +FOOPS! Test and metric catalogue +****** +The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. + +- Persistent identifier: https://w3id.org/foops/catalogue +- Zenodo link (latest release): https://doi.org/10.5281/zenodo.14767999 +- Code repository: https://github.com/oeg-upm/fair_ontologies +- Version: 0.2.0 +- Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 + + +FAIR Data Point: +****** +The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! + +- Identifier: https://tools.ostrails.eu/fdp-index/ +- Code repository: https://github.com/FAIRDataTeam +- Version: Docker Image version 16.x +- Release: N/A + + +FAIR Data Point Index Proxy: +****** +An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. + +- Identifier: https://tools.ostrails.eu/fdp-index-proxy +- Zenodo link (latest release) +- Code repository: https://github.com/OSTrails/FDP-Index-Proxy +- Version: Release v1.0.0 +- Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 + + \ No newline at end of file From c1c8866ff0047e08357dc8ed67103492976001d4 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:20:36 +0100 Subject: [PATCH 06/28] edits to the right page --- docs/commons/resources.rst | 67 +++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index 4ed950a..c105011 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -1,4 +1,69 @@ Commons: Resources ================== -*To be specified* +.. page-authors:: Daniel Garijo + +The following resources are part of the FAIR-IF commons: + +FAIR Test Results specification and SHACL shapes: +****** +[FTR](https://w3id.org/ftr/) is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as [DCAT](https://www.w3.org/TR/vocab-dcat-3/), [DQV](https://www.w3.org/TR/vocab-dqv/) and [PROV](https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. + +The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. + +- Persistent identifier: https://w3id.org/ftr/1.0.0 +- Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ +- Version: 1.0.0 +- Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 + + +FAIR Champion +****** +FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. + +- Persistent identifier: https://tools.ostrails.eu/champion/sets/ +- Code repository: https://github.com/OSTrails/FAIR-Champion +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 + + +FAIR Champion Tests +****** +A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) + +- Persistent identifier: https://tests.ostrails.eu/tests +- Code repository: https://github.com/OSTrails/FAIR-Core-Tests +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 + + +FOOPS! Test and metric catalogue +****** +The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. + +- Persistent identifier: https://w3id.org/foops/catalogue +- Zenodo link (latest release): https://doi.org/10.5281/zenodo.14767999 +- Code repository: https://github.com/oeg-upm/fair_ontologies +- Version: 0.2.0 +- Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 + + +FAIR Data Point: +****** +The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! + +- Identifier: https://tools.ostrails.eu/fdp-index/ +- Code repository: https://github.com/FAIRDataTeam +- Version: Docker Image version 16.x +- Release: N/A + + +FAIR Data Point Index Proxy: +****** +An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. + +- Identifier: https://tools.ostrails.eu/fdp-index-proxy +- Zenodo link (latest release) +- Code repository: https://github.com/OSTrails/FDP-Index-Proxy +- Version: Release v1.0.0 +- Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 From ff95c2ad84df14b491d64657ad8c847323e9e4dd Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:22:18 +0100 Subject: [PATCH 07/28] edits to the right page --- docs/architecture/fair_if.rst | 64 +---------------------------------- 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index d36a20b..c5e82bd 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -1,68 +1,6 @@ Architecture: FAIR IF ===================== - -FAIR Test Results specification and SHACL shapes: -****** -FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as [DCAT](https://www.w3.org/TR/vocab-dcat-3/), [DQV](https://www.w3.org/TR/vocab-dqv/) and [PROV](https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. - -The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. - -- Persistent identifier: https://w3id.org/ftr/1.0.0 -- Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ -- Version: 1.0.0 -- Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 - - -FAIR Champion -****** -FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. - -- Persistent identifier: https://tools.ostrails.eu/champion/sets/ -- Code repository: https://github.com/OSTrails/FAIR-Champion -- Version: Release v1 -- Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 - - -FAIR Champion Tests -****** -A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) - -- Persistent identifier: https://tests.ostrails.eu/tests -- Code repository: https://github.com/OSTrails/FAIR-Core-Tests -- Version: Release v1 -- Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 - - -FOOPS! Test and metric catalogue -****** -The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. - -- Persistent identifier: https://w3id.org/foops/catalogue -- Zenodo link (latest release): https://doi.org/10.5281/zenodo.14767999 -- Code repository: https://github.com/oeg-upm/fair_ontologies -- Version: 0.2.0 -- Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 - - -FAIR Data Point: -****** -The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! - -- Identifier: https://tools.ostrails.eu/fdp-index/ -- Code repository: https://github.com/FAIRDataTeam -- Version: Docker Image version 16.x -- Release: N/A - - -FAIR Data Point Index Proxy: -****** -An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. - -- Identifier: https://tools.ostrails.eu/fdp-index-proxy -- Zenodo link (latest release) -- Code repository: https://github.com/OSTrails/FDP-Index-Proxy -- Version: Release v1.0.0 -- Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 +*To be specified* \ No newline at end of file From 0a094515770a3cd7c6f5bafd6c1c3e9c70c217e7 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:36:50 +0100 Subject: [PATCH 08/28] edits to add Daniel in contributors --- CONTRIBUTORS.yml | 6 ++++++ docs/commons/resources.rst | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index 7376716..0210f4d 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -4,3 +4,9 @@ Marek Suchánek: github: MarekSuchanek orcid: 0000-0001-7525-9218 affiliation: CTU in Prague +Daniel Garijo: + first_name: Daniel + last_name: Garijo + github: dgarijo + orcid: 0000-0003-0454-7145 + affiliation: Universidad Politécnica de Madrid \ No newline at end of file diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index c105011..d5cda7a 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -6,7 +6,7 @@ Commons: Resources The following resources are part of the FAIR-IF commons: FAIR Test Results specification and SHACL shapes: -****** +************************************************ [FTR](https://w3id.org/ftr/) is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as [DCAT](https://www.w3.org/TR/vocab-dcat-3/), [DQV](https://www.w3.org/TR/vocab-dqv/) and [PROV](https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. @@ -18,7 +18,7 @@ The code release includes the vocabularies, definitions, specifications in machi FAIR Champion -****** +************* FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. - Persistent identifier: https://tools.ostrails.eu/champion/sets/ @@ -28,7 +28,7 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a FAIR Champion Tests -****** +******************* A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) - Persistent identifier: https://tests.ostrails.eu/tests @@ -38,7 +38,7 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet FOOPS! Test and metric catalogue -****** +******************************** The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. - Persistent identifier: https://w3id.org/foops/catalogue @@ -49,7 +49,7 @@ The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies FAIR Data Point: -****** +**************** The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! - Identifier: https://tools.ostrails.eu/fdp-index/ @@ -59,7 +59,7 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam FAIR Data Point Index Proxy: -****** +**************************** An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. - Identifier: https://tools.ostrails.eu/fdp-index-proxy From 3c11421d8d56fbf45e2747cf440bec6bb6fc8740 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:39:07 +0100 Subject: [PATCH 09/28] small change --- CONTRIBUTORS.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index 0210f4d..d69aabe 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -4,6 +4,7 @@ Marek Suchánek: github: MarekSuchanek orcid: 0000-0001-7525-9218 affiliation: CTU in Prague + Daniel Garijo: first_name: Daniel last_name: Garijo From ed151e481cfc2698bec28c934cf8bd12e4728aa4 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:47:50 +0100 Subject: [PATCH 10/28] trying to impove styles --- docs/commons/resources.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index d5cda7a..a78133b 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -5,9 +5,9 @@ Commons: Resources The following resources are part of the FAIR-IF commons: -FAIR Test Results specification and SHACL shapes: -************************************************ -[FTR](https://w3id.org/ftr/) is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as [DCAT](https://www.w3.org/TR/vocab-dcat-3/), [DQV](https://www.w3.org/TR/vocab-dqv/) and [PROV](https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. +FAIR Test Results specification and SHACL shapes (FTR): +------------------------------------------------------- +FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. @@ -17,8 +17,8 @@ The code release includes the vocabularies, definitions, specifications in machi - Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 -FAIR Champion -************* +FAIR Champion: +-------------- FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. - Persistent identifier: https://tools.ostrails.eu/champion/sets/ @@ -27,8 +27,8 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a - Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 -FAIR Champion Tests -******************* +FAIR Champion Tests: +-------------------- A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) - Persistent identifier: https://tests.ostrails.eu/tests @@ -37,8 +37,8 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet - Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 -FOOPS! Test and metric catalogue -******************************** +FOOPS! Test and metric catalogue: +--------------------------------- The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. - Persistent identifier: https://w3id.org/foops/catalogue @@ -49,7 +49,7 @@ The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies FAIR Data Point: -**************** +---------------- The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! - Identifier: https://tools.ostrails.eu/fdp-index/ @@ -59,7 +59,7 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam FAIR Data Point Index Proxy: -**************************** +---------------------------- An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. - Identifier: https://tools.ostrails.eu/fdp-index-proxy From d91763223561614f7076e16a6eaa9887b8b5c271 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 7 Feb 2025 14:50:48 +0100 Subject: [PATCH 11/28] Fix #1 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 63c9723..ad23bc2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # OSTrails Read-the-Docs Documentation -[![Documentation Status](https://readthedocs.org/projects/ostrails/badge/?version=latest)](https://ostrails.readthedocs.io/en/latest/?badge=latest) +[![Documentation Status](https://readthedocs.org/projects/ostrails/badge/?version=latest)](https://docs.ostrails.eu/en/latest/?badge=latest) ## Usage -This repository contains the source files for the OSTrails documentation. The documentation is hosted on Read-the-Docs and can be accessed [here](https://ostrails.readthedocs.io/en/latest/). +This repository contains the source files for the OSTrails documentation. The documentation is hosted on Read-the-Docs and can be accessed [here](https://docs.ostrails.eu/en/latest/). ## Contributing From f8500e96da0410d9df8a959ed9e38fe8ffb2cb86 Mon Sep 17 00:00:00 2001 From: Mark Wilkinson Date: Tue, 11 Feb 2025 15:48:22 +0100 Subject: [PATCH 12/28] added to Introduction. Added licenses to my components --- CONTRIBUTORS.yml | 7 +++++++ docs/commons/intro.rst | 11 +++++++++-- docs/commons/resources.rst | 4 ++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index d69aabe..82c0bfa 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -10,4 +10,11 @@ Daniel Garijo: last_name: Garijo github: dgarijo orcid: 0000-0003-0454-7145 + affiliation: Universidad Politécnica de Madrid + +Mark Wilkinson: + first_name: Mark + last_name: Wilkinson + github: markwilkinson + orcid: 0000-0001-6960-357X affiliation: Universidad Politécnica de Madrid \ No newline at end of file diff --git a/docs/commons/intro.rst b/docs/commons/intro.rst index 91d02e3..960c4a0 100644 --- a/docs/commons/intro.rst +++ b/docs/commons/intro.rst @@ -1,6 +1,13 @@ Commons: Introduction ===================== -.. page-authors:: Marek Suchánek +.. page-authors:: Mark Wilkinson -*To be specified* +The OSTrails Commons +-------------------- + +The OSTrails Commons (referred to also as ‘the Commons’ hereafter) is a set of open, reusable digital objects that guide and simplify the inclusion of tools into the federation of interoperable services within OSTrails This repository is a living record of the standards, schemas, API definitions, and code modules that make up the OSTrails commons. + +The Commons is built through iterative cycles, where specifications will evolve (either individually or in sunchrony with other components of The Commons) to incorporate feedback from tool developers and other stakeholders. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. + +The Commons is guided by the Plan-Track-Assess Pathways defined by OSTrails, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. \ No newline at end of file diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index a78133b..fe61a64 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -24,6 +24,7 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a - Persistent identifier: https://tools.ostrails.eu/champion/sets/ - Code repository: https://github.com/OSTrails/FAIR-Champion - Version: Release v1 +- License: MIT - Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 @@ -34,6 +35,7 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet - Persistent identifier: https://tests.ostrails.eu/tests - Code repository: https://github.com/OSTrails/FAIR-Core-Tests - Version: Release v1 +- License: MIT - Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 @@ -55,6 +57,7 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam - Identifier: https://tools.ostrails.eu/fdp-index/ - Code repository: https://github.com/FAIRDataTeam - Version: Docker Image version 16.x +- License: MIT - Release: N/A @@ -66,4 +69,5 @@ An early prototype of a “proxy” service that allows native DCAT records to b - Zenodo link (latest release) - Code repository: https://github.com/OSTrails/FDP-Index-Proxy - Version: Release v1.0.0 +- License: MIT - Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 From 4dd01573ccf3eba26ace40a27d443de95b09bcfe Mon Sep 17 00:00:00 2001 From: Allyson Lister Date: Tue, 11 Feb 2025 14:59:53 +0000 Subject: [PATCH 13/28] Update resources.rst Small change to the first item to include references to algorithms and dimensions, both mentioned within the deliverables but not in the description. Larger change at the bottom to reference the relevance of the new FAIRassist registry in FAIRsharing to the various commons resources that are listed above it. --- docs/commons/resources.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index fe61a64..3ab2e94 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -5,9 +5,9 @@ Commons: Resources The following resources are part of the FAIR-IF commons: -FAIR Test Results specification and SHACL shapes (FTR): +FAIR Assessment specifications and SHACL shapes (FTR): ------------------------------------------------------- -FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks and their interpretation to generate a FAIR assessment score. +FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks, algorithms, dimensions/principles and their interpretation to generate a FAIR assessment score. The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. @@ -24,7 +24,6 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a - Persistent identifier: https://tools.ostrails.eu/champion/sets/ - Code repository: https://github.com/OSTrails/FAIR-Champion - Version: Release v1 -- License: MIT - Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 @@ -35,7 +34,6 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet - Persistent identifier: https://tests.ostrails.eu/tests - Code repository: https://github.com/OSTrails/FAIR-Core-Tests - Version: Release v1 -- License: MIT - Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 @@ -57,7 +55,6 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam - Identifier: https://tools.ostrails.eu/fdp-index/ - Code repository: https://github.com/FAIRDataTeam - Version: Docker Image version 16.x -- License: MIT - Release: N/A @@ -69,5 +66,13 @@ An early prototype of a “proxy” service that allows native DCAT records to b - Zenodo link (latest release) - Code repository: https://github.com/OSTrails/FDP-Index-Proxy - Version: Release v1.0.0 -- License: MIT - Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 + + +FAIRsharing Registry: +---------------------------- +FAIRsharing is a registry of standards, databases, policies and FAIR assistance conceptual components. Registration of FAIR principles/dimensions, metrics, and benchmarks within FAIRsharing allows human- and machine-readable integration of the FAIR assessment components within the wider research landscape, and is key to discovery of these resources as well as for the implementation of the tests themselves via the rich metadata contained within the registry. Rather than being a specific tool release, it is the extension to FAIRsharing with the new FAIRassist registry which is relevant to the other Commons resources described in this section. + +- Identifier: https://fairsharing.org/ +- Code repository: https://github.com/FAIRsharing/fairsharing.github.io +- Version: Continuous release From fe48ba071876f545d37876dc735a2d34458ac3a6 Mon Sep 17 00:00:00 2001 From: Allyson Lister Date: Tue, 11 Feb 2025 15:36:09 +0000 Subject: [PATCH 14/28] Update resources.rst put back Mark's licences --- docs/commons/resources.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index 3ab2e94..ff74dae 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -25,6 +25,7 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a - Code repository: https://github.com/OSTrails/FAIR-Champion - Version: Release v1 - Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 +- License: MIT FAIR Champion Tests: @@ -35,7 +36,8 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet - Code repository: https://github.com/OSTrails/FAIR-Core-Tests - Version: Release v1 - Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 - +- License: MIT + FOOPS! Test and metric catalogue: --------------------------------- @@ -56,7 +58,8 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam - Code repository: https://github.com/FAIRDataTeam - Version: Docker Image version 16.x - Release: N/A - +- License: MIT + FAIR Data Point Index Proxy: ---------------------------- @@ -67,6 +70,7 @@ An early prototype of a “proxy” service that allows native DCAT records to b - Code repository: https://github.com/OSTrails/FDP-Index-Proxy - Version: Release v1.0.0 - Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 +- License: MIT FAIRsharing Registry: From 9e8acdeba6de6c069497f8de580395e31e8f6058 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Thu, 13 Feb 2025 19:17:58 +0100 Subject: [PATCH 15/28] Added licenses --- docs/commons/resources.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index ff74dae..331cd72 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -15,6 +15,7 @@ The code release includes the vocabularies, definitions, specifications in machi - Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ - Version: 1.0.0 - Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 +- License: CC-BY 4.0 FAIR Champion: @@ -48,6 +49,7 @@ The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies - Code repository: https://github.com/oeg-upm/fair_ontologies - Version: 0.2.0 - Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 +- License: Apache-2.0 FAIR Data Point: From 94c36eb3820bd68ca5034c44f80cd91549032e39 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Mon, 17 Feb 2025 19:18:34 +0100 Subject: [PATCH 16/28] added missing FAIR IF descriptions --- docs/architecture/fair-if.png | Bin 0 -> 112702 bytes docs/architecture/fair_if.rst | 38 ++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 docs/architecture/fair-if.png diff --git a/docs/architecture/fair-if.png b/docs/architecture/fair-if.png new file mode 100644 index 0000000000000000000000000000000000000000..8c89c73f2d04dca70d5382f7d7b877a0ea06ee41 GIT binary patch literal 112702 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

&i48NEL<`Vr>oJoJ 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 z

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 LW*BC$XvhBnZ|0F~ literal 0 HcmV?d00001 diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index c5e82bd..6773679 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -1,6 +1,40 @@ -Architecture: FAIR IF +Architecture: FAIR-IF ===================== +The FAIR Testing Interoperability Framework (FAIR-IF) uses, almost exclusively, existing standards or extensions of standards, such as W3C Data Quality Vocabulary (https://www.w3.org/TR/vocab-dqv/), the W3C Data Catalog vocabulary (https://www.w3.org/TR/vocab-dcat-3/) and the W3C Provenance Ontology (https://www.w3.org/TR/prov-o/). These are employed to build the descriptors for the components that make up the FAIR Testing Reference Model and are described here. While most of these components contribute only indirectly to the Interoperability behaviour of the FAIR-IF, a brief discussion of all of them will simplify understanding how Interoperability is achieved. -*To be specified* +FAIR Reference Model Conceptual Components +****************************************** +Guided by the Compliance Assessment Toolkit [1], we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). + +.. image:: fair-if.png + +Detailed definitions of these components are work in progress as we examine use-cases emerging from the participating Pilots, to ensure that the identified FAIRness Reference Model components are a) complete, and b) match the requirements of the FAIR-IF, and the overall expectations of the OSTrails IF. Briefly, here are the current definitions of the components. + +The three Conceptual-level components involved in the FAIR Reference Model are: + + * Dimensions (using W3C Data Quality Vocabulary dqv:Dimension) - a high-level objective that should be met by digital objects corresponding to one of the FAIR Principles (e.g. R1.1. all digital objects should have a licence). + * Metrics: Narrative description that a Test must wholly implement + * Benchmarks: a narrative definition of how to interpret the Test Result Set resulting from the application of one or more Metrics to a digital object. + +The two Software-level components in the FAIR Reference Model are: + * Tests: A software object or defined manual workflow that examines some aspect of a digital object, and outputs a Test Result (i.e. pass/fail/indeterminate). + * Algorithms: A piece of code or defined manual workflow that implements a Benchmark. + +All these components (excluding Dimensions) have metadata descriptors following a formal model (see the FAIR Test Results formal specification https://w3id.org/ftr/). + +The two data-level components are: + * Test Result: The consequential output from a test. For the first iteration of the OSTrails FAIRness Reference Model, we will require that tests are very precise, and can have only “pass”, “fail”, or “indeterminate” as their possible outcomes. (This decision is subject to change based on experience with using the OSTrails IF). The output will include metadata (e.g. a progress log) that can be used to interpret the provenance behind the output. Aggregations of Test Results are referred to as “Test Result Sets” and have a defined structure. + * Assessment Outcome: The output from an Algorithm, representing the measurement of some Benchmark as a numeric or controlled vocabulary score. + +The final component in the diagram, shown in black in the Figure above, is another software component – the “FAIR Assessment Tool” – that will exist, but its interface and behaviour are defined as part of the OSTrails Implementation Framework rather than the FAIR Reference Model. + +To see the individual metadata descriptors of each of these components we refer the reader to the FAIR test results specification https://w3id.org/ftr/, which describes an OWL ontology, documentation and SHACL shapes to validate minimal test and metric metadata conformance. + +An overview of the resources implementing different aspects of our framework maybe found in the "resources section" (https://docs.ostrails.eu/en/update-restructure/commons/resources.html#) + +Additional information +********************** +Check our deliverables for more information: + * [1] van Lieshout, N., Buys, M., Zamani, T., Rijsselberg, F., & Märkälä, A. (2024). Compliance Assessment Toolkit: Deliverable 2.2 (W. Hugo & W. Steinhoff, Eds.). Zenodo. https://doi.org/10.5281/zenodo.12683218 \ No newline at end of file From ea33e69a26721330a92400c9a742a9c36f402df0 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Mon, 17 Feb 2025 19:20:45 +0100 Subject: [PATCH 17/28] removed weird space --- docs/architecture/fair_if.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index 6773679..0cf682e 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -12,7 +12,6 @@ Guided by the Compliance Assessment Toolkit [1], we have identified the set of d Detailed definitions of these components are work in progress as we examine use-cases emerging from the participating Pilots, to ensure that the identified FAIRness Reference Model components are a) complete, and b) match the requirements of the FAIR-IF, and the overall expectations of the OSTrails IF. Briefly, here are the current definitions of the components. The three Conceptual-level components involved in the FAIR Reference Model are: - * Dimensions (using W3C Data Quality Vocabulary dqv:Dimension) - a high-level objective that should be met by digital objects corresponding to one of the FAIR Principles (e.g. R1.1. all digital objects should have a licence). * Metrics: Narrative description that a Test must wholly implement * Benchmarks: a narrative definition of how to interpret the Test Result Set resulting from the application of one or more Metrics to a digital object. From 25881dc093a83a55df4176d46cc3ae1beac57742 Mon Sep 17 00:00:00 2001 From: TomMiksa Date: Tue, 18 Feb 2025 11:43:55 +0100 Subject: [PATCH 18/28] Tomasz added as author of Architecture description --- docs/architecture/dmp_if.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/architecture/dmp_if.rst b/docs/architecture/dmp_if.rst index a61ca1b..329ec33 100644 --- a/docs/architecture/dmp_if.rst +++ b/docs/architecture/dmp_if.rst @@ -1,3 +1,5 @@ +.. page-authors:: Tomasz Miksa + Architecture: DMP IF ==================== From c7cc3a900eebd72ca03933e067ca6bc585b1937b Mon Sep 17 00:00:00 2001 From: TomMiksa Date: Tue, 18 Feb 2025 11:45:59 +0100 Subject: [PATCH 19/28] Update CONTRIBUTORS.yml --- CONTRIBUTORS.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index 82c0bfa..e0c0123 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -17,4 +17,11 @@ Mark Wilkinson: last_name: Wilkinson github: markwilkinson orcid: 0000-0001-6960-357X - affiliation: Universidad Politécnica de Madrid \ No newline at end of file + affiliation: Universidad Politécnica de Madrid + +Tomasz Miksa: + first_name: Tomasz + last_name: Miksa + github: TomMiksa + orcid: 0000-0002-4929-7875 + affiliation: TU Wien From 8c9ca66081f800b2ea66209d5f89879119fee116 Mon Sep 17 00:00:00 2001 From: TomMiksa Date: Tue, 18 Feb 2025 11:46:47 +0100 Subject: [PATCH 20/28] Update intro.rst Tomasz added as author --- docs/architecture/intro.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst index 40297da..5530bf6 100644 --- a/docs/architecture/intro.rst +++ b/docs/architecture/intro.rst @@ -1,3 +1,5 @@ +.. page-authors:: Tomasz Miksa + Architecture ========================== From 3e147080c1e13cbeafc93b4cef9cf46d761de087 Mon Sep 17 00:00:00 2001 From: TomMiksa Date: Tue, 18 Feb 2025 11:54:07 +0100 Subject: [PATCH 21/28] Update skg_if.rst --- docs/architecture/skg_if.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/architecture/skg_if.rst b/docs/architecture/skg_if.rst index 51bbf1e..ebadac6 100644 --- a/docs/architecture/skg_if.rst +++ b/docs/architecture/skg_if.rst @@ -1,4 +1,16 @@ +.. page-authors:: Tomasz Miksa + Architecture: SKG IF ==================== -*To be specified* +This page introduces the Scientific/Scholarly Knowledge Graph Interoperability Framework (SKG-IF). It outlines its motivation, relation to key elements, and applications in OSTrails. + +The `SKG-IF data model `_ is designed to enhance interoperability among different knowledge graph systems and platforms used in research. It facilitates the exchange and use of data across these systems by defining a shared language and standardised operations. Researchers or end-users are not expected to interact directly with the SKG-IF. Instead, it enables automated workflows and interoperability between services, enhancing the research ecosystem's efficiency and machine-actionability. + +OSTrails SKG-IF is based on the RDA SKG interoperability framework. By providing a standardised approach to modelling a core set of scholarly data, the SKG-IF supports diverse applications involving compatible SKGs, such as combining SKGs to build new ones or exchanging data between SKGs to benefit from each other's construction methods. OSTrails will extend the existing RDA model of SKGs, propose (a mechanism for) model extensions and an API that can be used to enable scientific discovery and assessment. The OSTrails project will do so in the context of, or in close collaboration with, the RDA SKG-IF WG adding a scientific perspective to the previous scholarly one. + +More specifically, SKG-IF data model entities are currently described with a comprehensive set of metadata properties, initially agreed on by the existing SKG community of stakeholders (DataCite, OpenCitation, Crossref, OpenAlex, OpenAIRE Graph), inspired also by existing metadata standards or best practices such as EuroCRIS/CERIF and now the perspective of the scientific communities. The model is agnostic of specific PID schemes or vocabularies, enabling cross-SKG interoperability by agreeing on a common structure and sharing of specific semantics. When PIDs or vocabularies are requested (e.g. resource types), properties require the vocabulary name and the specific value. Finally, the IF adopts JSON-LD, a widely recognised data exchange standard, to ensure seamless data exchange and semantic interoperability.7 + +The work on SKG-IF is performed in the context of RDA, guaranteeing a broad set of stakeholders taking part in the decision making. OSTrails brings to the Working Group the requirements arising by scientific communities and service providers in achieving the project objectives. The project roadmap may, therefore, potentially not always be synced and aligned with the RDA WG’s. To this aim, as described below, in its first year OSTrails has co-designed and strongly contributed to the definition of SKG-IF extensions. Extensions are a mechanism allowing a community to define “customizations” of the SKG-IF core model, such as new entities, new properties of existing entities, or new relationships. Extensions, today part of the SKG-IF framework, can compensate the difference in rhythm, when manifesting, between an RDA WG and project objectives, which are driven by deadlines and deliverables. Starting from interoperability use-cases identified in the project, OSTrails partners have identified (i) which entities of the SKG data model can be adopted to meet their requirements and, when such entities are missing, (ii) the SKG extensions required to fulfil them. + +For more information please refer to: Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 From 24714bbde9931dd1d10a0641e37f18abc5fe81a6 Mon Sep 17 00:00:00 2001 From: John Shepherdson <107628491+john-shepherdson@users.noreply.github.com> Date: Tue, 18 Feb 2025 12:45:21 +0000 Subject: [PATCH 22/28] Update contributing.rst docs: added text, based on CONTRIBUTING.md --- docs/other/contributing.rst | 100 +++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/docs/other/contributing.rst b/docs/other/contributing.rst index 56faa5a..6f3d2f0 100644 --- a/docs/other/contributing.rst +++ b/docs/other/contributing.rst @@ -1,4 +1,102 @@ Contributing Guidelines ======================= +.. contributors:: +Marek Suchanek +John Shepherdson -*To be specified* +Thank you for considering contributing to the OSTrails documentation! We welcome contributions from everyone, regardless of your level of experience. This document outlines the process for contributing to the documentation. + +## Ways of Contributing + +- **Reporting Issues**: If you find a bug in the documentation, please open an issue on the GitHub repository. +- **Suggesting Enhancements**: If you have an idea for improving the documentation, please open an issue on the GitHub repository. +- **Improving the Documentation**: If you would like to improve the documentation, please follow the process outlined below. + +## Issue Reporting + +If you find a bug in the documentation, please [open an issue](https://github.com/ostrails/docs/issues/new/choose) in the GitHub repository. When reporting an issue, please follow the requested information for given issue templates. + +## Documentation + +The documentation is hosted on Read-the-Docs and using standard Sphinx documentation. The documentation is written in reStructuredText (`.rst`) format. It can be compiled locally using Sphinx and viewed in a web browser. + +### Writing Style + +When contributing to the documentation, please follow the following writing style: + +- Use British English. +- Use the active voice. +- Use the present tense. +- Use the imperative mood for commands. + +For more information on ReStructuredText syntax, please refer to the [official documentation](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html). In this documentation, we use `=` underline for headings, `-` underline for subheadings, and `^` underline for subsubheadings. + +We also use the following extensions: + +- `sphinxcontrib.bibtex` for managing bibliographies (see [docs](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/)) +- `sphinxcontrib.openapi` for rendering OpenAPI specifications (see [docs](https://sphinxcontrib-openapi.readthedocs.io/)) + +All bibliographical references should be added to the [`references.bib`](docs/references.bib) file in the `docs` directory. A record need to contain all required fields according to the [BibTeX format](https://www.bibtex.com/e/entry-types/). + +The code style is captured using [EditorConfig](https://editorconfig.org/), see [.editorconfig](.editorconfig) file. Please ensure that your editor supports EditorConfig. It is also checked using CI together with the absence of warnings. + +### Building the Documentation + +First, install the required dependencies (preferably in a virtual environment): + +```bash +python -m venv venv +source venv/bin/activate + +pip install -r requirements.txt +``` + +Then, you can build the documentation using the following command: + +```bash +cd docs +make html +``` + +Once built, you can view the documentation by opening the `index.html` file in the `_build/html` directory in a web browser. + +## Way of Working + +The following part describes the way of working when contributing to the documentation. Always also comply to the [Code of Conduct](./CODE_OF_CONDUCT.md) when contributing. + +### Commit Messages + +Please follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification when writing commit messages. This will help us to automatically generate the changelog. + +For instance, the following commit message: + +``` +feat: add new extension to the documentation +docs: update framework general description +deps: update dependencies +fix: correct typos +``` + +### Branching and Pull Requests + +When contributing to the documentation, please follow these steps: + +1. Fork the repository (if not in the OSTrails organisation). +2. Create a new branch for your changes (base = `update-restructure`). +3. Make your changes and commit them. +4. Push your changes. +5. Open a pull request to the `update-restructure` branch of the main repository. + +### Crediting Contributors + +We will credit all contributors in the documentation. If you would like to be credited, please add your name and related information to the [`CONTRIBUTORS.yml`](./CONTRIBUTORS.yml) file. + +Then, you can add your name to the list of contributors for a specific page: + +```rst +Page Title +========== + +.. contributors:: + Jane Smith +``` From 13adc3f8d33f9d27787203a6c8ce5c6331ff1878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Tue, 18 Feb 2025 18:46:31 +0100 Subject: [PATCH 23/28] Fix code style and RST formatting --- CONTRIBUTORS.yml | 11 +- docs/CHANGELOG.md | 47 ++++ docs/LICENSE | 21 ++ docs/README.md | 438 ++++++++++++++++++++++++++++++++++ docs/architecture/dmp_if.rst | 38 +-- docs/architecture/fair_if.rst | 37 +-- docs/architecture/intro.rst | 44 ++-- docs/architecture/skg_if.rst | 13 +- docs/commons/intro.rst | 6 +- docs/commons/resources.rst | 94 ++++---- docs/other/contributing.rst | 106 ++++---- 11 files changed, 697 insertions(+), 158 deletions(-) create mode 100644 docs/CHANGELOG.md create mode 100644 docs/LICENSE create mode 100644 docs/README.md diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index e0c0123..416de6c 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -1,10 +1,10 @@ -Marek Suchánek: +Marek Suchanek: first_name: Marek last_name: Suchánek github: MarekSuchanek orcid: 0000-0001-7525-9218 affiliation: CTU in Prague - + Daniel Garijo: first_name: Daniel last_name: Garijo @@ -25,3 +25,10 @@ Tomasz Miksa: github: TomMiksa orcid: 0000-0002-4929-7875 affiliation: TU Wien + +John Shepherdson: + first_name: John + last_name: Shepherdson + github: john-shepherdson + orcid: 0000-0002-4402-9644 + affiliation: CESSDA ERIC diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..f7f816a --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +## [3.2.0](https://github.com/editorconfig-checker/editorconfig-checker/compare/v3.1.2...v3.2.0) (2025-01-25) + + +### Features + +* add support for env var NO_COLOR ([#429](https://github.com/editorconfig-checker/editorconfig-checker/issues/429)) ([9135f53](https://github.com/editorconfig-checker/editorconfig-checker/commit/9135f531e762ad4c02f4bf45f03888771773da56)) +* only output "0 errors found" when verbose output is enabled ([#423](https://github.com/editorconfig-checker/editorconfig-checker/issues/423)) ([1d29a8b](https://github.com/editorconfig-checker/editorconfig-checker/commit/1d29a8b16b4cde8d46f80db29e60330c5bd16095)) + + +### Bug Fixes + +* improve default excludes ([#427](https://github.com/editorconfig-checker/editorconfig-checker/issues/427)) ([d0cbd25](https://github.com/editorconfig-checker/editorconfig-checker/commit/d0cbd250caa46a07994b6161ccf2bb4910571a23)) + +## [3.1.2](https://github.com/editorconfig-checker/editorconfig-checker/compare/v3.1.1...v3.1.2) (2025-01-10) + + +### Bug Fixes + +* provide both .tar.gz as well as .zip archives ([#416](https://github.com/editorconfig-checker/editorconfig-checker/issues/416)) ([00e9890](https://github.com/editorconfig-checker/editorconfig-checker/commit/00e9890847982b2503ec3a11ff539bf2ac4c34c6)), closes [#415](https://github.com/editorconfig-checker/editorconfig-checker/issues/415) + +## [3.1.1](https://github.com/editorconfig-checker/editorconfig-checker/compare/v3.1.0...v3.1.1) (2025-01-08) + + +### Bug Fixes + +* dockerfile expected binary at /, not /usr/bin/ [#410](https://github.com/editorconfig-checker/editorconfig-checker/issues/410) ([#411](https://github.com/editorconfig-checker/editorconfig-checker/issues/411)) ([2c82197](https://github.com/editorconfig-checker/editorconfig-checker/commit/2c821979c0b3ea291f65ec813cae3fa265603528)) + +## [3.1.0](https://github.com/editorconfig-checker/editorconfig-checker/compare/v3.0.3...v3.1.0) (2025-01-06) + + +### Features + +* add zip version when compressing all binaries ([#321](https://github.com/editorconfig-checker/editorconfig-checker/issues/321)) ([#362](https://github.com/editorconfig-checker/editorconfig-checker/issues/362)) ([f1bb625](https://github.com/editorconfig-checker/editorconfig-checker/commit/f1bb625f2553952d4d8c72e3f97d17417f0c1ef7)) +* consolidate adjacent error messages ([#360](https://github.com/editorconfig-checker/editorconfig-checker/issues/360)) ([cf4ae1c](https://github.com/editorconfig-checker/editorconfig-checker/commit/cf4ae1ccede331b2aa1b115f1de5257737de7eef)) +* editorconfig-checker-disable-next-line ([#363](https://github.com/editorconfig-checker/editorconfig-checker/issues/363)) ([6116ec6](https://github.com/editorconfig-checker/editorconfig-checker/commit/6116ec6685b33652e9e25def9b8897ed4b015c7d)) +* provide Codeclimate compatible report fromat ([#367](https://github.com/editorconfig-checker/editorconfig-checker/issues/367)) ([282c315](https://github.com/editorconfig-checker/editorconfig-checker/commit/282c315bd1c48f49cc1328de36e2ba4433c50249)) +* support `.editorconfig-checker.json` config ([#375](https://github.com/editorconfig-checker/editorconfig-checker/issues/375)) ([cb0039c](https://github.com/editorconfig-checker/editorconfig-checker/commit/cb0039cfe68a11139011bcffe84b8ff62b3209bb)) + + +### Bug Fixes + +* actually use the correct end marker ([#405](https://github.com/editorconfig-checker/editorconfig-checker/issues/405)) ([3c03499](https://github.com/editorconfig-checker/editorconfig-checker/commit/3c034994cba21db7babd33672a0d26184ff88255)) +* add `.ecrc` deprecation warning ([#389](https://github.com/editorconfig-checker/editorconfig-checker/issues/389)) ([d33b81c](https://github.com/editorconfig-checker/editorconfig-checker/commit/d33b81cc71c2eb740dd3e1c00f07dbc430b89087)) +* this release-please marker ([#403](https://github.com/editorconfig-checker/editorconfig-checker/issues/403)) ([617c6d4](https://github.com/editorconfig-checker/editorconfig-checker/commit/617c6d44b5a8668de16bf67038dd5930e01c074e)) +* typo in config, `SpacesAftertabs` => `SpacesAfterTabs` ([#386](https://github.com/editorconfig-checker/editorconfig-checker/issues/386)) ([25e3542](https://github.com/editorconfig-checker/editorconfig-checker/commit/25e3542ee45b0bd5cbdd450ba8eebee6ad3bba43)) diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 0000000..5420ac5 --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Max Strübing + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..67b45ac --- /dev/null +++ b/docs/README.md @@ -0,0 +1,438 @@ +# editorconfig-checker + +Buy Me A Coffee + +[![ci](https://github.com/editorconfig-checker/editorconfig-checker/actions/workflows/ci.yml/badge.svg)](https://github.com/editorconfig-checker/editorconfig-checker/actions/workflows/ci.yml) +[![codecov](https://codecov.io/gh/editorconfig-checker/editorconfig-checker/branch/main/graph/badge.svg)](https://codecov.io/gh/editorconfig-checker/editorconfig-checker) +[![Hits-of-Code](https://hitsofcode.com/github/editorconfig-checker/editorconfig-checker?branch=main&label=Hits-of-Code)](https://hitsofcode.com/github/editorconfig-checker/editorconfig-checker/view?branch=main&label=Hits-of-Code) +[![Go Report Card](https://goreportcard.com/badge/github.com/editorconfig-checker/editorconfig-checker/v3)](https://goreportcard.com/report/github.com/editorconfig-checker/editorconfig-checker/v3) + +![Logo](docs/logo.png) + +1. [What?](#what) +2. [Quickstart](#quickstart) +3. [Installation](#installation) +4. [Usage](#usage) +5. [Configuration](#configuration) +6. [Excluding](#excluding) + 1. [Excluding Lines](#excluding-lines) + 2. [Excluding Blocks](#excluding-blocks) + 3. [Excluding Paths](#excluding-paths) + 1. [Inline](#inline) + 2. [Default Excludes](#default-excludes) + 3. [Ignoring Default Excludes](#ignoring-default-excludes) + 4. [Manually Excluding](#manually-excluding) + 1. [via configuration](#via-configuration) + 2. [via arguments](#via-arguments) +7. [Docker](#docker) +8. [Continuous Integration](#continuous-integration) +9. [Support](#support) +10. [Contributing](#contributing) +11. [Semantic Versioning Policy](#semantic-versioning-policy) + +## What? + +![Example Screenshot](docs/screenshot.png) + +This is a tool to check if your files consider your `.editorconfig` rules. +Most tools—like linters, for example—only test one filetype and need an extra configuration. +This tool only needs your `.editorconfig` to check all files. + +If you don't know about editorconfig already you can read about it here: [editorconfig.org](https://editorconfig.org/). + +Currently, implemented editorconfig features are: + +- `end_of_line` +- `insert_final_newline` +- `trim_trailing_whitespace` +- `indent_style` +- `indent_size` +- `max_line_length` + +Unsupported features are: + +- `charset` + +## Quickstart + + +```shell +VERSION="v3.2.0" +OS="linux" +ARCH="amd64" +curl -O -L -C - https://github.com/editorconfig-checker/editorconfig-checker/releases/download/$VERSION/ec-$OS-$ARCH.tar.gz && \ +tar xzf ec-$OS-$ARCH.tar.gz && \ +./bin/ec-$OS-$ARCH +``` + + +## Installation + +Grab a binary from the [release page](https://github.com/editorconfig-checker/editorconfig-checker/releases). + +If you have go installed you can run `go get github.com/editorconfig-checker/editorconfig-checker/v3` +and run `make build` inside the project folder. +This will place a binary called `ec` into the `bin` directory. + +If you are using Arch Linux, you can use [pacman](https://wiki.archlinux.org/title/Pacman) to install from [extra repository](https://archlinux.org/packages/extra/x86_64/editorconfig-checker/): + +```shell +pacman -S editorconfig-checker +``` + +Also, development (VCS) package is available in the [AUR](https://aur.archlinux.org/packages/editorconfig-checker-git): + +```shell +# editorconfig-checker-git + +# i.e. +paru -S editorconfig-checker-git +``` + +If Go 1.16 or greater is installed, you can also install it globally via `go install`: + +```shell +go install github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@latest +``` + +## Usage + +```txt +USAGE: + -config string + config + -debug + print debugging information + -disable-end-of-line + disables the trailing whitespace check + -disable-indent-size + disables only the indent-size check + -disable-indentation + disables the indentation check + -disable-insert-final-newline + disables the final newline check + -disable-trim-trailing-whitespace + disables the trailing whitespace check + -dry-run + show which files would be checked + -exclude string + a regex which files should be excluded from checking - needs to be a valid regular expression + -format + specifies the output format, see "Formats" below for more information + -h print the help + -help + print the help + -ignore-defaults + ignore default excludes + -init + creates an initial configuration + -no-color + disables printing color + -color + enables printing color + -v print debugging information + -verbose + print debugging information + -version + print the version number +``` + +If you run this tool from a repository root it will check all files which are added to the git repository and are text files. If the tool isn't able to determine a file type it will be added to be checked too. + +If you run this tool from a normal directory it will check all files which are text files. If the tool isn't able to determine a file type it will be added to be checked too. + +### Formats + +The following output formats are supported: + +- **default**: Plain text, human readable output.
+ ```text + : + -: + ``` +- **gcc**: GCC compatible output. Useful for editors that support compiling and showing syntax errors.
+ `::: : ` +- **github-actions**: The format used by GitHub Actions
+ `::error file=,line=,endLine=::` +- **codeclimate**: The [Code Climate](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types) json format used for [custom quality reports](https://docs.gitlab.com/ee/ci/testing/code_quality.html#implement-a-custom-tool) in GitLab CI + ```json + [ + { + "check_name": "editorconfig-checker", + "description": "Wrong indent style found (tabs instead of spaces)", + "fingerprint": "e87a958a3960d60a11d4b49c563cccd2", + "severity": "minor", + "location": { + "path": ".vscode/extensions.json", + "lines": { + "begin": 2, + "end": 2 + } + } + } + ] + ``` + +## Configuration + +The configuration is done via arguments or it will take the first config file found with the following file names: + +- `.editorconfig-checker.json` +- `.ecrc` (deprecated filename, soon unsupported) + +A sample configuration file can look like this and will be used from your current working directory if not specified via the `--config` argument: + +```json +{ + "Verbose": false, + "Debug": false, + "IgnoreDefaults": false, + "SpacesAfterTabs": false, + "NoColor": false, + "Exclude": [], + "AllowedContentTypes": [], + "PassedFiles": [], + "Disable": { + "EndOfLine": false, + "Indentation": false, + "IndentSize": false, + "InsertFinalNewline": false, + "TrimTrailingWhitespace": false, + "MaxLineLength": false + } +} +``` + +You can set any of the options under the `"Disable"` section to `true` to disable those particular checks. + +You could also specify command line arguments, and they will get merged with the configuration file. The command line arguments have a higher precedence than the configuration. + +You can create a configuration with the `init`-flag. If you specify a `config`-path it will be created there. + +By default, the allowed_content_types are: + +1. `text/` (matches `text/plain`, `text/html`, etc.) +1. `application/ecmascript` +1. `application/json` +1. `application/x-ndjson` +1. `application/xml` +1. `+json` (matches `application/geo+json`, etc.) +1. `+xml` (matches `application/rss+xml`, etc.) +1. `application/octet-stream` + +`application/octet-stream` is needed as a fallback when no content type could be determined. You can add additional accepted content types with the `allowed_content_types` key. But the default ones don't get removed. + +## Excluding + +### Excluding Lines + +You can exclude single lines inline. To do that you need a comment on that line that says: `editorconfig-checker-disable-line`. + +```javascript +const myTemplateString = ` + first line + wrongly indented line because it needs to be` // editorconfig-checker-disable-line +``` + +Alternatively, you can use `editorconfig-checker-disable-next-line` to skip the line that comes after this comment. +This modifier is present to improve readability, or because your sometimes have no other choice because of your own/language constraints. + +```javascript +// editorconfig-checker-disable-next-line used because blah blah blah what ever the reason blah +const myTemplateString = `a line that is (...) longer (...) than ... usual` // or with a very long inline comment +``` + +Please note that using `editorconfig-checker-disable-next-line` has only an effect on the next line, so it will report if the line where you added the modifier doesn't comply. + +### Excluding Blocks + +To temporarily disable all checks, add a comment containing `editorconfig-checker-disable`. Re-enable with a comment containing `editorconfig-checker-enable` + +```javascript +// editorconfig-checker-disable +const myTemplateString = ` + first line + wrongly indented line because it needs to be +` +// editorconfig-checker-enable +``` + +### Excluding Paths + +You can exclude paths from being checked in several ways: + +- ignoring a file by documenting it inside the to-be-excluded file +- adding a regex matching the path to the [configuration file](#configuration) +- passing a regex matching the path as argument to `--exclude` + +All these excludes are used in addition to the [default excludes](#default-excludes), unless you [opt out of them](#ignoring-default-excludes). + +If you want to see which files would be checked without checking them you can pass the `--dry-run` flag. + +Note that while `--dry-run` might output absolute paths, the regular expression you write must match the filenames using relative paths from where editorconfig-checker is used. This becomes especially relevant if you need to anchor your regular expression in order to only match files in the top level your checked directory. + +#### Inline + +If you want to exclude a file inline you need a comment on the first line of the file that contains: `editorconfig-checker-disable-file` + +```haskell +-- editorconfig-checker-disable-file +add :: Int -> Int -> Int +add x y = + let result = x + y -- falsy indentation would not report + in result -- falsy indentation would not report +``` + +#### Default Excludes + +If you choose to [ignore them](#ignoring-default-excludes), these paths are excluded automatically: + +```txt +"\\.git[\\/]", +"[\\/]node_modules[\\/]", +"^\\.yarn/", +"^yarn\\.lock$", +"^package-lock\\.json$", +"^composer\\.lock$", +"^Cargo\\.lock$", +"^Gemfile\\.lock$", +"^\\.pnp\\.cjs$", +"^\\.pnp\\.js$", +"^\\.pnp\\.loader\\.mjs$", +"\\.snap$", +"\\.otf$", +"\\.woff$", +"\\.woff2$", +"\\.eot$", +"\\.ttf$", +"\\.gif$", +"\\.png$", +"\\.jpg$", +"\\.jpeg$", +"\\.webp$", +"\\.avif$", +"\\.pnm$", +"\\.pbm$", +"\\.pgm$", +"\\.ppm$", +"\\.mp4$", +"\\.wmv$", +"\\.svg$", +"\\.ico$", +"\\.bak$", +"\\.bin$", +"\\.pdf$", +"\\.zip$", +"\\.gz$", +"\\.tar$", +"\\.7z$", +"\\.bz2$", +"\\.log$", +"\\.patch$", +"\\.css\\.map$", +"\\.js\\.map$", +"min\\.css$", +"min\\.js$", +``` + +#### Ignoring Default Excludes + +If you either set `IgnoreDefaults` to `true` or pass the `-ignore-defaults` commandline switch, the [default excludes](#default-excludes) will be ignored entirely. + +#### Manually Excluding + +##### via configuration + +In your [configuration file](#configuration) you can exclude files with the `"exclude"` key which takes an array of regular expressions. +This will get merged with the default excludes (if not [ignored](#ignoring-default-excludes)). You should remember to escape your regular expressions correctly. + +A [configuration file](#configuration) which would ignore all test files and all Markdown files can look like this: + +```json +{ + "Verbose": false, + "IgnoreDefaults": false, + "Exclude": ["testfiles", "\\.md$"], + "SpacesAfterTabs": false, + "Disable": { + "EndOfLine": false, + "Indentation": false, + "IndentSize": false, + "InsertFinalNewline": false, + "TrimTrailingWhitespace": false, + "MaxLineLength": false + } +} +``` + +##### via arguments + +If you want to play around how the tool would behave you can also pass the `--exclude` argument to the binary. This will accept a regular expression as well. The argument given will be added to the excludes as defined by your [configuration file](#configuration) (respecting both its [`Exclude`](#via-configuration) and [`IgnoreDefaults`](#ignoring-default-excludes) settings). + +For example: `ec --exclude node_modules` + +## Docker + +You are able to run this tool inside a Docker container. +To do this you need to have Docker installed and run this command in your repository root which you want to check: +`docker run --rm --volume=$PWD:/check mstruebing/editorconfig-checker` + +Docker Hub: [mstruebing/editorconfig-checker](https://hub.docker.com/r/mstruebing/editorconfig-checker) + +## Continuous Integration + +### Mega-Linter + +Instead of installing and configuring `editorconfig-checker` and all other linters in your project CI workflows (GitHub Actions & others), you can use [Mega-Linter](https://megalinter.io/latest/) which does all that for you with a single [assisted installation](https://megalinter.io/latest/install-assisted/). + +Mega-Linter embeds [editorconfig-checker](https://megalinter.io/latest/descriptors/editorconfig_editorconfig_checker/) by default in all its [flavors](https://megalinter.io/latest/flavors/), meaning that it will be run at each commit or Pull Request to detect any issue related to `.editorconfig`. + +If you want to use only `editorconfig-checker` and not the 70+ other linters, you can use the following `.mega-linter.yml` configuration file: + +```yaml +ENABLE: + - EDITORCONFIG +``` + +### GitLab CI + +The [ss-open/ci/recipes project](https://gitlab.com/ss-open/ci/recipes) offers a ready to use lint job integrating editorconfig-checker. + +- Main documentation: +- Editorconfig job specific documentation: + +## Support + +If you have any questions, suggestions, need a wrapper for a programming language or just want to chat join #editorconfig-checker on freenode(IRC). +If you don't have an IRC-client set up you can use the [freenode webchat](https://webchat.freenode.net/?channels=editorconfig-checker). + +## Contributing + +Anyone can help to improve the project, submit a Feature Request, a bug report or even correct a spelling mistake. + +The steps to contribute can be found in the [CONTRIBUTING.md](./CONTRIBUTING.md) file. + +## Semantic Versioning Policy + +**editorconfig-checker** adheres to [Semantic Versioning](https://semver.org/) for releases. + +However, as it is a code quality tool, it's not always clear when a minor or major version bump occurs. The following rules are used to determine the version bump: + +- Patch release (1.0.x -> 1.0.y) + - Updates to output formats (error messages, logs, ...). + - Performance improvements which doesn't affect behavior. + - Build process changes (e.g., updating dependencies, updating `Dockerfile`, ...). + - Reverts (reverting a previous commit). + - Bug fixes which result in **editorconfig-checker** reporting less linting errors (removing "false-positive" linting errors). +- Minor release (1.x.0 -> 1.y.0) + - Adding new [configuration options](#configuration), including new CLI flags. + - Adding new [path to exclude by default](#default-excludes). + - Adding new [output formats](#formats). + - Supporting a new [editorconfig](https://editorconfig.org/) property (e.g: `insert_final_newline`, `indent_size`, ...). + - Any new feature which doesn't break existing behavior. +- Major release (x.0.0 -> y.0.0) + - Removal of a [configuration](#configuration) option. + - Removal of an [output format](#formats). + - Removal of a [path to exclude by default](#default-excludes). + - Removal of support for an [editorconfig](https://editorconfig.org/) property. + - Bug fixes, which result in **editorconfig-checker** reporting more linting errors, because the previous behavior was incorrect according to the [editorconfig specification](https://editorconfig.org/). diff --git a/docs/architecture/dmp_if.rst b/docs/architecture/dmp_if.rst index 329ec33..baf8869 100644 --- a/docs/architecture/dmp_if.rst +++ b/docs/architecture/dmp_if.rst @@ -1,33 +1,35 @@ -.. page-authors:: Tomasz Miksa +.. page-authors:: + Tomasz Miksa Architecture: DMP IF ==================== -An **interoperability framework** refers to a set of guidelines, standards, and protocols that ensure the ability of different systems, applications, or organizations to work together effectively, exchanging data and functions seamlessly despite differences in their underlying technologies. The framework typically addresses the technical, semantic, and organizational aspects needed to facilitate collaboration and integration between disparate systems. +An **interoperability framework** refers to a set of guidelines, standards, and protocols that ensure the ability of different systems, applications, or organizations to work together effectively, exchanging data and functions seamlessly despite differences in their underlying technologies. The framework typically addresses the technical, semantic, and organizational aspects needed to facilitate collaboration and integration between disparate systems. The **DMP-IF** consists of: - * RDA DMP **common standard** for machine-actionable DMPs (DCS), - * OSTrails **application profile** for maDMPs, - * maDMP Application Programming Interface (**API**). + * RDA DMP **common standard** for machine-actionable DMPs (DCS), + * OSTrails **application profile** for maDMPs, + * maDMP Application Programming Interface (**API**). -The DMP-IF follows this definition and is designed with DMP Platforms in mind but can be used by any service or tool that exchanges maDMPs. The IF does not prescribe internal organisation of services, e.g. their architecture or how they represent information internally. The IF focuses on how the information is exchanged with other services, i.e. defines concepts and models to represent the information, as well as actions that can be performed to get or modify information in a service implementing the DMP-IF. For example, listing all datasets described by a DMP, including their identifiers and licences, is performed in a unified way, independent of the underlying implementation. The DMP-IF addresses the technical and semantic layers only. +The DMP-IF follows this definition and is designed with DMP Platforms in mind but can be used by any service or tool that exchanges maDMPs. The IF does not prescribe internal organisation of services, e.g. their architecture or how they represent information internally. The IF focuses on how the information is exchanged with other services, i.e. defines concepts and models to represent the information, as well as actions that can be performed to get or modify information in a service implementing the DMP-IF. For example, listing all datasets described by a DMP, including their identifiers and licences, is performed in a unified way, independent of the underlying implementation. The DMP-IF addresses the technical and semantic layers only. -The **common standard** is an RDA recommendation. It defines a minimum set of concepts used to model information in DMPs common for most use cases. The **application profile** builds on top of the common standard. It provides additional concepts and constraints necessary to support the interactions identified in the pathways and reference architecture. Thus, it provides more concepts and more constraints that reflect the needs of OSTrails as whole and eventually EOSC. While both focus on establishing a common language on how information contained in DMPs is expressed in a machine-actionable way, the API provides a set of methods that can be used to perform specific actions on DMPs. The structure of messages exchanged with the use of the API is based on the common language defined by the common standard and the application profile. +The **common standard** is an RDA recommendation. It defines a minimum set of concepts used to model information in DMPs common for most use cases. The **application profile** builds on top of the common standard. It provides additional concepts and constraints necessary to support the interactions identified in the pathways and reference architecture. Thus, it provides more concepts and more constraints that reflect the needs of OSTrails as whole and eventually EOSC. While both focus on establishing a common language on how information contained in DMPs is expressed in a machine-actionable way, the API provides a set of methods that can be used to perform specific actions on DMPs. The structure of messages exchanged with the use of the API is based on the common language defined by the common standard and the application profile. -The DMP-IF is **relevant to software engineers and service operators** who want to standardise how information on DMPs is exchanged. End-users, i.e. researchers, are not supposed to be aware of the DMP-IF. The DMP-IF facilitates the reuse and exchange of information so that typical RDM tasks can be automated, and DMPs are a place where all the information relevant to data management, e.g. type of data, storage location, access permissions, etc., are kept. DMP platforms should thus become a source of up-to-date information for other services that depend on them, e.g. researchers involved in a project described by a DMP should automatically get access to relevant equipment and repositories described by the DMP. As a result, creating the DMP should primarily benefit researchers by facilitating data management of their typical tasks and become less a one-time exercise to meet formal requirements. +The DMP-IF is **relevant to software engineers and service operators** who want to standardise how information on DMPs is exchanged. End-users, i.e. researchers, are not supposed to be aware of the DMP-IF. The DMP-IF facilitates the reuse and exchange of information so that typical RDM tasks can be automated, and DMPs are a place where all the information relevant to data management, e.g. type of data, storage location, access permissions, etc., are kept. DMP platforms should thus become a source of up-to-date information for other services that depend on them, e.g. researchers involved in a project described by a DMP should automatically get access to relevant equipment and repositories described by the DMP. As a result, creating the DMP should primarily benefit researchers by facilitating data management of their typical tasks and become less a one-time exercise to meet formal requirements. -**Adopting the DMP-IF** can be performed gradually and tailored to the needs of the specific use case. Yet, full interoperability can only be achieved when the specific service implements the complete maDMP API. This is because the API reflects the community agreement on the common language used to describe the DMP contents and makes technical decisions that leave less room for interpretation, e.g. choice of communication protocol, such as HTTP, and ways to serialise the exchanged messages, for instance, using JSON. +**Adopting the DMP-IF** can be performed gradually and tailored to the needs of the specific use case. Yet, full interoperability can only be achieved when the specific service implements the complete maDMP API. This is because the API reflects the community agreement on the common language used to describe the DMP contents and makes technical decisions that leave less room for interpretation, e.g. choice of communication protocol, such as HTTP, and ways to serialise the exchanged messages, for instance, using JSON. Ongoing and future work -****** -Together with the RDA DMP Common Standards WG we perform the maintenance of the recommendation. The RDA DMP Common Standards working group will be able to accept only minor and small changes to the recommendation. These will be mostly refinements bringing clarity or changes that are backward-compatible. As a result, we will have a stable and up-to-date set of concepts shared across the whole DMP community. Any major changes that could considerably influence the design of the recommendation need to be performed by a new working group – this is an RDA requirement. For this reason, OSTrails develops the OSTrails application profile to incorporate bigger changes that also cover the project-specific needs, which may not be shared across the whole RDA community. +*********************** -By defining one application profile, we want to mitigate a situation when every use case owner defines their own set of extensions. For example, we will define a set of concepts that support the requirements of most funders instead of having extensions per funder. This should prevent situations in which overlapping concepts are represented differently, and hence, the interoperability is lower. While the DCS is an official recommendation of RDA and must leave many decisions open, e.g., which type of controlled vocabulary to use for identifier types, the OSTrails application profile imposes additional constraints on the RDA recommendation that are relevant within the OSTrails and EOSC contexts. For example, the application profile may have stricter requirements regarding the use of persistent identifiers (rather than URLs) or may require the use of specific controlled vocabularies. +Together with the RDA DMP Common Standards WG we perform the maintenance of the recommendation. The RDA DMP Common Standards working group will be able to accept only minor and small changes to the recommendation. These will be mostly refinements bringing clarity or changes that are backward-compatible. As a result, we will have a stable and up-to-date set of concepts shared across the whole DMP community. Any major changes that could considerably influence the design of the recommendation need to be performed by a new working group – this is an RDA requirement. For this reason, OSTrails develops the OSTrails application profile to incorporate bigger changes that also cover the project-specific needs, which may not be shared across the whole RDA community. -The broader objectives of the maDMP API are as follows: - * Enable interoperability and interchangeability of DMP platforms: Ensure that any DMP tool can be utilised in diverse contexts without compatibility concerns. - * Reduce reliance on static text documents: Shift away from narrative DMP formats, such as PDFs, towards enhanced use of persistent identifiers where appropriate. - * Promote the reuse of information from DMPs: Facilitate the transfer of information from DMPs to inform and drive actions within other RDM systems. - * Enhance the quality and timeliness of DMPs: Improve accuracy by sourcing data directly from systems where RDM activities are conducted. +By defining one application profile, we want to mitigate a situation when every use case owner defines their own set of extensions. For example, we will define a set of concepts that support the requirements of most funders instead of having extensions per funder. This should prevent situations in which overlapping concepts are represented differently, and hence, the interoperability is lower. While the DCS is an official recommendation of RDA and must leave many decisions open, e.g., which type of controlled vocabulary to use for identifier types, the OSTrails application profile imposes additional constraints on the RDA recommendation that are relevant within the OSTrails and EOSC contexts. For example, the application profile may have stricter requirements regarding the use of persistent identifiers (rather than URLs) or may require the use of specific controlled vocabularies. -This approach aims to establish a robust framework for seamless integration and automation in the RDM ecosystem, significantly advancing the utility and efficiency of DMPs. The maDMP API does not replace existing APIs offered by DMP Platforms. There are still operations that are specific to each platform. The maDMP API standardises typical interactions with maDMPs in a similar fashion as the DCS, which represents consensus on most common DMP elements in most settings, but not all of them. +The broader objectives of the maDMP API are as follows: + * Enable interoperability and interchangeability of DMP platforms: Ensure that any DMP tool can be utilised in diverse contexts without compatibility concerns. + * Reduce reliance on static text documents: Shift away from narrative DMP formats, such as PDFs, towards enhanced use of persistent identifiers where appropriate. + * Promote the reuse of information from DMPs: Facilitate the transfer of information from DMPs to inform and drive actions within other RDM systems. + * Enhance the quality and timeliness of DMPs: Improve accuracy by sourcing data directly from systems where RDM activities are conducted. + +This approach aims to establish a robust framework for seamless integration and automation in the RDM ecosystem, significantly advancing the utility and efficiency of DMPs. The maDMP API does not replace existing APIs offered by DMP Platforms. There are still operations that are specific to each platform. The maDMP API standardises typical interactions with maDMPs in a similar fashion as the DCS, which represents consensus on most common DMP elements in most settings, but not all of them. diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index 0cf682e..b8a2fe7 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -1,39 +1,40 @@ Architecture: FAIR-IF ===================== -The FAIR Testing Interoperability Framework (FAIR-IF) uses, almost exclusively, existing standards or extensions of standards, such as W3C Data Quality Vocabulary (https://www.w3.org/TR/vocab-dqv/), the W3C Data Catalog vocabulary (https://www.w3.org/TR/vocab-dcat-3/) and the W3C Provenance Ontology (https://www.w3.org/TR/prov-o/). These are employed to build the descriptors for the components that make up the FAIR Testing Reference Model and are described here. While most of these components contribute only indirectly to the Interoperability behaviour of the FAIR-IF, a brief discussion of all of them will simplify understanding how Interoperability is achieved. +The FAIR Testing Interoperability Framework (FAIR-IF) uses, almost exclusively, existing standards or extensions of standards, such as W3C Data Quality Vocabulary (https://www.w3.org/TR/vocab-dqv/), the W3C Data Catalog vocabulary (https://www.w3.org/TR/vocab-dcat-3/) and the W3C Provenance Ontology (https://www.w3.org/TR/prov-o/). These are employed to build the descriptors for the components that make up the FAIR Testing Reference Model and are described here. While most of these components contribute only indirectly to the Interoperability behaviour of the FAIR-IF, a brief discussion of all of them will simplify understanding how Interoperability is achieved. FAIR Reference Model Conceptual Components ****************************************** -Guided by the Compliance Assessment Toolkit [1], we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). + +Guided by the Compliance Assessment Toolkit [1], we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). .. image:: fair-if.png -Detailed definitions of these components are work in progress as we examine use-cases emerging from the participating Pilots, to ensure that the identified FAIRness Reference Model components are a) complete, and b) match the requirements of the FAIR-IF, and the overall expectations of the OSTrails IF. Briefly, here are the current definitions of the components. +Detailed definitions of these components are work in progress as we examine use-cases emerging from the participating Pilots, to ensure that the identified FAIRness Reference Model components are a) complete, and b) match the requirements of the FAIR-IF, and the overall expectations of the OSTrails IF. Briefly, here are the current definitions of the components. -The three Conceptual-level components involved in the FAIR Reference Model are: - * Dimensions (using W3C Data Quality Vocabulary dqv:Dimension) - a high-level objective that should be met by digital objects corresponding to one of the FAIR Principles (e.g. R1.1. all digital objects should have a licence). - * Metrics: Narrative description that a Test must wholly implement - * Benchmarks: a narrative definition of how to interpret the Test Result Set resulting from the application of one or more Metrics to a digital object. +The three Conceptual-level components involved in the FAIR Reference Model are: + * Dimensions (using W3C Data Quality Vocabulary dqv:Dimension) - a high-level objective that should be met by digital objects corresponding to one of the FAIR Principles (e.g. R1.1. all digital objects should have a licence). + * Metrics: Narrative description that a Test must wholly implement + * Benchmarks: a narrative definition of how to interpret the Test Result Set resulting from the application of one or more Metrics to a digital object. -The two Software-level components in the FAIR Reference Model are: - * Tests: A software object or defined manual workflow that examines some aspect of a digital object, and outputs a Test Result (i.e. pass/fail/indeterminate). - * Algorithms: A piece of code or defined manual workflow that implements a Benchmark. +The two Software-level components in the FAIR Reference Model are: + * Tests: A software object or defined manual workflow that examines some aspect of a digital object, and outputs a Test Result (i.e. pass/fail/indeterminate). + * Algorithms: A piece of code or defined manual workflow that implements a Benchmark. -All these components (excluding Dimensions) have metadata descriptors following a formal model (see the FAIR Test Results formal specification https://w3id.org/ftr/). +All these components (excluding Dimensions) have metadata descriptors following a formal model (see the FAIR Test Results formal specification https://w3id.org/ftr/). -The two data-level components are: - * Test Result: The consequential output from a test. For the first iteration of the OSTrails FAIRness Reference Model, we will require that tests are very precise, and can have only “pass”, “fail”, or “indeterminate” as their possible outcomes. (This decision is subject to change based on experience with using the OSTrails IF). The output will include metadata (e.g. a progress log) that can be used to interpret the provenance behind the output. Aggregations of Test Results are referred to as “Test Result Sets” and have a defined structure. - * Assessment Outcome: The output from an Algorithm, representing the measurement of some Benchmark as a numeric or controlled vocabulary score. +The two data-level components are: + * Test Result: The consequential output from a test. For the first iteration of the OSTrails FAIRness Reference Model, we will require that tests are very precise, and can have only “pass”, “fail”, or “indeterminate” as their possible outcomes. (This decision is subject to change based on experience with using the OSTrails IF). The output will include metadata (e.g. a progress log) that can be used to interpret the provenance behind the output. Aggregations of Test Results are referred to as “Test Result Sets” and have a defined structure. + * Assessment Outcome: The output from an Algorithm, representing the measurement of some Benchmark as a numeric or controlled vocabulary score. -The final component in the diagram, shown in black in the Figure above, is another software component – the “FAIR Assessment Tool” – that will exist, but its interface and behaviour are defined as part of the OSTrails Implementation Framework rather than the FAIR Reference Model. +The final component in the diagram, shown in black in the Figure above, is another software component – the “FAIR Assessment Tool” – that will exist, but its interface and behaviour are defined as part of the OSTrails Implementation Framework rather than the FAIR Reference Model. To see the individual metadata descriptors of each of these components we refer the reader to the FAIR test results specification https://w3id.org/ftr/, which describes an OWL ontology, documentation and SHACL shapes to validate minimal test and metric metadata conformance. -An overview of the resources implementing different aspects of our framework maybe found in the "resources section" (https://docs.ostrails.eu/en/update-restructure/commons/resources.html#) +An overview of the resources implementing different aspects of our framework maybe found in the "resources section" (https://docs.ostrails.eu/en/update-restructure/commons/resources.html#). Additional information ********************** + Check our deliverables for more information: - * [1] van Lieshout, N., Buys, M., Zamani, T., Rijsselberg, F., & Märkälä, A. (2024). Compliance Assessment Toolkit: Deliverable 2.2 (W. Hugo & W. Steinhoff, Eds.). Zenodo. https://doi.org/10.5281/zenodo.12683218 - \ No newline at end of file + * [1] van Lieshout, N., Buys, M., Zamani, T., Rijsselberg, F., & Märkälä, A. (2024). Compliance Assessment Toolkit: Deliverable 2.2 (W. Hugo & W. Steinhoff, Eds.). Zenodo. https://doi.org/10.5281/zenodo.12683218 diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst index 5530bf6..f6f9f5f 100644 --- a/docs/architecture/intro.rst +++ b/docs/architecture/intro.rst @@ -1,44 +1,44 @@ .. page-authors:: Tomasz Miksa Architecture -========================== +============ -The OSTrails reference architecture provides guidance on realising interactions between key components identified in the OSTrails pathways: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. +The OSTrails reference architecture provides guidance on realising interactions between key components identified in the OSTrails pathways: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. -A key objective of this architecture is to prevent vendor lock-in, ensuring tools and services can be used interchangeably in typical scenarios outlined by the pathways. For instance, any SKG conforming to the SKG-IF can seamlessly integrate with DMP tools to provide additional insights into reused datasets. This architecture emphasises harmonising the modelling and exchange of information across research data management services while allowing diverse implementation choices tailored to specific use cases. +A key objective of this architecture is to prevent vendor lock-in, ensuring tools and services can be used interchangeably in typical scenarios outlined by the pathways. For instance, any SKG conforming to the SKG-IF can seamlessly integrate with DMP tools to provide additional insights into reused datasets. This architecture emphasises harmonising the modelling and exchange of information across research data management services while allowing diverse implementation choices tailored to specific use cases. -The architecture also supports both current well-known and potential future patterns of interactions between components, fostering innovative use cases that enhance automation and machine-actionability of digital object information exchange. For example, while it is yet uncommon for data repositories to update DMPs, the architecture anticipates and accommodates such potential pathways. +The architecture also supports both current well-known and potential future patterns of interactions between components, fostering innovative use cases that enhance automation and machine-actionability of digital object information exchange. For example, while it is yet uncommon for data repositories to update DMPs, the architecture anticipates and accommodates such potential pathways. .. image:: OSTrails-architecture.png We use colour coding in the diagram: - * Orange represents the components and communications that are subject to standardisation within the DMP-IF. - * Blue represents the components and communications that are subject to standardisation within the SKG-IF. - * Green represents the components and communications that are subject to standardisation within the FAIR-IF. - * Gray represents the components and communications that are relevant for delivering the pathways identified by the project but are not subject to any of the interoperability frameworks, e.g. standards may already be in place, under development by other projects, or simply be based on custom interfaces provided by specific services. + * Orange represents the components and communications that are subject to standardisation within the DMP-IF. + * Blue represents the components and communications that are subject to standardisation within the SKG-IF. + * Green represents the components and communications that are subject to standardisation within the FAIR-IF. + * Gray represents the components and communications that are relevant for delivering the pathways identified by the project but are not subject to any of the interoperability frameworks, e.g. standards may already be in place, under development by other projects, or simply be based on custom interfaces provided by specific services. -The reference architecture consists of the following conceptual components: - * DMP Platform – Platform, tool, or service (software system) for planning data management, producing data management plans (DMPs), including machine-actionable data management plans (maDMPs). - * SKG - For the purposes of the OSTrails project, an SKG is defined as any database/repository with information pertaining to research products, processes and actors & agents which can present a graph-type view of this information via a suitable API. - * FAIR Assessment Tool – Software that applies a set of FAIR Tests to the metadata/data of a digital object (such as datasets), presents the output as a FAIR Test Result Set, and provides assistance on how to interpret and improve the results. FAIR Assessment tools may also include additional functionalities such as searching for and/or authoring Metrics and searching for and/or authoring Benchmarks. - * DMP Evaluation Service - A service that takes a DMP as input and gives as a result measurements indicating if the DMP meets given compliance requirements. These requirements depend on the evaluation scenario but in general consist of measurements for subsets of information contained in a DMP. Such measurements can be the FAIRness of digital objects included in the DMP, compliance of the DMP with the RDA maDMP standard, or automated measurements of funder requirements such as the existence of relevant information and their allowed values. To provide these measurements, the DMP Evaluator coordinates the inclusion of the results of other evaluators and resolves information contained in a DMP through SKGs and other sources. - * Data Repository – any service that stores and provides access to data. Usually, it provides a means for persistent identification and ensures that data is accompanied by metadata. Examples include zenodo.org, institutional repositories, etc. - * Other SKG – same definition as for the SKG. This element is introduced in the reference architecture to indicate that the SKG-IF can be used for communication between different SKGs. +The reference architecture consists of the following conceptual components: + * DMP Platform – Platform, tool, or service (software system) for planning data management, producing data management plans (DMPs), including machine-actionable data management plans (maDMPs). + * SKG - For the purposes of the OSTrails project, an SKG is defined as any database/repository with information pertaining to research products, processes and actors & agents which can present a graph-type view of this information via a suitable API. + * FAIR Assessment Tool – Software that applies a set of FAIR Tests to the metadata/data of a digital object (such as datasets), presents the output as a FAIR Test Result Set, and provides assistance on how to interpret and improve the results. FAIR Assessment tools may also include additional functionalities such as searching for and/or authoring Metrics and searching for and/or authoring Benchmarks. + * DMP Evaluation Service - A service that takes a DMP as input and gives as a result measurements indicating if the DMP meets given compliance requirements. These requirements depend on the evaluation scenario but in general consist of measurements for subsets of information contained in a DMP. Such measurements can be the FAIRness of digital objects included in the DMP, compliance of the DMP with the RDA maDMP standard, or automated measurements of funder requirements such as the existence of relevant information and their allowed values. To provide these measurements, the DMP Evaluator coordinates the inclusion of the results of other evaluators and resolves information contained in a DMP through SKGs and other sources. + * Data Repository – any service that stores and provides access to data. Usually, it provides a means for persistent identification and ensures that data is accompanied by metadata. Examples include zenodo.org, institutional repositories, etc. + * Other SKG – same definition as for the SKG. This element is introduced in the reference architecture to indicate that the SKG-IF can be used for communication between different SKGs. -The reference architecture says that a *DMP Platform* must provide a DMP API that can be used by other services. SKGs and data repositories use this API to interact with the DMP Platform. The specific operations of the API will be described elsewhere. For the time being, one can imagine that a data repository can use the DMP API to e.g. add information about a specific licence assigned to a dataset described by the DMP. +The reference architecture says that a *DMP Platform* must provide a DMP API that can be used by other services. SKGs and data repositories use this API to interact with the DMP Platform. The specific operations of the API will be described elsewhere. For the time being, one can imagine that a data repository can use the DMP API to e.g. add information about a specific licence assigned to a dataset described by the DMP. -The *SKGs* must provide an SKG API so that other SKGs can interact with them. DMP Platforms use SKG API to access information in SKGs, e.g. to search for datasets, or to fetch information using identifiers. DMP Evaluation Service and FAIR assessment tools use the SKG API to get additional information needed during assessment. Data repositories also use this API. +The *SKGs* must provide an SKG API so that other SKGs can interact with them. DMP Platforms use SKG API to access information in SKGs, e.g. to search for datasets, or to fetch information using identifiers. DMP Evaluation Service and FAIR assessment tools use the SKG API to get additional information needed during assessment. Data repositories also use this API. -*FAIR Assessment Tools* have APIs that are only partially defined by the OSTrails reference architecture; that is, while the input required by a FAIR assessment tool cannot be predicted, the output structures from all FAIR assessment tools (namely, the “FAIR Test Result Set” data structure) have been specified by the FAIR Reference Architecture (Deliverable D1.2). Further discussion regarding this appears in the chapter 5 of this document. DMP Platforms, DMP Evaluation Services, and SKGs can thus expect a standardised response when interacting with FAIR assessment tools that comply with the FAIR-IF. +*FAIR Assessment Tools* have APIs that are only partially defined by the OSTrails reference architecture; that is, while the input required by a FAIR assessment tool cannot be predicted, the output structures from all FAIR assessment tools (namely, the “FAIR Test Result Set” data structure) have been specified by the FAIR Reference Architecture (Deliverable D1.2). Further discussion regarding this appears in the chapter 5 of this document. DMP Platforms, DMP Evaluation Services, and SKGs can thus expect a standardised response when interacting with FAIR assessment tools that comply with the FAIR-IF. -The *DMP Evaluation Service* provides an interface that the DMP Platform uses to interact with it, i.e. send maDMPs for evaluation and fetch the results. This interface will be designed as part of the DMP Evaluation Service and described in a separate deliverable. Yet, it will be specific to this service and does not belong to any of the interoperability frameworks, i.e. in case other similar services exist, they can define their own interfaces. +The *DMP Evaluation Service* provides an interface that the DMP Platform uses to interact with it, i.e. send maDMPs for evaluation and fetch the results. This interface will be designed as part of the DMP Evaluation Service and described in a separate deliverable. Yet, it will be specific to this service and does not belong to any of the interoperability frameworks, i.e. in case other similar services exist, they can define their own interfaces. -In a similar way, *Data Repositories* may have custom APIs that are used by FAIR Assessment tools or DMP Platforms. OSTrails does not attempt to standardise this communication because it is already a subject of the work by the EOSC Future project on standardising access to content via PID. +In a similar way, *Data Repositories* may have custom APIs that are used by FAIR Assessment tools or DMP Platforms. OSTrails does not attempt to standardise this communication because it is already a subject of the work by the EOSC Future project on standardising access to content via PID. Additional information -******************* +********************** + Check our deliverables for more information: * Reichmann, S., Rey Mazón, M., Hasani-Mavriqi, I., Thaci, L., & Eckhard, D. (2024). **D1.1: Plan-Track-Assess Pathways**. Zenodo. https://doi.org/10.5281/zenodo.13145788 * Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 * Suchánek, M., Martínková, J., Shepherdson, J., Miksa, T., Jirka, J., Knaisl, V., Moilanen, K., Sansone, S.-A., & Stavropoulos, T. (2025). **D2.5 OSTrails Commons Specifications**. Zenodo. https://doi.org/10.5281/zenodo.14795060 - diff --git a/docs/architecture/skg_if.rst b/docs/architecture/skg_if.rst index ebadac6..c78a3b4 100644 --- a/docs/architecture/skg_if.rst +++ b/docs/architecture/skg_if.rst @@ -1,16 +1,17 @@ -.. page-authors:: Tomasz Miksa +.. page-authors:: + Tomasz Miksa Architecture: SKG IF ==================== -This page introduces the Scientific/Scholarly Knowledge Graph Interoperability Framework (SKG-IF). It outlines its motivation, relation to key elements, and applications in OSTrails. +This page introduces the Scientific/Scholarly Knowledge Graph Interoperability Framework (SKG-IF). It outlines its motivation, relation to key elements, and applications in OSTrails. -The `SKG-IF data model `_ is designed to enhance interoperability among different knowledge graph systems and platforms used in research. It facilitates the exchange and use of data across these systems by defining a shared language and standardised operations. Researchers or end-users are not expected to interact directly with the SKG-IF. Instead, it enables automated workflows and interoperability between services, enhancing the research ecosystem's efficiency and machine-actionability. +The `SKG-IF data model `_ is designed to enhance interoperability among different knowledge graph systems and platforms used in research. It facilitates the exchange and use of data across these systems by defining a shared language and standardised operations. Researchers or end-users are not expected to interact directly with the SKG-IF. Instead, it enables automated workflows and interoperability between services, enhancing the research ecosystem's efficiency and machine-actionability. -OSTrails SKG-IF is based on the RDA SKG interoperability framework. By providing a standardised approach to modelling a core set of scholarly data, the SKG-IF supports diverse applications involving compatible SKGs, such as combining SKGs to build new ones or exchanging data between SKGs to benefit from each other's construction methods. OSTrails will extend the existing RDA model of SKGs, propose (a mechanism for) model extensions and an API that can be used to enable scientific discovery and assessment. The OSTrails project will do so in the context of, or in close collaboration with, the RDA SKG-IF WG adding a scientific perspective to the previous scholarly one. +OSTrails SKG-IF is based on the RDA SKG interoperability framework. By providing a standardised approach to modelling a core set of scholarly data, the SKG-IF supports diverse applications involving compatible SKGs, such as combining SKGs to build new ones or exchanging data between SKGs to benefit from each other's construction methods. OSTrails will extend the existing RDA model of SKGs, propose (a mechanism for) model extensions and an API that can be used to enable scientific discovery and assessment. The OSTrails project will do so in the context of, or in close collaboration with, the RDA SKG-IF WG adding a scientific perspective to the previous scholarly one. -More specifically, SKG-IF data model entities are currently described with a comprehensive set of metadata properties, initially agreed on by the existing SKG community of stakeholders (DataCite, OpenCitation, Crossref, OpenAlex, OpenAIRE Graph), inspired also by existing metadata standards or best practices such as EuroCRIS/CERIF and now the perspective of the scientific communities. The model is agnostic of specific PID schemes or vocabularies, enabling cross-SKG interoperability by agreeing on a common structure and sharing of specific semantics. When PIDs or vocabularies are requested (e.g. resource types), properties require the vocabulary name and the specific value. Finally, the IF adopts JSON-LD, a widely recognised data exchange standard, to ensure seamless data exchange and semantic interoperability.7 +More specifically, SKG-IF data model entities are currently described with a comprehensive set of metadata properties, initially agreed on by the existing SKG community of stakeholders (DataCite, OpenCitation, Crossref, OpenAlex, OpenAIRE Graph), inspired also by existing metadata standards or best practices such as EuroCRIS/CERIF and now the perspective of the scientific communities. The model is agnostic of specific PID schemes or vocabularies, enabling cross-SKG interoperability by agreeing on a common structure and sharing of specific semantics. When PIDs or vocabularies are requested (e.g. resource types), properties require the vocabulary name and the specific value. Finally, the IF adopts JSON-LD, a widely recognised data exchange standard, to ensure seamless data exchange and semantic interoperability. -The work on SKG-IF is performed in the context of RDA, guaranteeing a broad set of stakeholders taking part in the decision making. OSTrails brings to the Working Group the requirements arising by scientific communities and service providers in achieving the project objectives. The project roadmap may, therefore, potentially not always be synced and aligned with the RDA WG’s. To this aim, as described below, in its first year OSTrails has co-designed and strongly contributed to the definition of SKG-IF extensions. Extensions are a mechanism allowing a community to define “customizations” of the SKG-IF core model, such as new entities, new properties of existing entities, or new relationships. Extensions, today part of the SKG-IF framework, can compensate the difference in rhythm, when manifesting, between an RDA WG and project objectives, which are driven by deadlines and deliverables. Starting from interoperability use-cases identified in the project, OSTrails partners have identified (i) which entities of the SKG data model can be adopted to meet their requirements and, when such entities are missing, (ii) the SKG extensions required to fulfil them. +The work on SKG-IF is performed in the context of RDA, guaranteeing a broad set of stakeholders taking part in the decision making. OSTrails brings to the Working Group the requirements arising by scientific communities and service providers in achieving the project objectives. The project roadmap may, therefore, potentially not always be synced and aligned with the RDA WG’s. To this aim, as described below, in its first year OSTrails has co-designed and strongly contributed to the definition of SKG-IF extensions. Extensions are a mechanism allowing a community to define “customizations” of the SKG-IF core model, such as new entities, new properties of existing entities, or new relationships. Extensions, today part of the SKG-IF framework, can compensate the difference in rhythm, when manifesting, between an RDA WG and project objectives, which are driven by deadlines and deliverables. Starting from interoperability use-cases identified in the project, OSTrails partners have identified (i) which entities of the SKG data model can be adopted to meet their requirements and, when such entities are missing, (ii) the SKG extensions required to fulfil them. For more information please refer to: Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 diff --git a/docs/commons/intro.rst b/docs/commons/intro.rst index 960c4a0..fa95f27 100644 --- a/docs/commons/intro.rst +++ b/docs/commons/intro.rst @@ -6,8 +6,8 @@ Commons: Introduction The OSTrails Commons -------------------- -The OSTrails Commons (referred to also as ‘the Commons’ hereafter) is a set of open, reusable digital objects that guide and simplify the inclusion of tools into the federation of interoperable services within OSTrails This repository is a living record of the standards, schemas, API definitions, and code modules that make up the OSTrails commons. +The OSTrails Commons (referred to also as ‘the Commons’ hereafter) is a set of open, reusable digital objects that guide and simplify the inclusion of tools into the federation of interoperable services within OSTrails This repository is a living record of the standards, schemas, API definitions, and code modules that make up the OSTrails commons. -The Commons is built through iterative cycles, where specifications will evolve (either individually or in sunchrony with other components of The Commons) to incorporate feedback from tool developers and other stakeholders. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. +The Commons is built through iterative cycles, where specifications will evolve (either individually or in synchrony with other components of The Commons) to incorporate feedback from tool developers and other stakeholders. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. -The Commons is guided by the Plan-Track-Assess Pathways defined by OSTrails, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. \ No newline at end of file +The Commons is guided by the Plan-Track-Assess Pathways defined by OSTrails, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index 331cd72..89a8812 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -1,84 +1,92 @@ Commons: Resources ================== -.. page-authors:: Daniel Garijo +.. page-authors:: + Daniel Garijo -The following resources are part of the FAIR-IF commons: +The following resources are part of the FAIR-IF commons: -FAIR Assessment specifications and SHACL shapes (FTR): +FAIR Assessment specifications and SHACL shapes (FTR): ------------------------------------------------------- -FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks, algorithms, dimensions/principles and their interpretation to generate a FAIR assessment score. -The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. +FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks, algorithms, dimensions/principles and their interpretation to generate a FAIR assessment score. -- Persistent identifier: https://w3id.org/ftr/1.0.0 -- Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ -- Version: 1.0.0 -- Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 +The code release includes the vocabularies, definitions, specifications in machine-readable format and a set of SHACL validation rules to ensure tests and metrics are defined according to the specification. + +- Persistent identifier: https://w3id.org/ftr/1.0.0 +- Code Repository: https://github.com/OSTrails/FAIR_assessment_output_specification/ +- Version: 1.0.0 +- Release (in GitHub): https://github.com/OSTrails/FAIR_assessment_output_specification/releases/tag/v1.0.0 - License: CC-BY 4.0 -FAIR Champion: +FAIR Champion: -------------- -FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. -- Persistent identifier: https://tools.ostrails.eu/champion/sets/ -- Code repository: https://github.com/OSTrails/FAIR-Champion -- Version: Release v1 -- Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 +FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. + +- Persistent identifier: https://tools.ostrails.eu/champion/sets/ +- Code repository: https://github.com/OSTrails/FAIR-Champion +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Champion/releases/tag/1.0.0 - License: MIT FAIR Champion Tests: -------------------- -A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0) -- Persistent identifier: https://tests.ostrails.eu/tests -- Code repository: https://github.com/OSTrails/FAIR-Core-Tests -- Version: Release v1 -- Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 +A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0). + +- Persistent identifier: https://tests.ostrails.eu/tests +- Code repository: https://github.com/OSTrails/FAIR-Core-Tests +- Version: Release v1 +- Release: https://github.com/OSTrails/FAIR-Core-Tests/releases/tag/1.0.0 - License: MIT FOOPS! Test and metric catalogue: ---------------------------------- -The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. - -- Persistent identifier: https://w3id.org/foops/catalogue -- Zenodo link (latest release): https://doi.org/10.5281/zenodo.14767999 -- Code repository: https://github.com/oeg-upm/fair_ontologies -- Version: 0.2.0 -- Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 +--------------------------------- + +The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. + +- Persistent identifier: https://w3id.org/foops/catalogue +- Zenodo link (latest release): https://doi.org/10.5281/zenodo.14767999 +- Code repository: https://github.com/oeg-upm/fair_ontologies +- Version: 0.2.0 +- Release: https://github.com/oeg-upm/fair_ontologies/releases/tag/v0.2.0 - License: Apache-2.0 FAIR Data Point: ----------------- -The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! +---------------- + +The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! -- Identifier: https://tools.ostrails.eu/fdp-index/ -- Code repository: https://github.com/FAIRDataTeam -- Version: Docker Image version 16.x -- Release: N/A +- Identifier: https://tools.ostrails.eu/fdp-index/ +- Code repository: https://github.com/FAIRDataTeam +- Version: Docker Image version 16.x +- Release: N/A - License: MIT FAIR Data Point Index Proxy: ----------------------------- +---------------------------- + An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. -- Identifier: https://tools.ostrails.eu/fdp-index-proxy -- Zenodo link (latest release) -- Code repository: https://github.com/OSTrails/FDP-Index-Proxy -- Version: Release v1.0.0 -- Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 +- Identifier: https://tools.ostrails.eu/fdp-index-proxy +- Zenodo link (latest release) +- Code repository: https://github.com/OSTrails/FDP-Index-Proxy +- Version: Release v1.0.0 +- Release: https://github.com/OSTrails/FDP-Index-Proxy/releases/tag/v1.0.0 - License: MIT FAIRsharing Registry: ----------------------------- +--------------------- + FAIRsharing is a registry of standards, databases, policies and FAIR assistance conceptual components. Registration of FAIR principles/dimensions, metrics, and benchmarks within FAIRsharing allows human- and machine-readable integration of the FAIR assessment components within the wider research landscape, and is key to discovery of these resources as well as for the implementation of the tests themselves via the rich metadata contained within the registry. Rather than being a specific tool release, it is the extension to FAIRsharing with the new FAIRassist registry which is relevant to the other Commons resources described in this section. -- Identifier: https://fairsharing.org/ -- Code repository: https://github.com/FAIRsharing/fairsharing.github.io +- Identifier: https://fairsharing.org/ +- Code repository: https://github.com/FAIRsharing/fairsharing.github.io - Version: Continuous release diff --git a/docs/other/contributing.rst b/docs/other/contributing.rst index 6f3d2f0..e33fb56 100644 --- a/docs/other/contributing.rst +++ b/docs/other/contributing.rst @@ -1,26 +1,32 @@ Contributing Guidelines ======================= -.. contributors:: -Marek Suchanek -John Shepherdson + +.. page-authors:: + Marek Suchanek + John Shepherdson + Thank you for considering contributing to the OSTrails documentation! We welcome contributions from everyone, regardless of your level of experience. This document outlines the process for contributing to the documentation. -## Ways of Contributing +Ways of Contributing +-------------------- - **Reporting Issues**: If you find a bug in the documentation, please open an issue on the GitHub repository. - **Suggesting Enhancements**: If you have an idea for improving the documentation, please open an issue on the GitHub repository. - **Improving the Documentation**: If you would like to improve the documentation, please follow the process outlined below. -## Issue Reporting +Issue Reporting +--------------- -If you find a bug in the documentation, please [open an issue](https://github.com/ostrails/docs/issues/new/choose) in the GitHub repository. When reporting an issue, please follow the requested information for given issue templates. +If you find a bug in the documentation, please `open an issue `_ in the GitHub repository. When reporting an issue, please follow the requested information for given issue templates. -## Documentation +Documentation +------------- -The documentation is hosted on Read-the-Docs and using standard Sphinx documentation. The documentation is written in reStructuredText (`.rst`) format. It can be compiled locally using Sphinx and viewed in a web browser. +The documentation is hosted on Read-the-Docs and using standard Sphinx documentation. The documentation is written in reStructuredText (``.rst``) format. It can be compiled locally using Sphinx and viewed in a web browser. -### Writing Style +Writing Style +^^^^^^^^^^^^^ When contributing to the documentation, please follow the following writing style: @@ -29,74 +35,82 @@ When contributing to the documentation, please follow the following writing styl - Use the present tense. - Use the imperative mood for commands. -For more information on ReStructuredText syntax, please refer to the [official documentation](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html). In this documentation, we use `=` underline for headings, `-` underline for subheadings, and `^` underline for subsubheadings. +For more information on ReStructuredText syntax, please refer to the `official documentation `_. In this documentation, we use ``=`` underline for headings, ``-`` underline for subheadings, and ``^`` underline for subsubheadings. We also use the following extensions: -- `sphinxcontrib.bibtex` for managing bibliographies (see [docs](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/)) -- `sphinxcontrib.openapi` for rendering OpenAPI specifications (see [docs](https://sphinxcontrib-openapi.readthedocs.io/)) +- ``sphinxcontrib.bibtex`` for managing bibliographies (see `sphinxcontrib.bibtex docs `_) +- ``sphinxcontrib.openapi`` for rendering OpenAPI specifications (see `sphinxcontrib.openapi docs `_) -All bibliographical references should be added to the [`references.bib`](docs/references.bib) file in the `docs` directory. A record need to contain all required fields according to the [BibTeX format](https://www.bibtex.com/e/entry-types/). +All bibliographical references should be added to the ``references.bib`` file in the ``docs`` directory. A record need to contain all required fields according to the `BibTeX format `_. -The code style is captured using [EditorConfig](https://editorconfig.org/), see [.editorconfig](.editorconfig) file. Please ensure that your editor supports EditorConfig. It is also checked using CI together with the absence of warnings. +The code style is captured using `EditorConfig `_, see ``.editorconfig`` file. Please ensure that your editor supports EditorConfig. It is also checked using CI together with the absence of warnings. -### Building the Documentation +Building the Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^ First, install the required dependencies (preferably in a virtual environment): -```bash -python -m venv venv -source venv/bin/activate +.. code-block:: bash + + python -m venv venv + source venv/bin/activate + + pip install -r requirements.txt -pip install -r requirements.txt -``` Then, you can build the documentation using the following command: -```bash -cd docs -make html -``` +.. code-block:: bash + + cd docs + make html -Once built, you can view the documentation by opening the `index.html` file in the `_build/html` directory in a web browser. -## Way of Working +Once built, you can view the documentation by opening the ``index.html`` file in the ``_build/html`` directory in a web browser. -The following part describes the way of working when contributing to the documentation. Always also comply to the [Code of Conduct](./CODE_OF_CONDUCT.md) when contributing. +Way of Working +-------------- -### Commit Messages +The following part describes the way of working when contributing to the documentation. Always also comply to the ``CODE_OF_CONDUCT.md`` when contributing (based on `Contributor Covenant `_). -Please follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification when writing commit messages. This will help us to automatically generate the changelog. +Commit Messages +^^^^^^^^^^^^^^^ + +Please follow the `Conventional Commits `_ specification when writing commit messages. This will help us to automatically generate the changelog. For instance, the following commit message: -``` -feat: add new extension to the documentation -docs: update framework general description -deps: update dependencies -fix: correct typos -``` +.. code-block:: none + + feat: add new extension to the documentation + docs: update framework general description + deps: update dependencies + fix: correct typos -### Branching and Pull Requests + +Branching and Pull Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^ When contributing to the documentation, please follow these steps: 1. Fork the repository (if not in the OSTrails organisation). -2. Create a new branch for your changes (base = `update-restructure`). +2. Create a new branch for your changes (base = `next``). 3. Make your changes and commit them. 4. Push your changes. -5. Open a pull request to the `update-restructure` branch of the main repository. +5. Open a pull request to the ``next`` branch of the main repository. -### Crediting Contributors +Crediting Contributors +^^^^^^^^^^^^^^^^^^^^^^ -We will credit all contributors in the documentation. If you would like to be credited, please add your name and related information to the [`CONTRIBUTORS.yml`](./CONTRIBUTORS.yml) file. +We will credit all contributors in the documentation. If you would like to be credited, please add your name and related information to the ``CONTRIBUTORS.yml`` file. Then, you can add your name to the list of contributors for a specific page: -```rst -Page Title -========== +.. code-block:: rst + + Page Title + ========== -.. contributors:: - Jane Smith -``` + .. page-authors:: + Jane Smith From b82fc87ba497ae403e9304df743a92927b575586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Tue, 18 Feb 2025 18:51:39 +0100 Subject: [PATCH 24/28] Fix README badges closes #1 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ad23bc2..10498a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # OSTrails Read-the-Docs Documentation -[![Documentation Status](https://readthedocs.org/projects/ostrails/badge/?version=latest)](https://docs.ostrails.eu/en/latest/?badge=latest) +[![Documentation Status](https://readthedocs.org/projects/ostrails-docs/badge/?version=latest)](https://docs.ostrails.eu) +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](./CODE_OF_CONDUCT.md) ## Usage From 37c6833989fb45608714a3c134510aac0dea84d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 19 Feb 2025 12:11:33 +0100 Subject: [PATCH 25/28] Add Commons info, fix figures and contributors --- CONTRIBUTORS.yml | 2 +- docs/_static/custom.css | 10 ++++ docs/architecture/dmp_if.rst | 6 +- docs/architecture/fair_if.rst | 8 ++- docs/architecture/intro.rst | 12 +++- docs/architecture/skg_if.rst | 5 +- docs/commons/commons-components.png | Bin 0 -> 32972 bytes docs/commons/commons-layers.png | Bin 0 -> 63809 bytes docs/commons/governance.rst | 60 ++++++++++++++++++- docs/commons/intro.rst | 16 ++--- docs/commons/resources.rst | 90 ++++++++++++++++++++++------ docs/other/contributing.rst | 2 +- 12 files changed, 171 insertions(+), 40 deletions(-) create mode 100644 docs/commons/commons-components.png create mode 100644 docs/commons/commons-layers.png diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index 416de6c..501512c 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -1,4 +1,4 @@ -Marek Suchanek: +Marek Suchánek: first_name: Marek last_name: Suchánek github: MarekSuchanek diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 68b5e28..7b2c102 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -2,6 +2,16 @@ display: none; } +figure { + margin: 0.5em; +} + +figcaption p { + margin-top: 0; + color: var(--color-toc-item-text); + font-size: 80%; +} + /* Authors */ .authors { border-top: 1px solid var(--color-brand-content); diff --git a/docs/architecture/dmp_if.rst b/docs/architecture/dmp_if.rst index baf8869..813fa7d 100644 --- a/docs/architecture/dmp_if.rst +++ b/docs/architecture/dmp_if.rst @@ -1,9 +1,9 @@ -.. page-authors:: - Tomasz Miksa - Architecture: DMP IF ==================== +.. page-authors:: + Tomasz Miksa + An **interoperability framework** refers to a set of guidelines, standards, and protocols that ensure the ability of different systems, applications, or organizations to work together effectively, exchanging data and functions seamlessly despite differences in their underlying technologies. The framework typically addresses the technical, semantic, and organizational aspects needed to facilitate collaboration and integration between disparate systems. The **DMP-IF** consists of: diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index b8a2fe7..a4e0afb 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -1,6 +1,9 @@ Architecture: FAIR-IF ===================== +.. page-authors:: + Daniel Garijo + The FAIR Testing Interoperability Framework (FAIR-IF) uses, almost exclusively, existing standards or extensions of standards, such as W3C Data Quality Vocabulary (https://www.w3.org/TR/vocab-dqv/), the W3C Data Catalog vocabulary (https://www.w3.org/TR/vocab-dcat-3/) and the W3C Provenance Ontology (https://www.w3.org/TR/prov-o/). These are employed to build the descriptors for the components that make up the FAIR Testing Reference Model and are described here. While most of these components contribute only indirectly to the Interoperability behaviour of the FAIR-IF, a brief discussion of all of them will simplify understanding how Interoperability is achieved. FAIR Reference Model Conceptual Components @@ -8,7 +11,10 @@ FAIR Reference Model Conceptual Components Guided by the Compliance Assessment Toolkit [1], we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). -.. image:: fair-if.png +.. figure:: fair-if.png + + FAIR Reference Model + Detailed definitions of these components are work in progress as we examine use-cases emerging from the participating Pilots, to ensure that the identified FAIRness Reference Model components are a) complete, and b) match the requirements of the FAIR-IF, and the overall expectations of the OSTrails IF. Briefly, here are the current definitions of the components. diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst index f6f9f5f..32ad875 100644 --- a/docs/architecture/intro.rst +++ b/docs/architecture/intro.rst @@ -1,15 +1,20 @@ -.. page-authors:: Tomasz Miksa - Architecture ============ +.. page-authors:: + Tomasz Miksa + + The OSTrails reference architecture provides guidance on realising interactions between key components identified in the OSTrails pathways: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. A key objective of this architecture is to prevent vendor lock-in, ensuring tools and services can be used interchangeably in typical scenarios outlined by the pathways. For instance, any SKG conforming to the SKG-IF can seamlessly integrate with DMP tools to provide additional insights into reused datasets. This architecture emphasises harmonising the modelling and exchange of information across research data management services while allowing diverse implementation choices tailored to specific use cases. The architecture also supports both current well-known and potential future patterns of interactions between components, fostering innovative use cases that enhance automation and machine-actionability of digital object information exchange. For example, while it is yet uncommon for data repositories to update DMPs, the architecture anticipates and accommodates such potential pathways. -.. image:: OSTrails-architecture.png +.. figure:: OSTrails-architecture.png + + OSTrails Architecture + We use colour coding in the diagram: * Orange represents the components and communications that are subject to standardisation within the DMP-IF. @@ -42,3 +47,4 @@ Check our deliverables for more information: * Reichmann, S., Rey Mazón, M., Hasani-Mavriqi, I., Thaci, L., & Eckhard, D. (2024). **D1.1: Plan-Track-Assess Pathways**. Zenodo. https://doi.org/10.5281/zenodo.13145788 * Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 * Suchánek, M., Martínková, J., Shepherdson, J., Miksa, T., Jirka, J., Knaisl, V., Moilanen, K., Sansone, S.-A., & Stavropoulos, T. (2025). **D2.5 OSTrails Commons Specifications**. Zenodo. https://doi.org/10.5281/zenodo.14795060 + diff --git a/docs/architecture/skg_if.rst b/docs/architecture/skg_if.rst index c78a3b4..a230c1f 100644 --- a/docs/architecture/skg_if.rst +++ b/docs/architecture/skg_if.rst @@ -1,8 +1,9 @@ +Architecture: SKG IF +==================== + .. page-authors:: Tomasz Miksa -Architecture: SKG IF -==================== This page introduces the Scientific/Scholarly Knowledge Graph Interoperability Framework (SKG-IF). It outlines its motivation, relation to key elements, and applications in OSTrails. diff --git a/docs/commons/commons-components.png b/docs/commons/commons-components.png new file mode 100644 index 0000000000000000000000000000000000000000..b52f06ec7b2af8e0a7e3c05bbe783a2e9540dc07 GIT binary patch literal 32972 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

_t6mtFa)r5}%^W?kQq?K-p|BnD+1c$!ltPPbyqt zeGzbesXq5c1TmZc=4k}a7ndL&vA^@|lINH8LLt&Iy1$4)zun?RM#Isq!5=xh_UHAX zF^4XE+o26}$UtE*y$5> zV|#3D3p#Rl)Y!A&JsjhOz`F+ZtxX#`N8`+rYU$XxT)9z$$z)o=W>}*wH46U248ruy z09WMwzSSVqjw{!V*7-n@UX)ENCv{iJV%(^^dEyYRdN`2K?NmcxQEI6s*gA0^GPsL6 z2i0o&vrJ&WevQZeV4CW6^||;hmS{!efHB6sm;KUP+h{+cHb#h_pZJ;!8C{qI29dG_ z137M9up))abDTy!_z0OyG_aFoisBh3UWk}}NhUQ;0%&2UM4)b$<)AO4Zi9IQ%<={x z8^#^42=BhhbSs*Z^XD}-yOQhmHb*4w0b1n*FPjZtsY-vf^9M^x8{2tf(Ysm645gWX zO$f@(&r^)i0o<`!l;wEeu?;SSr#XTR270(cv~E`c_=+)RvAP`ciT;5Lb(a+79Z<190S$SDx=8z_9(3t?yRBKVCYn_k&GG79 z`Z$ysCn`5|QVlaa%_NJUpF(P{H6$dNNiy1K-AL*Gw3i?^w%>{y^7sBa+j$qU3ULXA zAMp0B^A8qZs=Uq5sFMvB2J}AH%`h`~-MhrYir2Dp6L)rD;gIuX8XG{qfnpc98pZwSg;^Ww&kKmnlJ4@t+}>M4+8ms|-Pfdi zxas~1HT{ct^lV-Fm9=ibZ0;%TI5AuaRBG>7Puv74vY#0vsd~|m;q8=hkV}_slEmL9 zw$Rv$Su_hwz2?qu`lDunwN(brr-c$*;@9MT3`V`2mN|EDP^d0+o_7p45Rd!T_6&$U zT*&ig(Sq3Tj<%}=!tLalacX}a)Aus z!Hgw}u{q$F(wx^us$c!fIn1@cKt=deE1?9^u&e+;Hf99NCQqa#P&DDszT)J6sBzmt zR?1M$S}t!5_OU7oWBg?zAGTk&|J6(aShYy zaCT*;9g=rAsf?b#bnIK4s~AO(^(w|6yH$q@CYwUBHj6P4(^k1!2qJi#N<0pLV+ETU zwla~RgdsfI|Egvih}_x~SE!wFBwzU`!q?SbGIsWj%wyP8^-BC3CRnZl>D&DVmMGe> z9Y;VBG(jYa-fWBSA1|M-&D(134QKDlWZ58Tef(TQ2#p1hT-M=iCP*fF*#Uf^YB`8M za5)>}r=xtm{(s=sZ_}nQ(O^y2owSC7jpmv;SbYauPrPu))~T=KIzZK1*8}c}4=pUo zGYaUVcuYk6LcpIa?GumGF;$(A6G)A3oJOj$xo&aq9Bo#K{L$0v8*{;{>}?Jj29ZsS z+$g1c8g(9F63#B~ZatEnH|1nceInELrqxa3X3&KD$2jS5x-d=sTJRf*OZ7MOnf3*n zo6PI@?QM6CXGbp&klKDthb1A=CdOX=U2X9pQ^7clLqd;mF?$;EV{Y(1OHCqwAo|_K zMl$^*Gjk*HUmm$q^u3>%c}2uK+}JKNN3 zrumELpzCL5+`pjtC$hK~Y5LvhwWF))+=n=3oxvUBT5`%3mm2ZC%DG8btcTORi3UQR zED_NtUaNJYc+e zTPJcUb5pt+nTIyFv0fORIOFBTbM*tCdk|WoBkqzB~3dbWn9^wP#t$gozkjzbBg8bx{-3-rTd+{uWMAMcR zzLpi)NE7g!gz35uyq#5SHu)EaeqX})^q~<(IAF`ItwT01otyX@+b=ry5;Awn81qSF z2hooa=s(}Hxd`6O5qt9SiC4E&r!F^93gywg<=ySO#M^*3@pHWJYtat|{3a$Cr3m!rX*^hlu6bhc%@*s$v8SIoq_=N{-~ z|JXZlyr6Z}-baE>@LkS|m?~!b;!IODwK!8jWRA6z>K$X|aS>s9pBOnZKc2*H9cQd* z8jl^n3PGT@NrnPkf*;SzvmwxEP&(_*SFaW0VCxus?qiKWHmBL5*IO+Z5WYbN&wY!v zabpG|AYiLow{#%;bEB9uy)}$bvs&mK691r{Z-qx7D!D%! z!)@A0r^SdFv2$h|6WP6{oMm18yNu8IY;eq$usLZo)Ev#a+%rcI z`(k%KAdbgp@XCr%a7F9U0LAZHE=J$znX|YHolANT<57@@2Hr5T&1A7+Cq}9UVUj^z z??@|EqM}hj=3Z9sb(6j2(9Kd%34m2`(1>4N z@)q##yDC{g?e4qjA5<9s2De%D%D`$$aAy9KWK%7F3{jIBq;G6D5rDvZ9!$T7&%6n(=v`I;T^>~An?S?u_P(or z&b|~PJqI`)5cQT0%&ZJ(VfWKbrKXtf4{I$NzLsGd&Hnu>K;+j(%=Q>4l6d0+KIzve!77Xi#UyDqbot7c=#l@{eB{k~_|Yl)BZ_3bI2ZrnZ^ zUpJWgn#{6AG=p1L-s&n9wlJe1b;y1rbk%a)1MUD-=P6CpH%S(X1{=Rq&O0+Fa%MQD zn;^V^4M3K&UM5#V(fQt0$~o13qUvYHq*K-`)HL&u9oYv4(I#WnHHw>p=q$eBuQzFI z=k>e;bng^q5EROM{}fnQ(&&g-zv7W2woDji_$e?*N}Uto%K;&nBc}#PB0`}fRg>D3 z?Pq_qKSnHeUXT^5W$D~diNMq?CxV;~6gXhrNYAJb1vt6} zAimTcCdks#tOpJ?y|y$gA-R*#hX>~lkm*vK0XpN8;pWaSRA4$WGR$1AxW7qLB)&8oJ_bZ5 z2gc-VyPuF5yJ5Z5gnt_0Skat>_;`{U#PE)Gt7vj4J~@}NZG<#Ar0#C=meOjIoL5f6 zlyz%Sx3S9FM<3ckmxemKOyj)ztKooQFQ-G2J5d{}r_>O|7QMf^BXol6W*T)eK=@G` z<%=q)9+-)ad9leLM^&2Z4d#*j^+bw0*I0!5^LFqqcjx4B>!m@u_7E&DURLdfDca{< znF#Rd`#;DLNXQ_a1LnVp(>n&m;$B!LLfU_cDh_)Q8T=K!WOuMTVx@;b18Xp|B@|n^b1S zp9_#j=&dejySbV_LRM*Qb)M%h5I>hT0IKJA>{@H!xG({x2JC?88r5psd=mP&zVGmP z4C4^eY{p1~4vV9j%4IjD)6Iy>Xj81ujP0p5&r4BW(=AFhgL;iG(8&v;)mUm<*&t@1 zy2M*_OE|F&Mj}oww;mNt+T?X+pNwDw>khi|^i`*$b+YUb|~w zQ|8etW@=p-zZWPFlsYJ3urA96DZI8CI2u4Y*2*Wjn;KA;&n|>BCqkv zG8KcHN$A(@?!Kjm{-pcpSt2~71!Q~@%qhvfiql(8E%y@-4Xu<)6wY>f+LVqCO3;4X zpaSoh3_e;T-sb)oQA~G7L)5fcx z+4@v+lxXdspyTs1l{DZgt@-U@U5rW4Qm1J(aHI?SxKfC&7gm`)PO%}br06HfHp=J4;1n_Oa(+3QIxQKN3wr`Atsf`l1YPW2g2@p;e$(6>E*)ncqT@KH{y(ppS4r$@L z-&{@OVi-W`rpL0teDq}C)ej%3-yC=$K*E_(upq#HbYVKge`n{$Mwpb7j-a| zjc)^>mEXG;Gqb=w@+G@esTWdS1jlZgVp$xzS1`g3z#u2^Kl=D{^nG*n24v^`Qi-T> z+)X@m86^9UmjXLHjI{JOd0?~EN4K$lSzpZu0!vX!i1!s;Y`NsR;}SE(NWslvlWu}1 zom%T3s|Y;~?gNN?rntjLHlyNAnp|8As8q9H+pjdRE1;KVeXmX@9{~yJs2`>6cQukv za(gUeo_|m@JS(-r47JcafO=7OmJHc>n`{0>4G{hC*&Z%)&R|zgP%Yu(_E#FgXKYm| zzTr|p`yvOxZjnv8{+4;QB$X-$bkB70q%-_^_#M)aAXyS7zmhLdyrmPYPR(zoVISrg z1&Zk2JQIPDl{MQ58CWM8tpr8QL34fPUf`_#=Vyl(eKFYMpl2~ zv1cvrMCDQ|xvdIZdgOdw*t&lA~_8{q1ZrM1p1O#)OE#mxmWAao#%4X6HaK2^|1{hBGnI17%aZplWQ`KLS9 zjV-3uYb9nLM!L1#-G29Hh^$A>;lYYFwL3SFbDyN1nTOova*kuX4>g#ffa{gYWgZ7> z;Kgwn?27EVapT$stG+`7_WVD-WlE(^P_Oy5B7NrjcJScYx59(^*#1fkK|YmWlN?

Y2ZZECc5D29x=X{IQ2m1oI5o;mOOVm@Qa>5 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 seau8H78VwdhO&Ylc)9Sb6fHvk4-M(o=>Px# literal 0 HcmV?d00001 diff --git a/docs/commons/commons-layers.png b/docs/commons/commons-layers.png new file mode 100644 index 0000000000000000000000000000000000000000..35a1476200a6645120f90798a7b01882d398602f GIT binary patch literal 63809 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�NchS^X;I_m7sh(*${FyFwx-}kWZj!-m2Jk(_< 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

PJXq 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 P0564CDzZh=Ccgg#f(t~% literal 0 HcmV?d00001 diff --git a/docs/commons/governance.rst b/docs/commons/governance.rst index e64d544..fb5167a 100644 --- a/docs/commons/governance.rst +++ b/docs/commons/governance.rst @@ -1,4 +1,58 @@ -Commons: Governance -=================== +OSTrails Commons: Governance +============================ -*To be specified* +.. page-authors:: + Marek Suchánek + + +The OSTrails Commons is a structured collection of open, reusable specifications designed to facilitate interoperability within the OSTrails ecosystem. Its governance ensures sustainable management, adoption, and evolution. The governance framework incorporates structured leadership, participation policies, and sustainability strategies aligned with global best practices, including the Global Open Research Commons (GORC). Please note, that this is **early-stage** governance structure for OSTrails Commons and it may change as the Commons are being materialised over the course of the project. + +.. _commons-structure: + +Commons Components and Layers +----------------------------- + +The Commons is organised into five components, ensuring comprehensive coverage of all included resources. Every resource, whether directly supporting interoperability or serving as foundational infrastructure, is categorised within this structure. This framework encompasses the core Plan-Track-Access framework-related elements, supporting tools, and essential management resources to maintain and evolve the Commons effectively. + +.. figure:: commons-components.png + :scale: 60% + + Components of OSTrails Commons + +Furthermore, the Commons is organised into a layered structure that complements the core components (DMP, SKG, FAIR) and supporting tools. This approach ensures a systematic, modular framework where resources are categorised not only by their functional area but also by the type of technical or conceptual contribution they make. The layering enables consistency across components, promotes reusability, and supports the alignment of tools with the Interoperability Framework. + +Each layer reflects a distinct aspect of resource organisation, whether it involves APIs for tool integration, data models for structured information exchange, or compliance mechanisms for evaluating adherence to the framework. This structure is designed to D2.5 OSTrails Commons Specification remain extensible, allowing new layers to be introduced as needs evolve, especially in response to extensions or updates in the Interoperability Framework. Unlike the introduction of new components, which are tied to the PTA framework and thus less likely, additional layers may be necessary to address emerging interoperability requirements or technological advancements. + +.. figure:: commons-layers.png + :scale: 60% + + Layers and Components of OSTrails Commons + + +Governance Structure +-------------------- + +OSTrails Commons is managed through a federated governance model, ensuring adaptability and inclusivity. The governance structure consists of: + +- **Group of Maintainers**: Responsible for specific parts of the Commons, ensuring technical consistency, version control, and interoperability standards across components (DMP, SKG, FAIR). +- **Resource Representatives**: Responsible for specific resource(s) that are part of the Commons, maintaining its record up-to-date and the resource aligned with the Commons and OSTrails Interoperability Framework. +- **Community Contributors**: Researchers, developers, and stakeholders who provide feedback, propose enhancements, and contribute to resource maintenance. + +Maintenance and Evolution +------------------------- + +The Commons evolves through structured updates and community contributions. Maintenance follows these principles: + +- **Versioning Policy**: Updates follow semantic versioning, ensuring compatibility and traceability. +- **Compliance Monitoring**: Resources are periodically assessed against interoperability standards (EOSC, GORC). +- **Feedback Mechanism**: Contributions and issues are managed via GitHub discussions and issue tracking. +- **Deprecation & Archival**: Outdated resources are phased out following transparent guidelines to maintain usability and relevance. + +GORC Alignment +-------------- + +As part of the OSTrails Commons Specification, the Global Open Research Commons (GORC) International Model has been utilized, ensuring: + +- **Sustainability**: Long-term stewardship of resources and metadata. +- **Interoperability**: Adherence to global data exchange and research infrastructure standards. +- **Transparency & Engagement**: Open decision-making processes, public documentation, and structured community involvement. diff --git a/docs/commons/intro.rst b/docs/commons/intro.rst index fa95f27..b582632 100644 --- a/docs/commons/intro.rst +++ b/docs/commons/intro.rst @@ -1,13 +1,13 @@ -Commons: Introduction -===================== +OSTrails Commons +================ -.. page-authors:: Mark Wilkinson +.. page-authors:: + Mark Wilkinson + Marek Suchánek -The OSTrails Commons --------------------- -The OSTrails Commons (referred to also as ‘the Commons’ hereafter) is a set of open, reusable digital objects that guide and simplify the inclusion of tools into the federation of interoperable services within OSTrails This repository is a living record of the standards, schemas, API definitions, and code modules that make up the OSTrails commons. +The **OSTrails Commons** (referred to also as ‘the Commons’ hereafter) is formally defined as a **collection of open, reusable, and adaptable resources that collectively enable and enhance interoperability** within the OSTrails ecosystem and beyond. These resources are designed to lower adoption barriers to integration by standardising interactions between tools, ensuring alignment with the OSTrails Interoperability Framework (IF) and Reference Architecture (RA). The Commons is not standalone tools or services; rather, they provide the foundational elements that support and guide the development, operation, and evolution of interoperable research-supporting platforms. By bridging technical, semantic, and procedural gaps, the Commons facilitate collaboration and scalability while remaining flexible for adaptation to emerging technologies and diverse research contexts. -The Commons is built through iterative cycles, where specifications will evolve (either individually or in synchrony with other components of The Commons) to incorporate feedback from tool developers and other stakeholders. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. +The Commons is **built through iterative cycles**, where specifications will evolve (either individually or in synchrony with other components of The Commons) to **incorporate feedback from tool developers and other stakeholders**. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. -The Commons is guided by the Plan-Track-Assess Pathways defined by OSTrails, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. +The Commons is **guided by the Plan-Track-Assess Pathways defined by OSTrails**, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index 89a8812..ca3fb86 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -1,13 +1,62 @@ -Commons: Resources -================== +OSTrails Commons: Resources +=========================== .. page-authors:: Daniel Garijo + Marek Suchánek -The following resources are part of the FAIR-IF commons: -FAIR Assessment specifications and SHACL shapes (FTR): -------------------------------------------------------- +This page embodies the OSTrails Commons, a collection of reusable resource according to its structure as :ref:`components `. + +DMP Commons +----------- + +The following resources in this section are part of the DMP Commons component. + +OSTrails Application Profile for maDMPs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +OSTrails Application Profile (AP) as a tailored extension of the `RDA DMP Common Standard (DCS) for maDMPs `_ will be designed to enhance interoperability while addressing various requirements (e.g. funders). Technically, the specification of the application profile will be done as prescribed by the DCS (which will support such extensions) and will be part of the Commons as the description of data structure. + +- *Planned resource to be developed* + + +OSTrails maDMP API Specification +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +maDMP API Specification will build on top of the DSC and OSTrails AP and specify the operations and data exchange. We plan to materialize this in the form of OpenAPI specification (using the current version, currently v3.1.1. Again, this promotes adoption as OpenAPI specification not only documents the API but also provides a way to generate source code or other artifacts (e.g. tests) as well as check compliance. + +- *Planned resource to be developed* + + +SKG Commons +----------- + +The following resources in this section are part of the SKG Commons component. + +OSTrails SKG IF +^^^^^^^^^^^^^^^ + +OSTrails SGK-IF as an extension of the `RDA SKG-IF `_ will focus on Common Standard and Data Model extensions, resulting in a specification for data structures guiding the adoption. + +- *Planned resource to be developed* + + +OSTrails SKG-IF Common API +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +SKG-IF Common API will be a specification of API following identified use cases and supporting relevant operators to guide the adoption and eventually also check compliance. + +- *Planned resource to be developed* + + +FAIR Commons +------------ + +The following resources in this section are part of the FAIR Commons component. + +FAIR Assessment specifications and SHACL shapes (FTR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FTR is the first OWL implementation of the FAIR Reference model described in Deliverables D1.2 and D.1.4. The reference model extends W3C standards such as DCAT (https://www.w3.org/TR/vocab-dcat-3/), DQV (https://www.w3.org/TR/vocab-dqv/) and PROV (https://www.w3.org/TR/prov-o/) to describe test results, test definitions, metrics, benchmarks, algorithms, dimensions/principles and their interpretation to generate a FAIR assessment score. @@ -20,8 +69,8 @@ The code release includes the vocabularies, definitions, specifications in machi - License: CC-BY 4.0 -FAIR Champion: --------------- +FAIR Champion +^^^^^^^^^^^^^ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by all communities and for all digital objects. In this release, FAIR Champion is aware of the 22 FAIR Tests (below), but any test, from any provider, can be registered so long as the test generates a metadata descriptor compliant with the FAIR Reference Model defined by OSTrails. The OpenAPI interface descriptor for this release is only partially complete; the Champion has a variety of functions related to new test registration and benchmark registration that are currently pending decisions by the OSTrails project. @@ -32,10 +81,10 @@ FAIR Champion is a general-purpose FAIR assessment tool intended to be used by a - License: MIT -FAIR Champion Tests: --------------------- +FAIR Champion Tests +^^^^^^^^^^^^^^^^^^^ -A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0). +A set of 22 tests for FAIRness. These are generic tests for all four FAIR facets – F, A, I, R – and do not represent any specific community or digital object. All tests require the GUID of the digital object’s metadata as input. Output follows the FAIR Test Results schema (https://w3id.org/ftr/1.0.0). - Persistent identifier: https://tests.ostrails.eu/tests - Code repository: https://github.com/OSTrails/FAIR-Core-Tests @@ -44,8 +93,8 @@ A set of 22 tests for FAIRness. These are generic tests for all four FAIR facet - License: MIT -FOOPS! Test and metric catalogue: ---------------------------------- +FOOPS! Test and metric catalogue +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies and ontologies. In this release, FOOPS! has been adapted to comply with the FTR specification. A catalog of test descriptions has been made available in https://w3id.org/foops/catalogue. The release contains the source code of the tools, as well as the machine-readable and human-readable documentation of all tests, metrics and benchmarks associated with the tool. @@ -57,8 +106,8 @@ The Ontology Pitfall Scanner for FAIR is a FAIR assessment tool for vocabularies - License: Apache-2.0 -FAIR Data Point: ----------------- +FAIR Data Point +^^^^^^^^^^^^^^^ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam”). In OSTrails we utilize the FAIR Data Point (FDP) in its configuration as an “index”, using the 16.x releases of the software suite in DockerHub. FDP Index is the first implementation of a test registry and will include many of the descriptions from the FAIR Champion and FOOPS! @@ -69,8 +118,8 @@ The FAIR Data Point software is maintained by a third party (the “FAIRDataTeam - License: MIT -FAIR Data Point Index Proxy: ----------------------------- +FAIR Data Point Index Proxy +^^^^^^^^^^^^^^^^^^^^^^^^^^^ An early prototype of a “proxy” service that allows native DCAT records to be registered in a FAIR Data Point Index. @@ -82,11 +131,16 @@ An early prototype of a “proxy” service that allows native DCAT records to b - License: MIT -FAIRsharing Registry: ---------------------- +FAIRsharing Registry +^^^^^^^^^^^^^^^^^^^^ FAIRsharing is a registry of standards, databases, policies and FAIR assistance conceptual components. Registration of FAIR principles/dimensions, metrics, and benchmarks within FAIRsharing allows human- and machine-readable integration of the FAIR assessment components within the wider research landscape, and is key to discovery of these resources as well as for the implementation of the tests themselves via the rich metadata contained within the registry. Rather than being a specific tool release, it is the extension to FAIRsharing with the new FAIRassist registry which is relevant to the other Commons resources described in this section. - Identifier: https://fairsharing.org/ - Code repository: https://github.com/FAIRsharing/fairsharing.github.io - Version: Continuous release + +Cross-Cutting and Supporting Resources +-------------------------------------- + +*(No resources yet in this component.)* diff --git a/docs/other/contributing.rst b/docs/other/contributing.rst index e33fb56..ccab8fe 100644 --- a/docs/other/contributing.rst +++ b/docs/other/contributing.rst @@ -2,7 +2,7 @@ Contributing Guidelines ======================= .. page-authors:: - Marek Suchanek + Marek Suchánek John Shepherdson From 111bde1f1a849179e2f248d6f8f44ac79d835d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 19 Feb 2025 14:02:17 +0100 Subject: [PATCH 26/28] Use bibtex references --- docs/architecture/fair_if.rst | 11 +++++-- docs/architecture/intro.rst | 14 ++++++--- docs/commons/intro.rst | 16 +++++++++- docs/other/resources.rst | 2 +- docs/references.bib | 57 +++++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/docs/architecture/fair_if.rst b/docs/architecture/fair_if.rst index a4e0afb..2ea7d3f 100644 --- a/docs/architecture/fair_if.rst +++ b/docs/architecture/fair_if.rst @@ -9,7 +9,7 @@ The FAIR Testing Interoperability Framework (FAIR-IF) uses, almost exclusively, FAIR Reference Model Conceptual Components ****************************************** -Guided by the Compliance Assessment Toolkit [1], we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). +Guided by the Compliance Assessment Toolkit :cite:`faircore4eosc_d2.2`, we have identified the set of distinct components that make up a FAIR testing environment. These, and the relationships between them, are diagrammed in Figure 1. These are categorised as Conceptual (shown in green), Software (blue), and Data (orange) levels. In addition, there is a higher level of Conceptual object we call a Dimension (red), which represents an established principle (e.g. FAIR Principle F1) that motivates the need for the creation of a FAIR test (or set of tests). .. figure:: fair-if.png @@ -43,4 +43,11 @@ Additional information ********************** Check our deliverables for more information: - * [1] van Lieshout, N., Buys, M., Zamani, T., Rijsselberg, F., & Märkälä, A. (2024). Compliance Assessment Toolkit: Deliverable 2.2 (W. Hugo & W. Steinhoff, Eds.). Zenodo. https://doi.org/10.5281/zenodo.12683218 + +.. bibliography:: + :list: bullet + :filter: False + :keyprefix: fair-if- + :labelprefix: fair-if- + + faircore4eosc_d2.2 diff --git a/docs/architecture/intro.rst b/docs/architecture/intro.rst index 32ad875..be48eb3 100644 --- a/docs/architecture/intro.rst +++ b/docs/architecture/intro.rst @@ -5,7 +5,7 @@ Architecture Tomasz Miksa -The OSTrails reference architecture provides guidance on realising interactions between key components identified in the OSTrails pathways: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. +The OSTrails reference architecture :cite:`ostrails_d1.4` :cite:`ostrails_d2.5` provides guidance on realising interactions between key components identified in the OSTrails pathways :cite:`ostrails_d1.1`: Data Management Plans (DMPs), Scientific Knowledge Graphs (SKGs), and FAIR Assessment. It clarifies which interactions are standardised within the Interoperability Frameworks and which are relevant to the project without prescribing specific implementation methods. For example, while the reference architecture specifies when the DMP API (part of the DMP Interoperability Framework) must be used, it leaves the method of accessing information from data repositories flexible. A key objective of this architecture is to prevent vendor lock-in, ensuring tools and services can be used interchangeably in typical scenarios outlined by the pathways. For instance, any SKG conforming to the SKG-IF can seamlessly integrate with DMP tools to provide additional insights into reused datasets. This architecture emphasises harmonising the modelling and exchange of information across research data management services while allowing diverse implementation choices tailored to specific use cases. @@ -44,7 +44,13 @@ Additional information ********************** Check our deliverables for more information: - * Reichmann, S., Rey Mazón, M., Hasani-Mavriqi, I., Thaci, L., & Eckhard, D. (2024). **D1.1: Plan-Track-Assess Pathways**. Zenodo. https://doi.org/10.5281/zenodo.13145788 - * Miksa, T., Wilkinson, M., Manghi, P., & Suchánek, M. (2025). **D1.4 OSTrails Interoperability Reference Architecture V1**. Zenodo. https://doi.org/10.5281/zenodo.14795000 - * Suchánek, M., Martínková, J., Shepherdson, J., Miksa, T., Jirka, J., Knaisl, V., Moilanen, K., Sansone, S.-A., & Stavropoulos, T. (2025). **D2.5 OSTrails Commons Specifications**. Zenodo. https://doi.org/10.5281/zenodo.14795060 +.. bibliography:: + :list: bullet + :filter: False + :keyprefix: architecture-intro- + :labelprefix: architecture-intro- + + ostrails_d1.4 + ostrails_d2.5 + ostrails_d1.1 diff --git a/docs/commons/intro.rst b/docs/commons/intro.rst index b582632..d77eda3 100644 --- a/docs/commons/intro.rst +++ b/docs/commons/intro.rst @@ -6,8 +6,22 @@ OSTrails Commons Marek Suchánek -The **OSTrails Commons** (referred to also as ‘the Commons’ hereafter) is formally defined as a **collection of open, reusable, and adaptable resources that collectively enable and enhance interoperability** within the OSTrails ecosystem and beyond. These resources are designed to lower adoption barriers to integration by standardising interactions between tools, ensuring alignment with the OSTrails Interoperability Framework (IF) and Reference Architecture (RA). The Commons is not standalone tools or services; rather, they provide the foundational elements that support and guide the development, operation, and evolution of interoperable research-supporting platforms. By bridging technical, semantic, and procedural gaps, the Commons facilitate collaboration and scalability while remaining flexible for adaptation to emerging technologies and diverse research contexts. +The **OSTrails Commons** :cite:`ostrails_d2.5` (referred to also as ‘the Commons’ hereafter) is formally defined as a **collection of open, reusable, and adaptable resources that collectively enable and enhance interoperability** within the OSTrails ecosystem and beyond. These resources are designed to lower adoption barriers to integration by standardising interactions between tools, ensuring alignment with the OSTrails Interoperability Framework (IF) and Reference Architecture (RA) :cite:`ostrails_d1.4`. The Commons is not standalone tools or services; rather, they provide the foundational elements that support and guide the development, operation, and evolution of interoperable research-supporting platforms. By bridging technical, semantic, and procedural gaps, the Commons facilitate collaboration and scalability while remaining flexible for adaptation to emerging technologies and diverse research contexts. The Commons is **built through iterative cycles**, where specifications will evolve (either individually or in synchrony with other components of The Commons) to **incorporate feedback from tool developers and other stakeholders**. This iterative approach ensures that the Commons remains practical and adaptable. For this reason, entities in the commons are carefully versioned, and versioned releases are generated as required to ensure that the tools work together. The Commons is **guided by the Plan-Track-Assess Pathways defined by OSTrails**, which provides a map of how tools interact to facilitate research workflows. The pathways flow through three primary Interoperability Frameworks (IF): the SKG-IF, the DMP-IF, and the FAIR-IF. As such, this living repository is similarly split into three chapters with the same names, containing the detailed record of the members of that sub-set of Commons artefacts. + +Additional information +********************** + +Check our deliverables for more information: + +.. bibliography:: + :list: bullet + :filter: False + :keyprefix: commons-intro- + :labelprefix: commons-intro- + + ostrails_d2.5 + ostrails_d1.4 diff --git a/docs/other/resources.rst b/docs/other/resources.rst index d2a63cc..d6273bc 100644 --- a/docs/other/resources.rst +++ b/docs/other/resources.rst @@ -3,4 +3,4 @@ Resources .. bibliography:: :all: - :list: enumerated + :style: plain diff --git a/docs/references.bib b/docs/references.bib index e69de29..05db23b 100644 --- a/docs/references.bib +++ b/docs/references.bib @@ -0,0 +1,57 @@ +@misc{faircore4eosc_d2.2, + author = {Hugo, Wim and + Steinhoff, Wilko and + Lieshout, Natascha and + Buys, Matthew and + Zamani, Themis and + van Rijsselberg, Fjodor and + Märkälä, Anu}, + title = {D2.2 – Compliance Assessment Toolkit}, + month = jul, + year = 2024, + publisher = {Zenodo}, + doi = {10.5281/zenodo.12683218}, +} + +@misc{ostrails_d1.1, + author = {Reichmann, Stefan and + Rey Mazón, Miguel and + Hasani-Mavriqi, Ilire and + Thaci, Laura and + Eckhard, David}, + title = {D1.1: Plan-Track-Assess Pathways}, + month = jul, + year = 2024, + publisher = {Zenodo}, + doi = {10.5281/zenodo.13145788}, +} + +@misc{ostrails_d1.4, + author = {Miksa, Tomasz and + Wilkinson, Mark and + Manghi, Paolo and + Suchánek, Marek}, + title = {D1.4 OSTrails Interoperability Reference Architecture V1}, + month = jan, + year = 2025, + publisher = {Zenodo}, + doi = {10.5281/zenodo.14795000}, +} + +@misc{ostrails_d2.5, + author = {Suchánek, Marek and + Martínková, Jana and + Shepherdson, John and + Miksa, Tomasz and + Jirka, Jakub and + Knaisl, Vojtěch and + Moilanen, Katja and + Sansone, Susanna-Assunta and + Stavropoulos, Tassos}, + title = {D2.5 OSTrails Commons Specifications}, + month = jan, + year = 2025, + publisher = {Zenodo}, + doi = {10.5281/zenodo.14795060}, +} + From 7cb3757d7841f5eb989bbaa717be0908ed812109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 19 Feb 2025 14:04:35 +0100 Subject: [PATCH 27/28] Fix contributing guidelines closes #8 --- CONTRIBUTING.md | 7 ++++--- docs/other/contributing.rst | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ce61019..7354c43 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,16 +78,16 @@ fix: correct typos When contributing to the documentation, please follow these steps: 1. Fork the repository (if not in the OSTrails organization). -2. Create a new branch for your changes (base = `develop`). +2. Create a new branch for your changes (base = `next`). 3. Make your changes and commit them. 4. Push your changes. -5. Open a pull request to the `develop` branch of the main repository. +5. Open a pull request to the `next` branch of the main repository. ### Crediting Contributors We will credit all contributors in the documentation. If you would like to be credited, please add your name and related information to the [`CONTRIBUTORS.yml`](./CONTRIBUTORS.yml) file. -Then, you can add your name to the list of contributors for a specific page: +Then, you can add your name to the list of contributors for a specific page (under the first heading) using the `page-authors` directive: ```rst Page Title @@ -95,4 +95,5 @@ Page Title .. page-authors:: John Doe + ``` diff --git a/docs/other/contributing.rst b/docs/other/contributing.rst index ccab8fe..fa74f59 100644 --- a/docs/other/contributing.rst +++ b/docs/other/contributing.rst @@ -105,7 +105,7 @@ Crediting Contributors We will credit all contributors in the documentation. If you would like to be credited, please add your name and related information to the ``CONTRIBUTORS.yml`` file. -Then, you can add your name to the list of contributors for a specific page: +Then, you can add your name to the list of contributors for a specific page under the first heading of the page. For example: .. code-block:: rst From 2b6341b6df297f5f5801222b0c9c8226b5722581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 19 Feb 2025 14:06:58 +0100 Subject: [PATCH 28/28] Add Allyson as contributor --- CONTRIBUTORS.yml | 7 +++++++ docs/commons/resources.rst | 1 + 2 files changed, 8 insertions(+) diff --git a/CONTRIBUTORS.yml b/CONTRIBUTORS.yml index 501512c..490681f 100644 --- a/CONTRIBUTORS.yml +++ b/CONTRIBUTORS.yml @@ -32,3 +32,10 @@ John Shepherdson: github: john-shepherdson orcid: 0000-0002-4402-9644 affiliation: CESSDA ERIC + +Allyson Lister: + first_name: Allyson + last_name: Lister + github: allysonlister + orcid: 0000-0002-7702-4495 + affiliation: University of Oxford diff --git a/docs/commons/resources.rst b/docs/commons/resources.rst index ca3fb86..dfa09aa 100644 --- a/docs/commons/resources.rst +++ b/docs/commons/resources.rst @@ -4,6 +4,7 @@ OSTrails Commons: Resources .. page-authors:: Daniel Garijo Marek Suchánek + Allyson Lister This page embodies the OSTrails Commons, a collection of reusable resource according to its structure as :ref:`components `.